Ir ao conteúdo
  • Cadastre-se

C++ Como fazer um programa que inverte as cores em c++


Visitante

Posts recomendados

Olá, Eu preciso que vocês me digam como eu vou fazer um programa que inverte as cores da tela do computador em c++ igual como o virus MEMZ

faz.

 

Eu pesquisei como que eu fazia no google, mas eu não achei o que eu queria, até encontrei um tópico aqui no Clube do Hardware,

mas ele era de inverter as cores de uma imagem, que não era o que eu queria.

 

O Payload da inversão das cores do MEMZ:

 

maxresdefault.jpg

 

//O Que eu coloco a mais aqui?
#include <stdio.h>
  
int main(){
	//Agora o que eu coloco aqui para inverter as cores?
}

 

Link para o comentário
Compartilhar em outros sites

@Arthur160 

Eu posso te dar uma ideia de como fazer usando a API do Windows.

Pelo o que vi a ordem é:

  • GetDC() recupera um identificador para um device context (DC). Se o argumento for NULL, a função recupera o DC para a tela inteira;
  • CreateCompatibleDC() cria um DC compatível com o DC da tela;
  • CreateCompatibleBitmap() cria um bitmap compatível com o DC da tela;
  • SelectObject() seleciona o bitmap compatível no DC compatível;
  • BitBlt() transfere um retângulo de pixels do DC da tela para o DC compatível. Se o último argumento for NOTSRCCOPY, a função copia o retângulo com as cores invertidas;
  • SelectObject() tira de seleção o bitmap compatível do DC compatível;
  • DeleteDC() deleta o DC compatível, considerando que foi usada a função CreateCompatibleDC() para criá-lo;
  • ReleaseDC() libera o DC da tela, considerando que foi usada a função GetDC() para recuperá-lo;

  • DeleteObject() deleta o bitmap caso não nos sirva mais.

Um exemplo:

#include <stdio.h>
#include <windows.h>

void CapturaCorInvertida(void)
{
    int x1 = GetSystemMetrics(SM_XVIRTUALSCREEN);
    int y1 = GetSystemMetrics(SM_YVIRTUALSCREEN);
    int x2 = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    int y2 = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    int w = x2 - x1;
    int h = y2 - y1;

    HDC telaDC = GetDC(NULL);
    HDC compDC = CreateCompatibleDC(telaDC);
    HBITMAP btm = CreateCompatibleBitmap(telaDC, w, h);
    HGDIOBJ obj = SelectObject(compDC, btm);
    BOOL ret = BitBlt(compDC, 0, 0, w, h, telaDC, x1, y1, NOTSRCCOPY);

    // Salvando para a area de transferencia
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, btm);
    CloseClipboard();

    // Deletando e liberando
    SelectObject(compDC, obj);
    DeleteDC(compDC);
    ReleaseDC(NULL, telaDC);
    DeleteObject(btm);
}

int main()
{
    Sleep(500);
    CapturaCorInvertida();
    return 0;
}

Tente rodar isso e dar ctrl + v no Paint por exemplo (talvez tenha que incluir -lgdi32 no linker options dependendo do IDE) :)

Em aplicativo gráfico do Windows, você pode chamar CreateWindow() e usar o estilo SS_BITMAP para que o bitmap seja exibido no controle estático.

Daí vai da sua imaginação... Dá uma olhada aqui pra começar.

 

edit:
Só agora vi que é C++. Aliás...

4 horas atrás, Arthur160 disse:
//O Que eu coloco a mais aqui?
#include <stdio.h>
  
int main(){
	//Agora o que eu coloco aqui para inverter as cores?
}

Isso não é C++ 🤪

Talvez tudo o que eu escrevi nessa postagem seja novo pra você, dê uma pesquisada, eu anexei links para as documentações, é só clicar no nome das funções...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

19 horas atrás, Arthur160 disse:

Olá, Eu preciso que vocês me digam como eu vou fazer um programa que inverte as cores da tela do computador em c++ igual como o virus MEMZ

faz.

 

Na imagem que mostrou fica claro que as cores sequer são invertidas. Talvez pudesse explicar melhor o que quer fazer. 

Se pretende mudar o desktop todo e não a tela do seu programa tem muitas coisas mais para resolver, como privilégios de acesso.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

