Elemar DEV

Tecnologia e desenvolvimento

Windows Native Programming – Mouse Down! Mouse Move!

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.

8 comentários em “Windows Native Programming – Mouse Down! Mouse Move!

  1. Alexsandro
    23/03/2013

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

    Valew.

  2. Pingback: MouseDown! MouseMove! usando MFC | Elemar DEV

  3. alexsandro_xpt
    24/03/2013

    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 =)

    • elemarjr
      24/03/2013

      As vezes, o caminho mais simples é, mesmo, o caminho mais simples. :)

      • alexsandro_xpt
        24/03/2013

        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.

  4. Pingback: Windows Native Programming – GDI+ | Elemar DEV

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Informação

Publicado às 23/03/2013 por em Post e marcado , .

Estatísticas

  • 655,253 hits
%d blogueiros gostam disto: