23 March, 2013 9 Comments AUTHOR: elemarjr CATEGORIES: Sem categoria Tags: ,

Windows Native Programming - Mouse Down! Mouse Move!

Tempo de leitura: 1 minute

Olá. Tudo certo?!

Esta é uma série onde falo sobre desenvolvimento nativo, direto com a API do Windows e C++.

Até aqui tivemos:

  1. Copying files
  2. Window class, Window object, Message Loop, WndProc
  3. Menus

No post/exemplo de hoje, mostro os fundamentos para programação do Mouse.

Sobre o exemplo de hoje

Para demonstrar a programação com mouse, preparei um exemplo bem simples.

Mouse

 

O funcionamento do programa é simples:

  • Sempre que  o usuário clica com o botão direito, "limpo" a tela;
  • Sempre que o usuário pressiona o botão do mouse, registro sua posição;
  • Sempre que o usuário move o mouse com o botão pressionado, desenho uma linha entre a posição registrada e a posição atual do mouse.

Bem simples.

Código-fonte completo

Para facilitar o estudo, apresento o código-fonte completo:

#include  <Windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    PSTR szCmdLine,
    int iCmdShow
    )
{
    static TCHAR szAppName [] = TEXT("HelloMouse");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndClass;

    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hInstance = hInstance;
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = szAppName;

    if (!RegisterClass(&wndClass))
    {
        MessageBox(NULL, TEXT("Error registering class."), szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,
        TEXT("The Hello Mouse Native Programming"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
        );

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(
    HWND hwnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam
    )
{
    HDC hdc;

	static POINT mouseDownPosition;

    switch (message)
    {
	case WM_RBUTTONDOWN:
		InvalidateRect(hwnd, NULL, TRUE);
		return 0;
	case WM_LBUTTONDOWN:
		mouseDownPosition.x = LOWORD(lParam);
		mouseDownPosition.y = HIWORD(lParam);
		return 0;
	case WM_MOUSEMOVE:
		if (wParam & MK_LBUTTON)
		{
			hdc = GetDC(hwnd);
			MoveToEx(hdc, mouseDownPosition.x, mouseDownPosition.y, NULL);
			LineTo(hdc, LOWORD(lParam), HIWORD(lParam));
			ReleaseDC(hwnd, hdc);
		}
		return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

Entendendo o exemplo

Como pode ver, para cada "evento" com o mouse na janela, o Windows gera uma notificação em formato de mensagem.

A posição do mouse na janela é comunicada inteira dentro do parâmetro lParam. Outros parâmetros são informados dentro de rParam.

Simples e econômico. Não acha?!

Era isso.

9 Comments

  1. Alexsandro 3 years ago says:

    Curioso Elemar, pra executar este codigo, o que precisa? Iniciar um projeto C++ com MFC ou apenas um Win32 é o suficiente?

    Valew.

    Reply
  2. alexsandro_xpt 3 years ago says:

    Ahmmmm Elemar 🙂 consegui testar, tentei criar um projeto Win32 padrão mas vinha muita coisa junto dai apaguei ele, dai criei um projeto empty e coloquei seu codigo, não é que compilou sem problemas!!! 🙂

    Valew pela dica C++, tenho vontade de aprender C++ Win32, MFC e pra linux tambem, mas pra isto eu teria que aprender muito sobre os compiladores... e como isto nao é prioridade agora, entao sabe la quando aprenderia..

    Mas valew pelos exemplos que postam aqui, da pra aprender muita coisa =)

    Reply
    • elemarjr 3 years ago says:

      As vezes, o caminho mais simples é, mesmo, o caminho mais simples. 🙂

      Reply
      • alexsandro_xpt 3 years ago says:

        Sempre apanhei pra escolher estes tipos de projetos do VC++ rs.. tem um projeto la que você marca como ATL que eu não sei exatamente as diferenças e possibilidades.

        Reply

Trackbacks for this post

  1. MouseDown! MouseMove! usando MFC | Elemar DEV
  2. Windows Native Programming – GDI+ | Elemar DEV
  3. MouseDown! MouseMove! usando MFC | Elemar JR