34 minutos atrás, arfneto disse:

Na imagem que mostrou fica claro que as cores sequer são invertidas. Talvez pudesse explicar melhor o que quer fazer.

Na realidade MEMZ inverte a cor da tela em certo ponto, e isso fica em loop. Dá uma olhada nesse vídeo (minuto 2:40):

 

Bem, sobre o que eu havia postado:

16 horas atrás, Lucca Rodrigues disse:

Em aplicativo gráfico do Windows, você pode chamar CreateWindow() e usar o estilo SS_BITMAP para que o bitmap seja exibido no controle estático.

Eu fiz aqui pra testar.

@Arthur160 Basta fazer com que CapturaCorInvertida() retorne HBITMAP, e daí pode chamar CreateWindowW()SendMessage(). Também chamei ShowWindow() pra maximizar a tela:

inverter.gif.91c3fbad5369c17dcb9f205b841ebccd.gif

  • Curtir 2
  • Amei 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, Lucca Rodrigues disse:

Na realidade MEMZ inverte a cor da tela em certo ponto, e isso fica em loop

 

:D Entendo, @Lucca Rodrigues, e agradeço a atenção em ilustrar melhor a parada. O que eu quiz dizer é que a realidade não tem a ver com o título nem com o efeito na (única) figura. E acho que o autor pode muitas vezes fazer algo mais para ilustrar a questão. Claro que eu poderia ter ido atrás disso, mas optei por não fazer, em uma questão que nada tem de código e tem um título distante do sentido. :) 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Arthur160 O que eu postei era só um exemplo de como capturar a tela com as cores invertidas.

Como eu havia dito:

Em 22/01/2022 às 23:09, Lucca Rodrigues disse:

Em aplicativo gráfico do Windows, você pode chamar CreateWindow() e usar o estilo SS_BITMAP para que o bitmap seja exibido no controle estático.

Daí vai da sua imaginação... Dá uma olhada aqui pra começar.

Quem vem ao fórum tem que estar disposto a se esforçar um pouco também, não é nada muito complicado, dá uma lida na documentação :D

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues

 

Eu não consigo ultilizar a função CreateWIndowW porque dá esse erro:

 

In file included from C:/MinGW/x86_64-w64-mingw32/include/windows.h:72,
                 from vtmuv.cpp:1:
vtmuv.cpp: In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':
vtmuv.cpp:85:10: error: expression list treated as compound expression in initia
lizer [-fpermissive]
     HWND CreateWindowW(
                  ^~~~~~~~~~~~~
vtmuv.cpp:85:10: error: invalid conversion from 'int' to 'HWND' {aka 'HWND__*'}
[-fpermissive]

 

Link para o comentário
Compartilhar em outros sites

#include <windows.h>
#include <winuser.h>
#include <stdio.h>

const char g_szClassName[] = "ClassedaJanela";

void CapturaCorInvertida(void)
{
    int x1 = GetSystemMetrics(SM_XVIRTUALSCREEN);
    int y1 = GetSystemMetrics(SM_YVIRTUALSCREEN);
    int x2 = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    int y2 = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    int w = x2 - x1;
    int h = y2 - y1;

    HDC telaDC = GetDC(NULL);
    HDC compDC = CreateCompatibleDC(telaDC);
    HBITMAP btm = CreateCompatibleBitmap(telaDC, w, h);
    HGDIOBJ obj = SelectObject(compDC, btm);
    BOOL ret = BitBlt(compDC, 0, 0, w, h, telaDC, x1, y1, NOTSRCCOPY);

    // Salvando para a area de transferencia
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, btm);
    CloseClipboard();

    // Deletando e liberando
    SelectObject(compDC, obj);
    DeleteDC(compDC);
    ReleaseDC(NULL, telaDC);
    DeleteObject(btm);
}

