A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Usando recursos (masm)

Qua

14

Jan

2009


17:12

(2 votos, média 5.00 de 5) 


Criando a janela

Como vamos precisar da função CreateWindowEx, não custa dar uma recapitulada:

HWND CreateWindowEx(
    DWORD dwExStyle, // estilo especial de janela
    LPCTSTR lpClassName, // ponteiro para a classe registrada
    LPCTSTR lpWindowName, // pointeiro para o nome da janela: NULL
    DWORD dwStyle, // estilo da janela
    int x, // posição horizontal da janela
    int y, // posição vertical da janela
    int nWidth, // largura da janela
    int nHeight, // altura da janela
    HWND hWndParent, // manipulador da janela-mãe ou proprietário da janela
    HMENU hMenu, // manipulador do menu ou identificador da janela-filha
    HINSTANCE hInstance, // manipulador da instância do aplicativo
    LPVOID lpParam // ponteiro para dados de criação da janela
);
  • dwExStyle: não usaremos um estilo especial - NULL.
  • lpClassName: o nome da classe está na variável ClasseAreaBMP - seu endereço será ADDR ClasseAreaBMP.
  • lpWindowName: a janela não precisa de título - usaremos NULL.
  • dwStyle: a composição do estilo será "Estilo Janela (WS) Filha" + "Estilo Janela (WS) Visível" + "Controle Estático (SS) com Bitmap" que é indicado com WS_CHILD or WS_VISIBLE or SS_BITMAP.
  • x e y: a posição horizontal e vertical do canto superior esquerdo da janela do controle dentro da janela-mãe - indicamos ambos como 20 pixels.
  • nWidth e nHeight: a largura e a altura da janela em pixels - indicamos temporariamente como 10. O porque do temporário será explicado logo adiante (4.4. Preparando a pintura).
  • hWndParent: o manipulador da janela-mãe - no nosso exemplo é o parâmetro hWnd do procedimento gerenteMensagem.
  • hMenu: não existe menu no controle, portanto NULL.
  • hInstance: o manipulador do módulo, mInstancia.
  • lpParam: não há dados na criação da janela - NULL.

Tudo em riba para podermos incluir a chamada à função que criará o controle com a área que deve conter o bitmap:

gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg == WM_CREATE invoke CreateWindowEx, NULL, ADDR ClasseAreaBMP, NULL, WS_CHILD or WS_VISIBLE or SS_BITMAP, 20, 20, 10, 10, hWnd, NULL, mInstancia, NULL ... .ELSEIF ...

A função CreateWindowEx retorna o valor do manipulador da janela em EAX. Precisaremos deste valor logo adiante, portanto, criaremos uma variável local e a inicializamos com o valor de retorno:

gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL mAreaBMP: DWORD .IF uMsg == WM_CREATE invoke CreateWindowEx, NULL, ADDR AreaBitmap, NULL, WS_CHILD or WS_VISIBLE or SS_BITMAP, 20, 20, 10, 10, hWnd, NULL, mInstancia, NULL mov mAreaBMP, eax ... .ELSEIF ...

Nosso bitmap está nos recursos e tem o identificador 760. Agora precisamos obter um manipulador para o bitmap para que possamos acessá-lo. Usamos a função LoadBitmap:

HBITMAP LoadBitmap(
    HINSTANCE hInstance, // manipulador da instância do aplicativo
    LPCTSTR lpBitmapName // endereço do nome do recurso bitmap
);

Da mesma forma que acima, precisamos de uma variável local que receba o manipulador:

gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL mAreaBMP: DWORD LOCAL mBMP: DWORD .IF uMsg == WM_CREATE invoke CreateWindowEx, NULL, ADDR AreaBitmap, NULL, WS_CHILD or WS_VISIBLE or SS_BITMAP, 20, 20, 10, 10, hWnd, NULL, mInstancia, NULL mov mAreaBMP, eax invoke LoadBitmap, mInstancia, 760 mov mBMP, eax ... .ELSEIF ...

O sistema possui um "pintor" de plantão que pode ser acionado sempre que necessário. Basta enviar uma mensagem com os dados necessários para que ele possa trabalhar. A função SendMessage envia a mensagem especificada para uma ou mais janelas. Esta função chama o gerente de mensagens do(s) destinatário(s) e não retorna enquanto o pedido não for integralmente realizado.

LRESULT SendMessage(
    HWND hWnd, // manipulador da janela destino
    UINT Msg, // mensagem a ser enviada
    WPARAM wParam, // primeiro parâmetro da mensagem
    LPARAM lParam // segundo parâmetro da mensagem
);
  • hWnd: nossa janela destino é a janela do controle com a área que foi preparada para receber o bitmap - mAreaBMP.
  • Msg: a mensagem é dirigida a um controle estático (STatic control Message), ou seja, do tipo STM_ alguma coisa. As mensagens que existem são STM_GETICON, STM_SETICON, STM_GETIMAGE e STM_SETIMAGE. Obviamente é da STM_SETIMAGE que estamos precisando.
  • wParam: o primeiro parâmetro de uma mensagem do tipo STM_SETIMAGE refere-se ao tipo de imagem e pode ser IMAGE_BITMAP, IMAGE_CURSOR, IMAGE_ENHMETAFILE e IMAGE_ICON. O tipo da nossa imagem é IMAGE_BITMAP.
  • lParam: o segundo parâmetro da mensagem STM_SETIMAGE refere-se ao manipulador da imagem. No nosso caso, mBMP.

Vamos enviar nossa mensagem com:

gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL mAreaBMP: DWORD LOCAL mBMP: DWORD .IF uMsg == WM_CREATE invoke CreateWindowEx, NULL, ADDR AreaBitmap, NULL, WS_CHILD or WS_VISIBLE or SS_BITMAP, 20, 20, 10, 10, hWnd, NULL, mInstancia, NULL mov mAreaBMP, eax invoke LoadBitmap, mInstancia, 760 mov mBMP, eax invoke SendMessage, mAreaBMP, STM_SETIMAGE, IMAGE_BITMAP, mBMP .ELSEIF ...

Você ainda se lembra de que dimensionamos nosso controle para ter 10 x 10 pixels? Nosso gráfico tem 255 x 185 pixels. Vai faltar pixel para abrigar o gráfico inteiro - problema do "pintor" de plantão. Como enviamos as coordenadas da posição do controle estático, o "pintor" vai transferindo a sequência de pixels que ele encontrar nos recursos e "estica" o controle para fazer espaço para o gráfico. Tão simples assim... mas precisamos saber disso para que o gráfico não avance sobre outros controles desformatando nosso layout.

Informações adicionais