Informática Numaboa - Tutoriais e Programação
Usando recursos (masm)
Qua 14 Jan 2009 17:12 |
- Detalhes
- Categoria: Assembly Numaboa (antigo oiciliS)
- Atualização: Domingo, 21 Junho 2009 18:44
- Autor: vovó Vicki
- Acessos: 13184
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:
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:
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:
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:
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.