int main()
{
    Sleep(500);
    CapturaCorInvertida();
    return 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "BasicWindow";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    HWND CreateWindowW(
  		"BasicWindow",
  		L"MEMZ",
  		WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_BORDER,
  		0,
  		0,
  		1366,
  		768,
  		0,
		0,
  		hInstance,
  		0);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "MEMZ",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

 

Link para o comentário
Compartilhar em outros sites

@Arthur160 CreateWindowW() retorna um identificador para a janela criada (HWND).

28 minutos atrás, Arthur160 disse:
    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "MEMZ",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

Acredito que esse `hwnd` receberia o retorno da função:

hwnd = CreateWindowW(...);

Assim é verificado se deu problema na criação da janela depois que a função foi chamada.

 

Aliás, WinMain() é a função principal de qualquer aplicativo do Windows, esqueça main().

 

E como eu havia dito:

Em 23/01/2022 às 15:28, Lucca Rodrigues disse:

Basta fazer com que CapturaCorInvertida() retorne HBITMAP

Você não quer mais salvar o bitmap para a área de transferência, e nem deletar o bitmap como é feito com DeleteObject().

Você precisa que a função retorne HBITMAP pra que você possa chamar CreateWindowW() e SendMessage() na WndProc(). Você pode fazer isso através da mensagem WM_CREATE.

 

28 minutos atrás, Arthur160 disse:
    HWND CreateWindowW(
  		"BasicWindow",
  		L"MEMZ",

Coloque um L antes de "BasicWindow" para que seja uma string de wchar_t.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

                                              

 

 

 

 

 

 

________________________________________________________________________

Agora deu mais um erro:

 

In file included from C:/MinGW/x86_64-w64-mingw32/include/windows.h:72,
                 from vtmuv.cpp:1:
vtmuv.cpp: In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':
vtmuv.cpp:69:10: error: expression list treated as compound expression in initia
lizer [-fpermissive]
     HWND CreateWindowW(
          ^~~~~~~~~~~~~
vtmuv.cpp:69:10: error: invalid conversion from 'int' to 'HWND' {aka 'HWND__*'}
[-fpermissive]
vtmuv.cpp:82:5: error: 'bk' was not declared in this scope
     bk = CreateWindowW(
     ^~
In file included from C:/MinGW/x86_64-w64-mingw32/include/windows.h:72,
                 from vtmuv.cpp:1:
vtmuv.cpp:82:10: error: 'CreateWindowExW' cannot be used as a function
     bk = CreateWindowW(
          ^~~~~~~~~~~~~

Link para o comentário
Compartilhar em outros sites

@Arthur160 entendeu que estava errado como escreveu? Talvez deva pesquisar um pouco sobre a diferença entre uma aplicação desktop e uma aplicação para console

 

3 horas atrás, Arthur160 disse:

Agora deu mais um erro:

 

Poste o código.

 

Deve imaginar que não deve ter nada errado em windows.h já que é usado toda hora há décadas, certo?

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

#include <windows.h>
#include <winuser.h>
#include <stdio.h>
#define WM_CREATE                       0x0001

const char g_szClassName[] = "ClassedaJanela";

void CapturaCorInvertida(void)
{
    int x1 = GetSystemMetrics(SM_XVIRTUALSCREEN);
    int y1 = GetSystemMetrics(SM_YVIRTUALSCREEN);
    int x2 = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    int y2 = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    int w = x2 - x1;
    int h = y2 - y1;

    HDC telaDC = GetDC(NULL);
    HDC compDC = CreateCompatibleDC(telaDC);
    HBITMAP btm = CreateCompatibleBitmap(telaDC, w, h);
    HGDIOBJ obj = SelectObject(compDC, btm);
    BOOL ret = BitBlt(compDC, 0, 0, w, h, telaDC, x1, y1, NOTSRCCOPY);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
	Sleep(500);
    CapturaCorInvertida();
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "BasicWindow";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    HWND CreateWindowW(
  		L"BasicWindow",
  		L"MEMZ",
  		WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_BORDER,
  		0,
  		0,
  		1366,
  		768,
  		0,
		0,
  		hInstance,
  		0);

    bk = CreateWindowW(
  		L"BasicWindow",
  		L"MEMZ",
  		WS_CHILD | WS_VISIBLE | SS_BITMAP,
  		0,
  		0,
  		1366,
  		768,
  		0,
		0,
  		hwnd,
  		0);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "MEMZ",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    BOOL ShowWindow(
		  HWND hWnd,
		  int  nCmdShow
	);

    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

 

Link para o comentário
Compartilhar em outros sites

@Arthur160 Bom colega, nada te impede de pesquisar um exemplo de como criar uma janela com uma imagem, e de preferência em inglês pra ter mais resultados 🤪.

O exemplo nesse link expressa bem o que quis dizer na postagem anterior.

O autor criou uma tal LoadMyImage() só pra chamar LoadImageW(), pra mim não fez muito sentido isso, e de qualquer forma você não precisa dessa função, CapturaCorInvertida() deve te retornar o bitmap.

Aliás...

56 minutos atrás, Arthur160 disse:
void CapturaCorInvertida(void)

Nada de void, retorne o bitmap criado pela função...

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Lucca, E Agora o que eu coloco no caminho da imagem?

 

#include <windows.h>
#include <winuser.h>
#include <stdio.h>
#define WM_CREATE                       0x0001

const char g_szClassName[] = "ClassedaJanela";

int CapturaCorInvertida()
{
    int x1 = GetSystemMetrics(SM_XVIRTUALSCREEN);
    int y1 = GetSystemMetrics(SM_YVIRTUALSCREEN);
    int x2 = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    int y2 = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    int w = x2 - x1;
    int h = y2 - y1;

    HDC telaDC = GetDC(NULL);
    HDC compDC = CreateCompatibleDC(telaDC);
    HBITMAP btm = CreateCompatibleBitmap(telaDC, w, h);
    HGDIOBJ obj = SelectObject(compDC, btm);
    BOOL ret = BitBlt(compDC, 0, 0, w, h, telaDC, x1, y1, NOTSRCCOPY);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    
    HWND hsti;

    switch(msg) {

        case WM_CREATE:
    
            LoadMyImage();
            hsti = CreateWindowW(L"Static", L"", 
                WS_CHILD | WS_VISIBLE | SS_BITMAP,
                0, 0, WindowX(), WindowY(), hwnd, (HMENU) 1, NULL, NULL);

            SendMessage(hsti, STM_SETIMAGE,
                (WPARAM) IMAGE_BITMAP, (LPARAM) hBitmap); 
            break;

        case WM_DESTROY:

            DeleteObject(hBitmap);
            PostQuitMessage(0);
            break;
    }

    return DefWindowProcW(hwnd, msg, wParam, lParam);
}

void LoadMyImage(void) {

    hBitmap = LoadImageW(NULL, L"", IMAGE_BITMAP,
        0, 0, LR_LOADFROMFILE);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
	Sleep(500);
    CapturaCorInvertida();
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "BasicWindow";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    HWND CreateWindowW(
  		L"BasicWindow",
  		L"MEMZ",
  		WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_BORDER,
  		0,
  		0,
  		1366,
  		768,
  		0,
		0,
  		hInstance,
  		0);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "MEMZ",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    BOOL ShowWindow(
		  HWND hWnd,
		  int  nCmdShow
	);

    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

 

Link para o comentário
Compartilhar em outros sites

@Arthur160

Em 26/01/2022 às 20:19, Lucca Rodrigues disse:

CapturaCorInvertida() deve te retornar o bitmap.

Aliás...

Em 26/01/2022 às 19:20, Arthur160 disse:
void CapturaCorInvertida(void)

Nada de void, retorne o bitmap criado pela função...

Nada de void, nada de int :D

O bitmap é criado com CreateCompatibleBitmap(), o retorno é atribuído `btm` que é HBITMAP. Você precisa retornar o bitmap.

Pode criar um HBITMAP global e chamar CapturaCorInvertida() no início da WinMain() mesmo, atribuindo o retorno da função à variável global.

Esqueça LoadMyImage()...

Em 26/01/2022 às 20:19, Lucca Rodrigues disse:

O autor criou uma tal LoadMyImage() só pra chamar LoadImageW(), pra mim não fez muito sentido isso, e de qualquer forma você não precisa dessa função

Aliás, depois de CreateWindowW() e SendMessage() que chamou pra criar a janela com o bitmap na WndProc(), pode chamar SetWindowLong() com os argumentos GWL_STYLE (pra definir um novo estilo de janela) e WS_POPUP.

Chame também ShowWindow() se pretende maximizar a janela.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...

Deu mais um erro:

 

warning: built-in function 'y1' declared as non-function [-Wbuiltin-declaration-mismatch]
 int y1 = GetSystemMetrics(SM_YVIRTUALSCREEN);
     ^~
In file included from C:/MinGW/x86_64-w64-mingw32/include/windows.h:72,
                 from InvertColors.cpp:1:
InvertColors.cpp: In function 'LRESULT WndProc(HWND, UINT, WPARAM, LPARAM)':
InvertColors.cpp:26:45: error: cannot convert 'HBITMAP' {aka 'HBITMAP__*'} to 'LPCWSTR' {aka 'const wchar_t*'}
             hsti = CreateWindowW(L"Static", btm,
                                             ^~~
C:/MinGW/x86_64-w64-mingw32/include/winuser.h:2138:86: note:   initializing argument 3 of 'HWND__* CreateWindowExW(DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)'
   WINUSERAPI HWND WINAPI CreateWindowExW(DWORD dwExStyle,LPCWSTR lpClassName,LPCWSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam);
                                                                              ~~~~~~~~^~~~~~~~~~~~
InvertColors.cpp:31:49: error: 'hBitmap' was not declared in this scope
                 (WPARAM) IMAGE_BITMAP, (LPARAM) hBitmap);
                                                 ^~~~~~~
In file included from C:/MinGW/x86_64-w64-mingw32/include/windows.h:72,
                 from InvertColors.cpp:1:
InvertColors.cpp: In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':
InvertColors.cpp:72:10: error: expression list treated as compound expression in initializer [-fpermissive]
     HWND CreateWindowW(
          ^~~~~~~~~~~~~
InvertColors.cpp:72:10: error: invalid conversion from 'int' to 'HWND' {aka 'HWND__*'} [-fpermissive]

 

E o Código:

#include <windows.h>
#include <winuser.h>
#include <stdio.h>

const char g_szClassName[] = "ClassedaJanela";

int x1 = GetSystemMetrics(SM_XVIRTUALSCREEN);
int y1 = GetSystemMetrics(SM_YVIRTUALSCREEN);
int x2 = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int y2 = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int w = x2 - x1;
int h = y2 - y1;
HDC telaDC = GetDC(NULL);
HDC compDC = CreateCompatibleDC(telaDC);
HBITMAP btm = CreateCompatibleBitmap(telaDC, w, h);
HGDIOBJ obj = SelectObject(compDC, btm);
BOOL ret = BitBlt(compDC, 0, 0, w, h, telaDC, x1, y1, NOTSRCCOPY);

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    HWND hsti;

    switch(msg) {

        case WM_CREATE:
    
            hsti = CreateWindowW(L"Static", btm, 
                WS_CHILD | WS_VISIBLE | SS_BITMAP,
                0, 0, 1366, 768, hwnd, (HMENU) 1, NULL, NULL);

            SendMessage(hsti, STM_SETIMAGE,
                (WPARAM) IMAGE_BITMAP, (LPARAM) hBitmap); 
            break;

        case WM_DESTROY:

            DeleteObject(hBitmap);
            PostQuitMessage(0);
            break;
    }

    return DefWindowProcW(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
	Sleep(500);
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "BasicWindow";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    HWND CreateWindowW(
  		L"BasicWindow",
  		L"MEMZ",
  		WS_POPUP | WS_VISIBLE | WS_BORDER,
  		0,
  		0,
  		1366,
  		768,
  		0,
		0,
  		hInstance,
  		0);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "MEMZ",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    BOOL ShowWindow(
		  HWND hWnd,
		  int  nCmdShow
	);

    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

 

Link para o comentário
Compartilhar em outros sites

@Arthur160

31 minutos atrás, Arthur160 disse:
            hsti = CreateWindowW(L"Static", btm, 
                WS_CHILD | WS_VISIBLE | SS_BITMAP,
                0, 0, 1366, 768, hwnd, (HMENU) 1, NULL, NULL);

O segundo parâmetro de CreateWindowW() é o nome da janela, você não vai passar `btm` pra essa função.

29 minutos atrás, Arthur160 disse:
            SendMessage(hsti, STM_SETIMAGE,
                (WPARAM) IMAGE_BITMAP, (LPARAM) hBitmap);

Em nenhum lugar você declarou hBitmap, isso é algo que você esqueceu de alterar.

E parece que apagou a CapturaCorInvertida() e deixou tudo global sem necessidade.

Em 02/02/2022 às 18:55, Lucca Rodrigues disse:

O bitmap é criado com CreateCompatibleBitmap(), o retorno é atribuído `btm` que é HBITMAP. Você precisa retornar o bitmap.

Entendeu o que "retornar o bitmap" significa?

#include <stdio.h>

int main()
{
    printf("Hello World");

    return 0;
}

Nesse código, que valor main() retorna? 0. De que tipo? int.

main() retorna um inteiro: int main().

Agora faça CapturaCorInvertida() retornar HBITMAP, mais especificamente `btm`.

Pode chamar a função como último argumento de SendMessage() no lugar de hBitmap.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Deu mais um erro:

 

InvertColors.cpp:8:5: warning: built-in function 'y1' declared as non-function [-Wbuiltin-declaration-mismatch]
 int y1 = GetSystemMetrics(SM_YVIRTUALSCREEN);
     ^~
InvertColors.cpp: In function 'int CapturaTelaInvertida()':
InvertColors.cpp:20:12: error: invalid conversion from 'HBITMAP' {aka 'HBITMAP__*'} to 'int' [-fpermissive]
     return btm;
            ^~~
InvertColors.cpp: In function 'LRESULT WndProc(HWND, UINT, WPARAM, LPARAM)':
InvertColors.cpp:40:46: error: invalid conversion from 'int' to 'HGDIOBJ' {aka 'void*'} [-fpermissive]
             DeleteObject(CapturaTelaInvertida());
                          ~~~~~~~~~~~~~~~~~~~~^~
In file included from C:/MinGW/x86_64-w64-mingw32/include/windows.h:71,
                 from InvertColors.cpp:1:
C:/MinGW/x86_64-w64-mingw32/include/wingdi.h:2722:49: note:   initializing argument 1 of 'WINBOOL DeleteObject(HGDIOBJ)'

   WINGDIAPI WINBOOL WINAPI DeleteObject(HGDIOBJ ho);
                                         ~~~~~~~~^~
In file included from C:/MinGW/x86_64-w64-mingw32/include/windows.h:72,
                 from InvertColors.cpp:1:
InvertColors.cpp: In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':
InvertColors.cpp:76:10: error: expression list treated as compound expression in initializer [-fpermissive]
     HWND CreateWindowW(
          ^~~~~~~~~~~~~
InvertColors.cpp:76:10: error: invalid conversion from 'int' to 'HWND' {aka 'HWND__*'} [-fpermissive]


E o código:

#include <windows.h>
#include <winuser.h>
#include <stdio.h>

const char g_szClassName[] = "ClassedaJanela";

int x1 = GetSystemMetrics(SM_XVIRTUALSCREEN);
int y1 = GetSystemMetrics(SM_YVIRTUALSCREEN);
int x2 = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int y2 = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int w = x2 - x1;
int h = y2 - y1;

int CapturaTelaInvertida(){
    HDC telaDC = GetDC(NULL);
    HDC compDC = CreateCompatibleDC(telaDC);
    HBITMAP btm = CreateCompatibleBitmap(telaDC, w, h);
    HGDIOBJ obj = SelectObject(compDC, btm);
    BOOL ret = BitBlt(compDC, 0, 0, w, h, telaDC, x1, y1, NOTSRCCOPY);
    return btm;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    HWND hsti;

    switch(msg) {

        case WM_CREATE:
    
            hsti = CreateWindowW(L"Static", L"", 
                WS_CHILD | WS_VISIBLE | SS_BITMAP,
                0, 0, 1366, 768, hwnd, (HMENU) 1, NULL, NULL);

            SendMessage(hsti, STM_SETIMAGE,
                (WPARAM) IMAGE_BITMAP, (LPARAM) CapturaTelaInvertida()); 
            break;

        case WM_DESTROY:

            DeleteObject(CapturaTelaInvertida());
            PostQuitMessage(0);
            break;
    }

    return DefWindowProcW(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
	Sleep(500);
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "BasicWindow";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    HWND CreateWindowW(
  		L"BasicWindow",
  		L"MEMZ",
  		WS_POPUP | WS_VISIBLE | WS_BORDER,
  		0,
  		0,
  		1366,
  		768,
  		0,
		0,
  		hInstance,
  		0);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "MEMZ",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    BOOL ShowWindow(
		  HWND hWnd,
		  int  nCmdShow
	);

    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!