C e Win32 API
C e Win32 API
Pgina em branco
Programao Windows:
C e Win32 API com
nfase em Multimdia
Andr Kishimoto
Pgina em branco
Andr Kishimoto
Programao Windows:
C e Win32 API com
nfase em Multimdia
So Paulo, 2006
1a edio
ISBN 85-906129-1-0
Andr Kishimoto
[email protected]
http://www.tupinihon.com
Pgina em branco
Agradecimentos
Agradeo meus pais e minha famlia, por sempre terem me apoiado e
pelas oportunidades que sempre me deram durante minha vida. Sou muito
grato por ter um grande amor na minha vida, Natlia, que sempre foi amiga e
companheira, nos nossos momentos mais felizes e mesmo durante as nossas
brigas. Agradeo tambm meus ex-professores dson Rego Barros e Srgio
Vicente Pamboukian, por proporem tarefas onde pude aplicar meus
conhecimentos que so demonstrados nesse trabalho e por darem a idia e
incentivo a escrever um livro sobre programao grfica; amigos e colegas que
apoiaram meu trabalho e que sempre ajudaram na medida do possvel, e os
profissionais e hobbyistas da rea que compartilham seus conhecimentos,
atravs de livros, artigos e Internet. todos vocs, sou muito grato pela ajuda e
fora que sempre me deram.
Pgina em branco
Sobre o Autor
Andr Kishimoto comeou a programar quando tinha 12 anos,
desenvolvendo pequenos programas em Basic e PCBoard Programming Language
(sistema para gerenciamento de BBSs). Desde o incio da sua jornada autodidata pela programao, sempre teve interesse em multimdia, criando
animaes em ASCII e ANSI tanto em Basic quanto em Clipper. Aps alguns
anos, aprendeu a trabalhar no modo 13h (VGA) via Pascal ponto de partida
para usar imagens mais sofisticadas e a ter interesse em aprender a programar
em linguagem C e C++.
Especialista em Computao Grfica (SENAC-SP) e bacharel em
Cincia da Computao (Universidade Presbiteriana Mackenzie), desenvolveu
advergames e jogos para dispositivos mveis Java, Brew, iOS e Android.
Atualmente programador snior da Electronic Arts e professor de
Jogos Digitais da Universidade Cruzeiro do Sul.
Pgina em branco
Pgina em branco
Sumrio
Introduo
Convenes utilizadas no livro
O que voc precisa saber
O que voc ir aprender
Recursos necessrios
1
2
3
3
4
Captulo 1 Iniciando
Win32 API, Platform SDK, MFC???
Notao hngara e nomenclatura de variveis
Seu primeiro programa
A #include <windows.h>
Entendendo o programa
A caixa de mensagem
5
5
6
8
9
10
12
15
15
20
21
25
28
38
41
42
42
45
46
46
54
57
62
63
74
75
82
82
85
87
89
91
91
94
95
99
100
103
111
117
118
121
123
123
125
125
127
128
130
133
137
140
142
143
146
Captulo 6 Bitmaps
O que so bitmaps?
Bitmaps no Windows: DDB e DIB
Carregando bitmaps
Obtendo informaes de um bitmap
DC de memria
DC particular de um programa
Mostrando bitmaps
Mostrando bitmaps invertidos
DIB Section
148
148
150
151
153
154
157
157
161
164
166
Captulo 7 Regies
O que so regies?
Criando regies
Desenhando regies
Operaes com regies
Regies de corte
Criando janelas no-retangulares
170
170
170
171
173
175
177
181
181
182
183
185
188
189
193
193
195
195
197
198
199
201
203
205
208
Bibliografia
209
ndice Remissivo
210
Pgina em branco
Introduo
Introduo
A idia de escrever um livro sobre programao Windows teve incio
em 2002, durante uma aula de Estrutura de Dados na faculdade. Nessa aula,
todos os alunos tinham que entregar um trabalho sobre implementao de
filas, e o projeto consistia em implementar uma simulao de fbrica: quando o
usurio quisesse, o programa deveria criar diferentes tipos de matria-prima,
que seriam processados por uma suposta mquina, na qual, dependendo da
matria-prima que fosse processada, um produto diferente seria criado.
Nesse trabalho, o professor nos tinha dado total liberdade sobre a
implementao visual, desde que o programa executasse o que fora pedido.
Durante a entrega, todos estavam curiosos em saber como cada um tinha
implementado sua fbrica de produtos. Estvamos no segundo semestre, e o
que tnhamos aprendido na faculdade at ento era o bsico da programao
em C. Como sempre, havia alguns alunos com mais conhecimento que outros,
e muitos trabalhos entregues eram interessantes porm, todos feitos em
modo texto. O nico trabalho em modo grfico tinha sido o meu (um ano
antes de entrar para a faculdade, eu j havia iniciado meus estudos em
programao C e Windows), e todos ficaram surpresos quando viram o
trabalho, inclusive o professor.
Na ocasio, conversei com o professor sobre escrever uma biblioteca
grfica e junto anexar um documento sobre como utilizar as funes da
biblioteca. Ele, me dando o conselho que seria interessante liberar o cdigofonte, e no apenas criar uma biblioteca com a descrio das funes, sugeriu
que eu pensasse na idia de escrever um livro sobre programao grfica para
Windows. Era algo que eu nunca havia pensado, e essa idia me fez imaginar
como seria o trabalho de escrever um livro, as dificuldades, o que traria de
benefcio para mim e como o livro ajudaria as pessoas.
Embora ele no tinha me desafiado, eu aceitei a idia como um desafio.
Escrever um livro sobre programao Windows. Comecei a esboar as
primeiras pginas do futuro livro nas semanas seguintes, pedindo sugestes e
dicas para o professor (que co-autor dos livros Delphi para Universitrios e
C++ Builder para Universitrio, ambos lanados pela editora Pginas e Letras).
Na poca, por diversos motivos, acabei desistindo da idia de escrever o livro.
Foi aps um ano, ento, que voltei com a idia; dessa vez, para concretiz-la.
Introduo
Partes de cdigo de programao ou mesmo listagem de cdigofonte de programas-exemplos aparecem como abaixo:
#include <stdio.h>
void main(void)
{
printf(Texto exemplo\n);
}
Avisos:
-
demonstraes com exemplos prticos (programas que encontram-se no CDROM). Com os exemplos, voc ir construir pequenos programas a cada
captulo, exercitando diferentes funes de um programa multimdia Windows.
Recursos necessrios
Para criar os programas-exemplo desse livro ser necessrio ter um
compilador C/C++ 32-bit que crie arquivos executveis para Windows
instalado no computador. Existem diversos compiladores no mercado, tais
como Dev-C++, lcc-Win32, Inprise/Borland C++ Builder e Microsoft Visual
C++. Escolha um que voc se adapte melhor.
Dica: lembre-se de consultar o manual ou ajuda do compilador/ambiente
de programao que voc estiver trabalhando, pois aprender a usar as
ferramentas ir ajudar bastante e lhe salvar de futuras dores de cabea.
Os programas-exemplo necessitam do sistema operacional Microsoft
Windows 95 ou superior para serem executados, requerendo as mesmas
configuraes que os compiladores exigem do computador.
Nota: os programas-exemplo do livro foram criados com o Microsoft
Visual C++.Net 2002 e testados sob o sistema operacional Microsoft
Windows XP Professional, porm eles podem ser editados e compilados
em qualquer outro compilador para Windows 32-bit.
Captulo 1 Iniciando
Captulo 1 Iniciando
A criao de programas para Windows um pouco diferente da
programao de aplicativos console para MS-DOS, sendo primeira vista algo
mais complexo, pois o prprio Windows em si um sistema mais complexo e
avanado que o MS-DOS.
O Windows executa os programas atravs do processamento de
mensagens, que ocorre da seguinte maneira: o programa que est sendo
executado aguarda o recebimento de uma mensagem do Windows e quando o
mesmo recebe a mensagem (por uma funo especial do Windows), espera-se
que o programa execute alguma ao para processar essa mensagem.
Existem diversas mensagens que o Windows pode enviar ao programa;
por exemplo, quando o usurio modifica o tamanho da janela do programa,
um clique no boto do mouse, a finalizao do programa, enfim, para cada
ao realizada pelo usurio (e conseqentemente pelo Windows), uma
mensagem enviada para o programa processar. Obviamente, no toda
mensagem que dever ser processada; se o seu programa utilizar somente o
teclado, podemos descartar todas as mensagens enviadas sobre as aes do
mouse.
Nota: na programao Windows, o sistema quem inicia a interao com
seu programa (ao contrrio do que ocorre em programas MS-DOS) e
apesar de ser possvel fazer chamadas de funes da Win32 API em
resposta a uma mensagem, ainda o Windows quem inicia a atividade.
Captulo 1 Iniciando
Tipo de dado
b,f
by
c
cx,cy
dw
fn
h
i
l
lp
msg
n
s
sz,str
w
x,y
Captulo 1 Iniciando
A #include <windows.h>
Para que voc possa comear a criar um programa para Windows, o
primeiro passo a ser feito incluir o arquivo de cabealho windows.h no seu
programa. Esse arquivo de cabealho contm definies, macros e estruturas
para escrever cdigos portveis entre as verses do Microsoft Windows.
Ao visualizar o cdigo-fonte dos cabealhos que so inclusos junto
com o windows.h, podemos verificar centenas de definies e macros, como por
exemplo:
#define TRUE 1
#define FALSE 0
typedef int BOOL
Entendendo o programa
Como voc pode notar, no existe mais uma funo main() no cdigo
do programa, sendo essa substitudo pela funo WinMain(). A funo WinMain()
a funo principal de qualquer programa Windows e deve ser inclusa
obrigatoriamente, pois chamado pelo sistema como ponto inicial do
programa. Diferente da funo main(int argv, char *argc[]), ela recebe quatro
parmetros e possui o seguinte prottipo:
10
Nota: enquanto a funo main(int argv, char *argc[]) pode ser declarada
apenas como main() sem parmetros, a funo WinMain(HINSTANCE
hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) deve
sempre ser declarada com todos seus quatro parmetros, mesmo que esses
no sejam utilizados.
No Windows, possvel que diversas instncias de um mesmo
programa estejam sendo executadas ao mesmo tempo; assim, ao ser executado,
o Windows cria um identificador (handle) para a instncia atual do programa em
HINSTANCE hInstance (o hInstance pode ser considerado como uma identidade
nica para cada instncia do programa) para que o Windows e o programa
possam sincronizar corretamente as informaes e mensagens.
O parmetro HINSTANCE hPrevInstance sempre ser NULL para programas
com tecnologia Win32 (ou seja, Windows 95 e verses superiores). Esse
parmetro era utilizado nas verses mais antigas do Windows (Win16), porm
agora tornou-se obsoleto e consta como parmetro para fins de
compatibilidade de cdigo.
O parmetro LPSTR lpCmdLine tem a mesma funo do char *argc[] da
funo main() de um programa DOS, armazenando a linha de comando do
programa (excluindo o nome do programa) na varivel lpCmdLine. A diferena
entre eles que a varivel *argc[] armazena vetores de strings, enquanto
lpCmdLine armazena a linha de comando como uma nica e extensa string.
O ltimo parmetro, int nCmdShow, utilizado para identificar o estado
em que a janela do programa ser iniciada (maximizada, minimizada, normal,
etc). A Tabela 1.2 a seguir mostra os valores que esse parmetro pode receber:
Valor
SW_HIDE
SW_MINIMIZE
Descrio
Esconde a janela e ativa outra janela.
Minimiza a janela especificada e ativa a janela
de nvel mais alto na listagem do sistema.
Captulo 1 Iniciando
SW_RESTORE
SW_SHOW
SW_SHOWMAXIMIZED
SW_SHOWMINIMIZED
SW_SHOWMINNOACTIVE
SW_SHOWNA
SW_SHOWNOACTIVATE
SW_SHOWNORMAL
11
12
A caixa de mensagem
Vamos passar agora para o cdigo dentro da funo WinMain(). A
funo MessageBox() uma funo da Win32 API que mostra uma caixa de
mensagem para o usurio com alguns botes e cones pr-definidos.
int MessageBox(
HWND hWnd, // identificador da janela-pai
LPCTSTR lpText, // ponteiro para texto da caixa de mensagem
LPCTSTR lpCaption, // ponteiro para ttulo da caixa de mensagem
UINT uType // estilo da caixa de mensagem
);
Descrio
A caixa de mensagem contm trs botes:
Anular, Repetir e Ignorar.
A caixa de mensagem contm um boto OK
(esse o padro)
A caixa de mensagem contm os botes OK e
Captulo 1 Iniciando
MB_RETRYCANCEL
MB_YESNO
MB_YESNOCANCEL
MB_ICONEXCLAMATION
MB_ICONINFORMATION
MB_ICONQUESTION
MB_ICONSTOP
MB_DEFBUTTON1
MB_DEFBUTTON2
MB_DEFBUTTON3
MB_DEFBUTTON4
13
Cancelar.
A caixa de mensagem contm os botes
Repetir e Cancelar.
A caixa de mensagem contm os botes Sim e
No.
A caixa de mensagem contm os botes Sim,
No e Cancelar.
Um cone de ponto de exclamao aparecer
na caixa de mensagem.
Um cone com a letra i aparecer na caixa
de mensagem.
Um cone de ponto de interrogao aparecer
na caixa de mensagem.
Um cone de sinal de parada aparecer na
caixa de mensagem.
O primeiro boto da caixa de mensagem o
boto padro (default), a menos que
MF_DEFBUTTON2, MF_DEFBUTTON3 ou MF_DEFBUTTON4
seja especificado.
O segundo boto da caixa de mensagem o
boto padro.
O terceiro boto da caixa de mensagem o
boto padro.
O quarto boto da caixa de mensagem o
boto padro.
14
Descrio
Boto Anular foi pressionado.
Boto Cancelar foi pressionado.
Boto Ignorar foi pressionado.
Boto No foi pressionado.
Boto OK foi pressionado.
Boto Repetir foi pressionado.
Boto Sim foi pressionado.
Tabela 1.4: Valores retornado pela funo MessageBox().
15
Definindo a classe
A primeira etapa para a criao da janela do seu programa declarar
uma classe da janela. Apesar de ser chamada de classe, esse novo tipo de
dado uma struct que armazena as informaes sobre a janela do programa.
Sua estrutura definida como:
typedef struct _WNDCLASSEX {
UINT cbSize; // tamanho da estrutura, em bytes
UINT style;
style; // estilo da classe
WNDPROC lpfnWndProc; // ponteiro para a funo que
int cbClsExtra; // bytes extras a serem alocados
janela
int cbWndExtra; // bytes extras a serem alocados
janela
HANDLE hInstance; // identificador da instncia da
HICON hIcon; // identificador do cone
processa mensagens
depois da estrutura da
depois da instncia da
janela
16
sizeof(WNDCLASSEX),
pois
WNDCLASSEX.cbSize = sizeof(WNDCLASSEX);
Valor
CS_DBLCLKS
CS_HREDRAW
CS_NOCLOSE
CS_OWNDC
CS_VREDRAW
17
Descrio
Envia mensagens de duplo-clique do mouse
para o programa.
Redesenha toda a janela se um ajuste de
movimento ou tamanho foi feito na horizontal
da janela.
Desabilita o menu Fechar ALT+F4 do menu
da janela.
Aloca um contexto de dispositivo para cada
janela da classe.
Redesenha toda a janela se um ajuste de
movimento ou tamanho foi feito na vertical da
janela.
Tabela 2.1: Alguns estilos de janela.
18
Valor
IDI_APPLICATION
IDI_ASTERISK
IDI_ERROR
IDI_EXCLAMATION
IDI_HAND
IDI_INFORMATION
IDI_QUESTION
IDI_WARNING
IDI_WINLOGO
Descrio
cone padro (parecido com um cone de
programas MS-DOS).
Idem a IDI_INFORMATION.
cone crculo vermelho com um X.
Idem a IDI_WARNING.
Idem a IDI_ERROR.
cone com ponto de exclamao num balo
branco.
cone com ponto de interrogao num balo
branco.
cone com ponto de exclamao numa placa
amarela.
cone com o logotipo do Windows.
Tabela 2.2: cones pr-definidos pelo sistema.
Valor
IDC_APPSTARTING
IDC_ARROW
IDC_CROSS
IDC_HELP
IDC_IBEAM
IDC_NO
IDC_SIZEALL
IDC_SIZENESW
IDC_SIZENS
IDC_SIZENWSE
IDC_SIZEWE
IDC_UPARROW
IDC_WAIT
19
Descrio
Cursor padro com pequena ampulheta.
Cursor padro.
Cursor em forma de cruz.
Cursor seta e ponto de interrogao.
Cursor de texto (I-beam).
Cursor com smbolo de proibido.
Cursor com setas na vertical e horizontal.
Cursor com setas na diagonal para direita.
Cursor com setas na vertical.
Cursor com setas na diagonal para esquerda.
Cursor com setas na horizontal.
Cursor com seta para cima.
Cursor de ampulheta.
Tabela 2.3: Cursores pr-definidos pelo sistema.
20
HGBIOBJ GetStockObject(
int fnObject // tipo de objeto pr-definido
};
Nota:
no
comando
WNDCLASSEX.hbrBackground
(HBRUSH)GetStockObject(BLACK_BRUSH),
Descrio
Pincel preto.
Pincel cinza escuro.
Pincel cinza.
Pincel transparente (idem a NULL_BRUSH).
Pincel cinza claro.
Pincel transparente (idem a HOLLOW_BRUSH).
Pincel branco.
BLACK_BRUSH
DKGRAY_BRUSH
GRAY_BRUSH
HOLLOW_BRUSH
LTGRAY_BRUSH
NULL_BRUSH
WHITE_BRUSH
Registrando a classe
Com a classe da janela j inicializada, a prxima etapa registr-la para
que o Windows permita que voc crie janelas a partir das informaes
fornecidas dentro da classe. preciso registrar a classe antes de tentar criar
21
qualquer janela! Para isso, utilizamos a funo RegisterClassEx(), que tem o seguinte
prottipo:
ATOM RegisterClassEx(
CONST WNDCLASSEX *lpwcx // endereo da estrutura com os dados da classe
);
Criando a janela
Depois de definir a classe da janela e registr-la, podemos ento criar a
janela principal do programa. Para isso, utilizamos a seguinte funo:
HWND CreateWindowEx(
DWORD dwExStyle, // estilos extras da janela
LPCTSTR lpClassName, // ponteiro string para o nome da classe registrada
LPCTSTR lpWindowName, // ponteiro string para o ttulo da janela
DWORD dwStyle, // estilo da janela
int x, // posio horizontal da janela
int y, // posio vertical da janela
int nWidth, // largura da janela
int nHeight,
nHeight, // altura da janela
HWND hWndParent, // identificador da janela-pai
HMENU hMenu, // identificador do menu
HINSTANCE hInstance, // identificador da instncia do programa
LPVOID lpParam // ponteiro para dados de criao da janela
);
22
DWORD dwStyle.
Estilo
WS_BORDER
WS_CAPTION
WS_CHILD
WS_CLIPCHILDREN
WS_DISABLED
Descrio
Cria uma janela com borda fina.
Cria uma janela com barra de ttulo (inclui o
estilo WS_BORDER).
Cria uma janela-filho. Esse estilo no pode ser
utilizado junto com o estilo WS_POPUP.
Exclui a rea ocupada pelas janelas-filho
quando necessrio fazer atualizao da
janela-pai. Esse estilo usado quando se cria
uma janela-pai.
Cria uma janela inicialmente desabilitada.
Uma janela desse estilo no pode receber
WS_DLGFRAME
WS_HSCROLL
WS_MAXIMIZE
WS_MAXIMIZEBOX
WS_MINIMIZE
WS_MINIMIZEBOX
WS_OVERLAPPED
WS_OVERLAPPEDWINDOW
WS_POPUP
WS_POPUPWINDOW
WS_SIZEBOX
WS_SYSMENU
WS_TABSTOP
WS_VISIBLE
WS_VSCROLL
23
entradas do usurio.
Cria uma janela com borda tpica de caixas de
dilogo. No possui barra de ttulo.
Cria uma janela com barra de rolagem
horizontal.
Cria uma janela inicialmente maximizada.
Cria uma janela que contm o boto de
Maximizar. No pode ser combinado com o
estilo WS_EX_CONTEXTHELP e o estilo WS_SYSMENU
deve ser especificado.
Cria uma janela inicialmente minimizada.
Cria uma janela que contm o boto de
Minimizar. No pode ser combinado com o
estilo WS_EX_CONTEXTHELP e o estilo WS_SYSMENU
deve ser especificado.
Cria uma janela com borda e barra de ttulo.
Cria uma janela com os estilos WS_OVERLAPPED,
WS_CAPTION,
WS_SYSMENU,
WS_THICKFRAME,
WS_MINIMIZEBOX e WS_MAXIMIZEBOX.
Cria uma janela pop-up. No pode ser utilizado
com o estilo WS_CHILD.
Cria uma janela pop-up com os estilos
WS_BORDER, WS_POPUP e WS_SYSMENU. Os estilos
WS_POPUPWINDOW
e WS_CAPTION devem ser
combinados para deixar a janela visvel.
Cria uma janela que contm uma borda de
ajuste de tamanho.
Cria uma janela que tem o menu de sistema
na barra de ttulo. O estilo WS_CAPTION tambm
deve ser especificado.
Especifica um controle que pode receber o
cursor do teclado quando o usurio pressiona
a tecla TAB. Ao pressionar a tecla TAB, o
cursor do teclado muda para o prximo
controle com o estilo WS_TABSTOP.
Cria uma janela inicialmente visvel.
Cria uma janela com barra de rolagem
vertical.
Tabela 2.5: Principais estilos da janela.
24
Estilo
WS_EX_ACCEPTFILES
WS_EX_CLIENTEDGE
WS_EX_CONTROLPARENT
WS_EX_MDICHILD
WS_EX_TOOLWINDOW
WS_EX_TOPMOST
Descrio
A janela com esse estilo aceita arquivos
arrastados para ela.
Cria uma borda afundada na janela.
Permite o usurio navegar entre as janelasfilho usando a tecla TAB.
Cria uma janela-filho MDI.
Cria uma janela de ferramentas flutuante;
contm uma barra de ttulo menor que a
normal e utiliza uma fonte menor para o
ttulo. Esse estilo de janela no aparece na
barra de tarefas ou quando o usurio aperta
as teclas ALT+TAB.
Especifica que a janela criada deve
permanecer acima de todas as outras janelas
do sistema, mesmo que essa seja desativada.
Tabela 2.6: Principais estilos extras da janela.
CreateWindowsEx()
hWnd = CreateWindowEx(parmetros);
25
BOOL ShowWindow(
HWND hWnd, // identificador da janela
int nCmdShow // estado da janela
);
O loop de mensagens
A prxima etapa criar um loop onde sero verificadas todas as
mensagens que o Windows enviar para a fila de mensagens do programa. Essa
etapa consiste em trs passos: em primeiro lugar, o programa deve receber a
mensagem que est na fila; em seguida, traduz cdigos de teclas virtuais ou
aceleradoras (de atalho) em mensagens de caracteres/teclado, para finalmente
despachar as mensagens para a funo que processam elas. Porm, antes do
loop, declaramos uma varivel do tipo MSG que armazenar a mensagem atual,
com as seguintes informaes:
typedef struct tagMSG {
HWND hWnd; // identificador da janela que recebe as mensagens
26
MSG
27
28
Processando mensagens
Para o funcionamento do nosso programa, preciso que as mensagens
enviadas pelo Windows sejam processadas, e isso feito atravs da funo
WindowProc(), que uma funo j definida para todos os programas (essa a
tal funo especial que foi mencionada no segundo pargrafo do captulo 1).
Seu prottipo tem o seguinte aspecto:
LRESULT CALLBACK WindowProc(
HWND hWnd, // identificador da janela
UINT uMsg, // identificador da mensagem
WPARAM wParam, // primeiro parmetro da mensagem
LPARAM lParam // segundo parmetro da mensagem
);
29
motivo, a funo tem o retorno do tipo LRESULT CALLBACK, significando que ela
chamada pelo sistema e retorna ao Windows. O valor de retorno o
resultado do processamento da mensagem, o qual depende da mensagem
enviada.
Quanto aos seus parmetros, a funo WindowProc() recebe um
identificador da janela principal (HWND hWnd), a mensagem a ser processada, UINT
uMsg (note que essa mensagem no a mesma do loop de mensagens a do
loop uma varivel do tipo MSG), e dois parmetros (WPARAM wParam e LPARAM
lParam) que podem conter informaes adicionais sobre a mensagem por
exemplo, na mensagem de movimento de mouse (WM_MOUSEMOVE), wParam indica
se algum boto do mouse est pressionado e lParam armazena a posio (x, y)
do cursor do mouse.
Existem centenas de mensagens que o seu programa poder receber
pelo Windows, porm nem sempre todas so verificadas (a Tabela 2.7 lista as
principais mensagens que so utilizadas/processadas). Para essas, devemos
deixar o prprio Windows process-las, atravs do uso de uma funo
chamada DefWindowProc(), que uma funo de processamento de mensagens
padro do Windows. Ela recebe os mesmos parmetros da WindowProc() e
processa qualquer mensagem que no foi feita pelo seu programa, assegurando
que todas as mensagens sejam verificadas e processadas.
Mensagem
WM_ACTIVATE
WM_CHAR
WM_CLOSE
WM_COMMAND
WM_CREATE
WM_DESTROY
Descrio
Enviada quando a janela ativada.
Enviada quando uma mensagem WM_KEYDOWN
traduzida pela funo TranslateMessage().
Enviada quando a janela fechada.
Enviada quando o usurio seleciona um item
de um menu, quando um controle (boto,
scrollbar, etc) envia uma mensagem para a
janela-pai ou quando uma tecla de atalho
ativada.
Enviada quando a janela criada pela funo
CreateWindowEx(). Essa mensagem enviada
funo de processamento de mensagens aps a
janela ser criada, mas antes dela se tornar
visvel.
Enviada quando a janela destruda. Essa
mensagem enviada funo de
30
WM_ENABLE
WM_KEYDOWN
WM_KEYUP
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_MOUSEMOVE
WM_MOVE
WM_PAINT
WM_QUIT
WM_SHOWWINDOW
WM_SIZE
WM_TIMER
31
programa expira.
Tabela 2.7: Principais mensagens enviadas ao programa.
32
Essa funo indica ao sistema que uma foi feito um pedido para que o
programa termine. O parmetro int nExitCode especifica o cdigo de sada do
programa e utilizado como o parmetro wParam da mensagem WM_QUIT
(lembre-se que aps o loop de mensagens receber WM_QUIT, o programa
finalizado com a WinMain() retornando o valor de msg.wParam).
O processo da mensagem WM_PAINT ser discutido no captulo 4, que
introduz a utilizao da parte grfica do Windows (GDI Graphics Device
Interface).
33
34
classe
da
janela.",
35
36
37
HWnd = CreateWindowEx(
...
(GetSystemMetrics(SM_CXSCREEN) - WINDOW_WIDTH) / 2,
(GetSystemMetrics(SM_CYSCREEN) - WINDOW_HEIGHT) / 2,
...);
SM_CMONITORS
SM_CMOUSEBUTTONS
SM_CXBORDER,
SM_CYBORDER
SM_CXCURSOR,
SM_CYCURSOR
Descrio
Valor que especifica como o sistema foi
iniciado:
0 Boot normal
1 Boot em modo de segurana
2 Boot em modo de segurana com rede
Nmero de monitores no desktop (apenas
para Windows NT 5.0 ou superior e Windows
98 ou superior).
Nmero de botes do mouse, ou zero se no
h mouse instalado.
Largura e altura da borda da janela.
Equivalente ao valor de SM_CXEDGE e SM_CYEDGE
para janelas com visual 3D.
Largura e altura do cursor.
SM_CXEDGE,
SM_CYEDGE
SM_CXFIXEDFRAME,
SM_CYFIXEDFRAME
38
SM_CXFULLSCREEN,
SM_CYFULLSCREEN
SM_CXMAXIMIZED,
SM_CYMAXIMIZED
SM_CXMIN,
SM_CYMIN
SM_CXMINIMIZED,
SM_CYMINIMIZED
SM_CXSCREEN,
SM_CYSCREEN
SM_CXSIZE,
SM_CYSIZE
SM_CYCAPTION
SM_MOUSEPRESENT
SM_NETWORK
Tabela 2.8: Alguns valores de configurao do sistema que podem ser obtidos com GetSystemMetrics().
Enviando mensagens
Quando os usurios utilizam nossos programas, eles esto
indiretamente gerando mensagens a serem processadas (cliques de mouse, uso
do teclado, mudana de posio ou tamanho da janela, etc). Ns, como
programadores, podemos enviar mensagens explicitamente para serem
processadas pela WindowProc().
Um exemplo do envio de mensagens pode ser a seguinte: quando o
usurio pressiona a tecla F3 (gerando a mensagem WM_KEYDOWN, como veremos
no captulo 4), o texto da barra de ttulo do nosso programa muda para F3
pressionado. Nesse exemplo, o usurio est gerando apenas a mensagem
WM_KEYDOWN quando aperta a tecla; a mudana do texto da barra de ttulo deve
ser feita via programao. Existe uma mensagem, WM_SETTEXT, que pode ser
enviada ao programa para mudar o texto da janela. Mas como enviar
mensagens fila de mensagens do programa?
Podemos utilizar duas funes: SendMessage() e PostMessage(). A
primeira funo envia a mensagem especificada diretamente para a
WindowProc() e no retornada at que a mensagem seja processada. A segunda
coloca a mensagem na fila de mensagens e retorna imediatamente
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
39
40
}
}
Listagem 2.4: Enviando mensagens.
41
42
IDs
Os recursos so reconhecidos pelo programa atravs de nmeros
inteiros e positivos, definidos num arquivo de cabealho .h. Esses nmeros so
conhecidos como sendo os IDs dos recursos. A Win32 API possui algumas
funes que no aceitam variveis-identificadores (handles) como parmetro, e
sim IDs de controles (botes, caixas de texto, etc) e recursos (cones, menus,
etc), como a funo LoadIcon().
ID no um tipo de varivel, e sim apenas uma definio, como
podemos verificar num arquivo .h de exemplo:
// cabealho dos recursos (arquivo .h)
#define IDI_MEUICONE
101
#define IDC_MEUCURSOR
102
cones personalizados
O primeiro recurso que aprenderemos a incluir no programa o cone.
Com o editor de textos ASCII aberto, digitamos a seguinte linha no arquivo .rc:
IDI_MEUICONE
ICON
meuicone.ico"
IDI_MEUICONE
43
101
Listagem 3.1: O arquivo de cabealho.
ICON
"meuicone.ico"
Listagem 3.2: O arquivo de recursos.
44
45
Novos cursores
O prximo recurso que veremos o cursor. Sua definio no arquivo
de recursos muito semelhante ao cone:
IDC_MEUCURSOR
CURSOR meucursor.cur
46
Bitmaps e sons
Imagens (bitmaps) e sons so dois recursos multimdia que podemos
incluir em nossos programas. A definio de ambos no arquivo de recursos
tambm muito parecida com a de cones e cursores:
IDB_MEUBITMAP
IDW_MEUSOM
BITMAP meubitmap.bmp
WAVE
meusom.wav
47
Figura 3.4: Informaes utilizadas pelo Windows Explorer (no Windows XP).
48
"CompanyName", "texto"
"
"FileDescription", "texto"
"
"FileVersion", "texto"
"
"InternalName",
"
"InternalName", "texto"
"LegalCopyright", "texto"
"
"LegalTrademarks", "texto"
"
"OriginalFilename", "texto"
"
PrivateBuild, "texto"
"
"ProductName", "texto"
"
"ProductVersion", "texto"
"
SpecialBuild,
"
SpecialBuild, "texto"
"Comentrios",
", "texto"
"
"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", langID, charsetID
}
}
Listagem 3.2: Estrutura do recurso informao de verso.
Descrio
Arquivo tem informaes de depurao ou foi
compilado no modo debug.
Arquivo foi modificado e no igual ao
original de mesmo nmero de verso.
VS_FF_SPECIALBUILD
0x1L
49
Descrio
Sistema operacional para o qual o arquivo foi
desenvolvido desconhecido.
Arquivo foi desenvolvido para MS-DOS.
Arquivo foi desenvolvido para Windows
NT/2000/XP.
Arquivo foi desenvolvido para Windows
plataforma 16-bit.
Arquivo foi desenvolvido para Windows
plataforma 32-bit.
Arquivo foi desenvolvido para Windows
plataforma 16-bit rodando MS-DOS.
Arquivo foi desenvolvido para Windows
plataforma 32-bit rodando MS-DOS.
Arquivo foi desenvolvido para Windows
NT/2000/XP.
Tabela 3.2: Valores para fileos.
filetype
50
Valor
Descrio
Arquivo desconhecido.
Arquivo um aplicatico.
Arquivo uma biblioteca DLL.
Arquivo um driver de dispositivo. No caso,
subtype especifica mais detalhes do driver.
Arquivo uma fonte. No caso, subtype
especifica mais detalhes da fonte.
Arquivo um dispositivo virtual.
Arquivo uma biblioteca esttica.
VFT_UNKNOWN
VFT_APP
VFT_DLL
VFT_DRV
VFT_FONT
VFT_VXD
VFT_STATIC_LIB
Descrio
Tipo do driver desconhecido.
Driver de comunicao.
Driver de impressora.
Driver de teclado.
Driver de lngua.
Driver de vdeo.
Driver de mouse.
Driver de rede.
Driver de sistema.
Driver de instalao.
Driver de som.
Driver de impressora (com verso).
Valor
VFT2_UNKNOWN
VFT2_FONT_RASTER
VFT2_FONT_VECTOR
VFT2_FONT_TRUETYPE
Descrio
Tipo de fonte desconhecida.
Fonte do tipo bitmap.
Fonte do tipo vetorial.
Fonte do tipo True Type.
Tabela 3.5: Valores de fontes para subtype.
51
Lngua
Alemo
Grego
Ingls americano
Ingls britnico
Espanhol
Finlands
Francs
Italiano
Japons
Portugus (Brasil)
Portugus (Portugal)
0407
0408
0409
0909
040A
040B
040C
0410
0411
0416
0816
Valor (hexa)
Valor
0000
03A4
932
03B5
949
04B0
1200
04E2
1250
04E4
1252
04E7
1255
Tipo de caractere
ASCII 7-bit
Japo
Coria
Unicode
Europa oriental
Ocidente
Hebreu
52
LegalTrademarks
OriginalFilename
PrivateBuild
ProductName
ProductVersion
SpecialBuild
Descrio
Nome da empresa que produziu o arquivo.
Descrio do arquivo.
Verso do arquivo.
Nome interno do arquivo. Geralmente o
nome original do arquivo sem extenso.
Informaes de direitos autorais que se
aplicam ao arquivo. Essa informao
opcional.
Informaes de marcas registradas que se
aplicam ao arquivo. Essa informao
opcional.
Nome original do arquivo, sem o caminho.
Essa informao til para o programa
determinar se o arquivo foi renomeado pelo
usurio.
Informaes sobre uma verso particular do
arquivo. Essa informao s deve ser inclusa
se VS_FF_PRIVATEBUILD for especificado na linha
FILEFLAGS fileflags.
Nome do produto o qual o arquivo est sendo
distribudo junto.
Verso do produto o qual o arquivo est
sendo distribudo junto.
Especifica a diferena entre a verso desse
arquivo com sua verso padro. Essa
informao s deve ser inclusa se
VS_FF_SPECIALBUILD for especificado na linha
FILEFLAGS fileflags.
Informao adicional.
Comentrios /
Qualquer outro texto
Tabela 3.8: Informaes do bloco lang-charset.
53
ICON
CURSOR
"meuicone.ico"
"meucursor.cur"
1 VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK 0x17L
FILEFLAGS 0x0L
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041604e4"
BEGIN
VALUE "CompanyName", "Andr Kishimoto"
VALUE "FileDescription", "Uso de recursos - VERSIONINFO"
VALUE "FileVersion", "1.0"
VALUE "InternalName", "prog03-4"
VALUE "LegalCopyright", "Copyright 2004, Andr Kishimoto"
VALUE "OriginalFilename", "prog03-4.exe"
54
55
IDM_MEUMENU
MENU
{
POPUP "menu1"
", tipos (opcional)
"
{
MENUITEM "item1",
", ID_DO_MENU1_ITEM1,
"
ID_DO_MENU1_ITEM1 tipos (opcional)
MENUITEM "item2",
", ID_DO_MENU1_ITEM2,
"
ID_DO_MENU1_ITEM2 tipos (opcional)
MENUITEM "itemX",
", ID_DO_MENU1_ITEMX,
"
ID_DO_MENU1_ITEMX tipos (opcional)
}
POPUP "menu2"
", tipos (opcional)
"
{
MENUITEM "item1",
", ID_DO_MENU2_ITEM1,
"
ID_DO_MENU2_ITEM1 tipos (opcional)
MENUITEM "item2",
", ID_DO_MENU2_ITEM2,
"
ID_DO_MENU2_ITEM2 tipos (opcional)
MENUITEM "itemX",
", ID_DO_MENU2_ITEMX
"
ID_DO_MENU2_ITEMX,
MENU2_ITEMX tipos (opcional)
}
}
Listagem 3.4: Esqueleto de um menu.
MENUBARBREAK
MENUBREAK
Descrio
Menu marcado/selecionado.
Menu no pode ser clicado (desabilitado). No
pode ser usado junto com INACTIVE.
Identifica um item de ajuda
Menu inativo (no faz nada, mas pode ser
clicado). No pode ser usado junto com
GRAYED.
Idem a MENUBREAK, exceto que adiciona uma
linha separando as colunas (para itens do
menu-pai).
Posiciona o menu-pai numa nova linha. Para
itens do menu-pai, posiciona-os numa nova
coluna, sem linhas separatrias.
Tabela 3.9: Aparncia do item do menu.
56
\t
para tabular o
57
58
CreateWindowEx(),
HMENU LoadMenu(
HINSTANCE hInstance, // identificador do mdulo
LPCTSTR lpMenuName // ID do recurso do menu
);
DestroyMenu()
antes da
59
60
61
bit
do
de
foi
62
Essa funo faz com que um item do menu fique marcado ou no. Os
parmetros recebem os mesmos valores da funo EnableMenuItem(), com uma
nica diferena no ltimo: ao invs de receber MF_ENABLED, MF_DISABLED ou
MF_GRAYED, a funo deve receber MF_CHECKED (item ser marcado) ou
MF_UNCHECKED (item ser desmarcado). A funo retorna o estado anterior do
item (MF_CHECKED ou MF_UNCHECKED) ou 1 se o item do menu no existir.
BOOL
BOOL CheckMenuRadioItem(
HMENU hmenu, // identificador do menu
UINT idFirst, // ID ou posio do primeiro item do menu
UINT idLast, // ID ou posio do ltimo item do menu
UINT idCheck, // ID ou posio do item do menu a ser modificado
UINT uFlags // opes
63
);
Caixas de dilogo
O ltimo recurso que veremos a caixa de dilogo janela muito
parecida com as dos programas que estivemos criando at agora, mas que
definida no arquivo de recursos atravs de palavras-chave, facilitando a criao
e layout da mesma.
Nota: existem diversas opes de recursos e estilos para a caixa de dilogo,
mas veremos apenas os mais utilizados nos programas.
Para criarmos uma caixa de dilogo, utilizamos a estrutura conforme a
Listagem 3.10.
IDD_MEUDIALOGO
DIALOGEX
CAPTION ttulo (opcional)
x, y, largura, altura
64
Descrio
Indica que a coordenada da caixa de dilogo
est em coordenadas da tela. Se no utilizado,
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
DS_CENTER
DS_CENTERMOUSE
DS_MODALFRAME
65
66
ES_NUMBER
ES_PASSWORD
ES_READONLY
ES_RIGHT
ES_UPPERCASE
ES_WANTRETURN
Descrio
Rolagem automtica do texto na horizontal.
Rolagem automtica do texto na vertical.
Texto centralizado.
Texto alinhado esquerda.
Converte todos os caracteres para minsculo.
A caixa possui mltiplas linhas, no apenas
uma (que o padro). Note que para a tecla
ENTER ser utilizada para pular de linha, o
estilo ES_WANTRETURN deve ser especificado.
A caixa aceita apenas nmeros.
Mostra um asterisco para cada caractere
inserido na caixa.
Impede que o usurio possa editar o contedo
da caixa.
Texto alinhado direita.
Converte todos os caracteres para maisculo.
Indica que uma nova linha ser inserida
quando o usurio apertar a tecla ENTER
numa caixa de mltiplas linhas.
Tabela 3.11: Alguns valores de estilo de caixas de edio.
palavra-chave texto,
estilos_extendidos
id_do_botao,
x,
y,
largura,
altura,
67
estilos,
AUTOCHECKBOX
AUTORADIOBUTTON
CHECKBOX
PUSHBOX
PUSHBUTTON
Descrio
Cria um checkbox automtico de trs estados
(marcado, desmarcado ou indeterminado). O
parmetro estilos pode receber BS_AUTO3STATE
(padro), WS_TABSTOP (padro), WS_DISABLED e
WS_GROUP.
Cria um checkbox automtico de dois estados
(marcado ou desmarcado). O parmetro
estilos pode receber BS_AUTOCHECKBOX (padro),
WS_TABSTOP (padro) e WS_GROUP.
Cria um boto de rdio automtico. O
parmetro
estilos
pode
receber
BS_AUTORADIOBUTTON
(padro),
WS_TABSTOP
(padro), WS_DISABLED e WS_GROUP.
Cria um checkbox de dois estados (marcado ou
desmarcado). O parmetro estilos pode
receber BS_CHECKBOX (padro), WS_TABSTOP
(padro) e WS_GROUP.
Cria um boto contendo apenas o texto, sem
sua janela em volta. O parmetro estilos pode
receber BS_PUSHBOX (padro), WS_TABSTOP
(padro), WS_DISABLED e WS_GROUP.
Cria um boto comum, com o texto
centralizado. O parmetro estilos pode
receber BS_PUSHBUTTON (padro), WS_TABSTOP
68
RADIOBUTTON
STATE3
69
Descrio
Cria um checkbox de trs estados.
Cria um checkbox automtico de trs estados.
Cria um checkbox automtico de dois estados.
Cria um boto de rdio automtico.
Cria um checkbox de dois estados.
Cria um boto comum com uma borda preta
em volta, indicando que ele o padro;
quando o usurio pressiona ENTER numa
caixa de dilogo, mesmo que o cursor do
teclado no esteja nele, o boto executado.
70
BS_GROUPBOX
BS_LEFTTEXT
BS_PUSHBUTTON
BS_RADIOBUTTON
BS_BITMAP
BS_BOTTOM
BS_CENTER
BS_ICON
BS_FLAT
BS_LEFT
BS_MULTILINE
BS_PUSHLIKE
BS_RIGHT
BS_RIGHTBUTTON
BS_TEXT
BS_TOP
BS_VCENTER
Descrio
Faz a rolagem de texto automtica quando o
usurio digita um caracter no fim da linha. Se
esse estilo no for definido, apenas textos que
se encaixam dentro da caixa de seleo so
permitidos.
CBS_DROPDOWN
CBS_DROPDOWNLIST
CBS_LOWERCASE
CBS_NOINTERNALHEIGHT
CBS_SIMPLE
CBS_SORT
CBS_UPPERCASE
71
Descrio
Mostra uma barra de rolagem vertical
desativada quando a lista no contm itens
suficientes para fazer a rolagem. Sem esse
estilo, a barra de rolagem fica escondida
72
LBS_EXTENDEDSEL
LBS_MULTICOLUMN
LBS_MULTIPLESEL
LBS_NOINTEGRALHEIGHT
LBS_NOSEL
LBS_SORT
LBS_STANDARD
SBS_HORZ
SBS_LEFTALIGN
SBS_RIGHTALIGN
SBS_TOPALIGN
Descrio
Alinha a parte inferior da barra de rolagem
com a parte inferior do retngulo definido
pelos parmetros x, y, largura e altura. Use
esse estilo com SBS_HORZ.
Cria uma barra de rolagem horizontal.
Alinha o lado esquerdo da barra de rolagem
com o lado esquerdo do retngulo definido
pelos parmetros x, y, largura e altura. Use
esse estilo com SBS_VERT.
Alinha o lado direito da barra de rolagem com
o lado direito do retngulo definido pelos
parmetros x, y, largura e altura. Use esse
estilo com SBS_VERT.
Alinha a parte superior da barra de rolagem
73
SBS_VERT
SS_BLACKFRAME
SS_BLACKRECT
SS_CENTER
SS_CENTERIMAGE
SS_GRAYFRAME
SS_GRAYRECT
SS_ICON
SS_LEFT
SS_RIGHT
SS_SUNKEN
Descrio
Indica que um bitmap ser mostrado no
controle esttico. O texto que o controle
recebe o ID do bitmap, definido no arquivo
de recursos. A largura e altura especificadas
so ignoradas, pois o controle se ajusta ao
tamanho do bitmap.
Indica que o controle ser um retngulo com
borda preta (sem preenchimento).
Indica que o controle ser um retngulo preto
(com preenchimento).
Indica que o controle exibir um texto
centralizado.
Indica que o bitmap ser centralizado no
controle.
Indica que o controle ser um retngulo com
borda cinza (sem preenchimento).
Indica que o controle ser um retngulo cinza
(com preenchimento).
Indica que um cone ser mostrado no
controle esttico. O texto que o controle
recebe o ID do cone, definido no arquivo
de recursos. A largura e altura especificadas
so ignoradas, pois o controle se ajusta ao
tamanho do cone.
Indica que o controle exibir um texto
alinhado esquerda.
Indica que o controle exibir um texto
alinhado direita.
Indica que o controle ter uma borda em
74
SS_WHITEFRAME
SS_WHITERECT
baixo relevo.
Indica que o controle ser um retngulo com
borda branca (sem preenchimento).
Indica que o controle ser um retngulo
branco (com preenchimento).
Tabela 3.18: Alguns estilos de controle esttico.
75
BOOL EndDialog(
HWND hDlg, // identificador da caixa de dilogo
INT_PTR nResult // valor de retorno
);
76
MAKEINTRESOURCE(IDD_MEUDIALOGO),
hWnd,
77
78
79
80
{
// Se no foi, cria e salva identificador em g_hDlg
g_hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MEUDIALOGO2), hWnd,
(DLGPROC)DlgProcModeless);
// Mostra a caixa de dilogo
ShowWindow(g_hDlg, SW_SHOW);
}
else // Caixa de dilogo j foi criada...
// Mostra a caixa de dilogo
SetFocus(g_hDlg);
...
// continuao da WindowProc()
}
//-------------------------------------------------------------------------// DlgProcModeless() -> Processa as mensagens enviadas para a caixa de
// dilogo
//-------------------------------------------------------------------------INT_PTR CALLBACK DlgProcModeless(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
// Verifica qual foi a mensagem enviada
switch(uMsg)
{
case WM_INITDIALOG: // Caixa de dilogo foi criada
{
// Retorna TRUE, significando que a mensagem
// foi processada corretamente
return(TRUE);
} break;
case WM_COMMAND: // Item do menu, tecla de atalho ou controle ativado
{
switch(LOWORD(wParam))
{
case IDCANCEL: // ALT+F4, menu do sistema, boto x
{
// Destri a caixa de dilogo
DestroyWindow(hDlg);
// Indica que g_hDlg no identifica mais a caixa de dilogo
g_hDlg = NULL;
return(TRUE);
} break;
}
} break;
default: // Outra mensagem
{
// Retorna FALSE, deixando a caixa de dilogo processar a mensagem
return(FALSE);
} break;
81
}
}
Listagem 3.13: Criao e processamento de mensagens de uma caixa de dilogo modeless.
82
83
84
Figura 4.2: Parte da rea cliente invalidada quando outra janela sobreposta.
85
86
para
estrutura
que
contm
87
88
89
90
91
Validando reas
Assim como podemos invalidar partes da rea cliente, tambm
podemos valid-las, atravs da funo ValidateRect(), que valida a parte da rea
cliente especificada num retngulo (passada como parmetro para a funo).
BOOL ValidateRect(
HWND hWnd, // identificador da janela
CONST RECT *lpRect // ponteiro para coordenadas do retngulo
);
Objetos GDI
Alm do DC, precisamos trabalhar com objetos GDI. Os objetos GDI
so tipos de variveis definidas pela Win32 API os quais devem ser criados e
selecionados no DC antes de desenharmos grficos na rea cliente.
92
Objeto GDI
Caneta (pen)
Pincel (brush)
Bitmap (bitmap)
Fonte (font)
Regio (region)
Objeto GDI genrico
Tabela 4.1: Objetos GDI.
93
isso evita problemas inesperados que possam ocorrer. Veja o trecho de cdigo
a seguir (Listagem 4.5), que seleciona uma caneta no DC e depois restaura a
caneta antiga (no se preocupe em entender como criar uma caneta, mas sim
como funciona a funo SelectObject()):
HPEN hPen; // Nova caneta;
HPEN hPenOld; // Caneta antiga
// Cria nova caneta
hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
// Seleciona nova caneta no DC e salva antiga
hPenOld = (HPEN)SelectObject(hDC, hPen);
//
// Cdigo para desenhar grficos
//
// Nova caneta no vai ser mais utilizada, restaura antiga
SelectObject(hDC, hPenOld);
// Exclui a nova caneta e libera memria associada ela
DeleteObject(hPen);
Listagem 4.5: Usando a funo SelectObject().
Voc deve ter percebido que a ltima linha desse cdigo contm uma
funo que ainda no foi discutida aqui: DeleteObject() exclui um objeto e
libera a memria associada ao mesmo. Uma vez excludo, o identificador do
objeto no mais vlido.
BOOL DeleteObject(
HGDIOBJ hObject // identificador do objeto grfico
);
94
DIBSECTION
HBITMAP
sizeof(BITMAP).
EXTLOGPEN
LOGPEN
LOGBRUSH
LOGFONT
95
96
Usar uma varivel do tipo char[] (ou LPSTR) tambm facilita quando
precisamos passar o ltimo parmetro da funo, pois podemos usar lstrlen()
para indicarmos a quantidade de caracteres da string automaticamente.
Mesmo utilizando a funo sprintf() para pr-formatar a string,
no aceita certas seqncias de escape como quebra de linha ou
tabulao. Para isso, utilizamos DrawText():
TextOut()
int DrawText(
DrawText(
HDC hDC, // identificador do DC
LPCTSTR lpString, // ponteiro para string
int nCount, // quantidade de caracteres da string
LPRECT lpRect, // ponteiro para retngulo onde o texto ser formatado
UINT uFormat // flags para formatao do texto
);
97
DT_CENTER
DT_EXPANDTABS
DT_LEFT
DT_RIGHT
DT_SINGLELINE
DT_TOP
DT_VCENTER
DT_WORDBREAK
Descrio
Alinha o texto para a parte inferior do
retngulo. Esse valor deve ser combinado com
DT_SINGLELINE.
Centraliza o texto horizontalmente no
retngulo.
Aumenta os caracteres de tabulao. O valor
padro de caracteres por tabulao oito.
Alinha o texto esquerda.
Alinha o texto direita.
Mostra o texto em uma nica linha. Quebra de
linhas (\n) no tm efeito nesse caso.
Alinha o texto na parte superior do retngulo.
Esse valor deve ser combinado com
DT_SINGLELINE.
Centraliza o texto verticalmente. Esse valor
deve ser combinado com DT_SINGLELINE.
Quebra de linhas so automaticamente
inseridas caso uma palavra ultrapasse a rea do
retngulo especificado no parmetro lpRect.
Tabela 4.3: Alguns valores de formatao de texto para DrawText().
onde
sero
armazenadas
as
98
99
100
COLORREF RGB(
BYTE bRed, // cor vermelha
BYTE bGreen, // cor verde
BYTE bBlue // cor azul
);
Valor hexadecimal
RGB(0, 0, 0)
0x00000000
0x00FFFFFF
RGB(255, 0, 0)
0x000000FF
RGB(128, 0, 0)
0x0000007F
RGB(0, 255, 0)
0x0000FF00
RGB(0, 128, 0)
0x00007F00
RGB(0, 0, 255)
0x00FF0000
RGB(0, 0, 128)
0x007F0000
RGB(255, 255, 0)
0x0000FFFF
RGB(128, 128, 0)
0x00007F7F
RGB(255, 0, 255)
0x00FF00FF
RGB(128, 0, 128)
0x007F007F
0x00FFFF00
0x007F7F00
RGB()
Cor
Preto
Branco
Vermelho claro
Vermelho escuro
Verde claro
Verde escuro
Azul claro
Azul claro
Amarelo claro
Amarelo escuro
Magenta claro
Magenta escuro
Ciano claro
Ciano escuro
101
SetTextColor()
TextOut()
COLORREF SetTextColor(
HDC hdc, // identificador do DC
COLORREF crColor
crColor // cor do texto
);
102
103
104
105
valores da Tabela 4.5 podem ser enviados a esse parmetro. O valor zero faz
com que uma espessura padro da fonte seja utilizada.
Valor
FW_DONTCARE
FW_THIN
FW_EXTRALIGHT
FW_ULTRALIGHT
FW_LIGHT
FW_NORMAL
FW_REGULAR
FW_MEDIUM
FW_SEMIBOLD
FW_DEMIBOLD
FW_BOLD
FW_EXTRABOLD
FW_ULTRABOLD
FW_HEAVY
FW_BLACK
Espessura
0
100
200
200
300
400 (normal)
400
500
600
600
700 (negrito)
800
800
900
900
Tabela 4.5: Espessuras da fonte.
106
GB2312_CHARSET
GREEK_CHARSET
HANGUL_CHARSET
MAC_CHARSET
OEM_CHARSET
RUSSIAN_CHARSET
SHIFTJIS_CHARSET
SYMBOL_CHARSET
TURKISH_CHARSET
VIETNAMESE_CHARSET
JOHAB_CHARSET
ARABIC_CHARSET
HEBREW_CHARSET
THAI_CHARSET
OUT_OUTLINE_PRECIS
OUT_PS_ONLY_PRECIS
Descrio
No utilizado.
Especifica o comportamento padro do
mapeador de fontes.
Instrui o mapeador de fontes a escolher uma
fonte de dispositivo quando o sistema possui
contm diversas fontes com o mesmo nome
(por exemplo, uma fonte fornecida pelo
fabricante de impressora).
Instrui o mapeador de fontes a escolher
fontes True Type ou variaes de fontes outline
quando existe mais de uma fonte com o
mesmo nome.
Instrui o mapeador de fontes a escolher
apenas fontes PostScript. Caso no exista
nenhuma fonte PostScript instalada no sistema,
OUT_RASTER_PRECIS
OUT_STRING_PRECIS
OUT_STROKE_PRECIS
OUT_TT_ONLY_PRECIS
OUT_TT_PRECIS
107
OUT_TT_PRECIS
Descrio
Preciso de corte padro.
Este valor deve ser especificado quando
utilizamos uma fonte embedded read-only.
Quando utilizado, a rotao das fontes
108
CLIP_STROKE_PRECIS
Descrio
A impresso da fonte feita suavemente.
Qualidade padro da fonte.
A aparncia da fonte no importante.
A impresso da fonte no feita suavemente.
A qualidade da fonte alta e no ocorrem
distores na aparncia.
ANTIALIASED_QUALITY
DEFAULT_QUALITY
DRAFT_QUALITY
NONANTIALIASED_QUALITY
PROOF_QUALITY
109
Descrio
Fontes diferentes, como Old English.
Usar a fonte padro.
Fontes com traado constante, como Courier
New.
Fontes com traado varivel e com serif, como
MS Serif.
Fontes com estilo de escrita mo, como
Script.
Fontes com traado varivel e sem serif, como
MS Sans Serif.
Tabela 4.10: Famlias das fontes.
CreateFontIndirect(),
devemos inicializar os
110
111
Verificando o teclado
Na programao Windows, verificamos o estado do teclado de duas
maneiras: atravs do cdigo de tecla virtual ou atravs do caractere referente
tecla pressionada. Para isso, podemos processar trs mensagens do teclado:
WM_KEYDOWN, WM_KEYUP e WM_CHAR. As duas primeiras esto relacionadas ao cdigo
de tecla virtual, sendo que WM_KEYDOWN enviada ao programa quando o usurio
pressiona alguma tecla e WM_KEYUP enviada quando o usurio solta a tecla.
WM_CHAR enviada quando uma mensagem WM_KEYDOWN traduzida pela funo
TranslateMessage().
Nota: geralmente utilizamos WM_KEYDOWN para verificar se teclas como F1,
ESC, ENTER ou INSERT foram pressionadas e WM_CHAR quando estamos
manipulando strings com o teclado.
Nas trs mensagens, o parmetro lParam armazena os dados da tecla,
indicando a contagem de repetio da tecla, scan code e flags. O lParam dessas
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
112
25-28
29
30
31
Descrio
Contagem de repetio da tecla.
Scan code.
Indica se a tecla pressionada de extenso,
como a tecla ALT+CTRL (ALT direito) em
teclados de 101 ou 102 teclas. O valor 1 se a
tecla de extenso ou 0 caso contrrio.
Reservado.
Indica cdigo de contexto. O valor sempre
zero na mensagem WM_KEYDOWN.
Indica o estado anterior da tecla. O valor 1 se
a tecla estava pressionada antes da mensagem
ser enviada ou 0 se tecla no estava pressionada.
Indica o estado de transio. O valor sempre
zero na mensagem WM_KEYDOWN.
Tabela 4.11: lParam das mensagens de teclado.
A Tabela 4.12 lista alguns valores das teclas virtuais, que so verificadas
durante o processo da mensagem WM_KEYDOWN e WM_KEYUP. Note que todos os
cdigos das teclas virtuais comeam com VK_*.
Valor
VK_CANCEL
VK_BACK
VK_TAB
VK_RETURN
VK_ESCAPE
VK_SHIFT
VK_CONTROL
VK_MENU
VK_PAUSE
VK_SPACE
VK_PRIOR
VK_NEXT
VK_END
VK_HOME
VK_INSERT
Tecla correspondente
Control+break
Backspace
Tab
Enter
Esc
Shift
Control
Alt
Pause
Barra de espao
Page Up
Page Down
End
Home
Insert
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
113
Delete
Seta acima
Seta abaixo
Seta esquerda
Seta direita
Print Screen
Caps Lock
Scroll Lock
Num Lock
Windows da esquerda
Windows da direita
Tecla de Menu Pop-up
Teclado numrico 0 ... 9
Sinal +
Sinal Sinal *
Sinal /
Teclas F1 F12
Nota: no h cdigos de teclas virtuais para os nmeros 0 - 9 e letras A Z. Para verific-las nas mensagens WM_KEYDOWN e WM_KEYUP, utilize os valores
hexadecimais 30...39 para os nmeros e 41...5A para as letras, ou A - Z,
0 9 (letras maisculas).
Para exemplificar o processamento de cada uma dessas mensagens
(Listagem 4.14), podemos mostrar na rea cliente quais teclas o usurio
pressionou, no seu formato ASCII (mensagem WM_CHAR) e mostrar uma
mensagem quando o usurio pressionar alguma seta do teclado (mensagem
WM_KEYDOWN):
case WM_CHAR: // Obtm o cdigo ASCII da tecla pressionada
{
char szTecla[1] = { 0 }; // Armazena tecla pressionada
static int itx = 8; // Posio x na rea cliente
// Obtm identificador do DC
hDC = GetDC(hWnd);
// Armazena tecla pressionada em szTecla
sprintf(szTecla, %c, wParam);
// Mostra tecla na rea cliente
TextOut(hDC, itx, 8, szTecla, strlen(szTecla));
114
// Incrementa posio x
itx += 16;
// Libera DC
ReleaseDC(hWnd, hDC);
return(0);
} break;
case WM_KEYDOWN: // Obtm tecla virtual
{
switch(wParam) // Verifica qual tecla virtual foi pressionada
{
case VK_LEFT: // Seta Esquerda
{
MessageBox(hWnd, "SETA PRA ESQUERDA PRESSIONADA!", "TECLADO", MB_OK);
} break;
case VK_RIGHT: // Seta Direita
{
MessageBox(hWnd, "SETA PRA DIREITA PRESSIONADA!", "TECLADO", MB_OK);
} break;
case VK_UP: // Seta Acima
{
MessageBox(hWnd, "SETA PRA CIMA PRESSIONADA!", "TECLADO", MB_OK);
} break;
case VK_DOWN: // Seta Abaixo
{
MessageBox(hWnd, "SETA PRA BAIXO PRESSIONADA!", "TECLADO", MB_OK);
} break;
}
return(0);
} break;
Listagem 4.14: Processando as mensagens WM_CHAR e WM_KEYDOWN.
115
240
116
117
Tecla correspondente
Shift da esquerda.
118
VK_RSHIFT
Shift da direita.
Control da esquerda.
Control da direita.
Alt da esquerda.
Alt da direita.
Boto esquerdo do mouse.
Boto do meio do mouse.
Boto direito do mouse.
VK_LCONTROL
VK_RCONTROL
VK_LMENU
VK_RMENU
VK_LBUTTON
VK_MBUTTON
VK_RBUTTON
Verificando o mouse
Alm do teclado, outro dispositivo de entrada/controle o mouse. O
funcionamento de um mouse mais simples que o de um teclado, pois h
apenas a movimentao do mesmo e o uso de dois ou trs botes, em geral. A
Win32 API possui mensagens para processamento de movimentao do
mouse e clique dos botes, conforme a Tabela 4.14:
Mensagem
WM_MOUSEMOVE
WM_LBUTTONDBLCLK
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_MBUTTONDBLCLK
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_RBUTTONDBLCLK
Descrio
Enviada quando o mouse sofre movimentao.
Enviada quando o usurio d um duplo-clique
no boto esquerdo do mouse. necessrio
definir o membro WNDCLASSEX.style com o flag
CS_DBLCLKS.
Enviada quando o usurio clica no boto
esquerdo do mouse.
Enviada quando o usurio solta o boto
esquerdo do mouse.
Enviada quando o usurio d um duplo-clique
no boto do meio do mouse. necessrio
definir o membro WNDCLASSEX.style com o flag
CS_DBLCLKS.
Enviada quando o usurio clica no boto do
meio do mouse.
Enviada quando o usurio solta o boto do
meio do mouse.
Enviada quando o usurio d um duplo-clique
no boto direito do mouse. necessrio
definir o membro WNDCLASSEX.style com o flag
119
CS_DBLCLKS.
WM_RBUTTONDOWN
WM_RBUTTONUP
120
// Traa reta
LineTo(hDC, x, y);
// Libera DC
ReleaseDC(hWnd, hDC);
}
return(0);
} break;
Listagem 4.17: Processando a mensagem WM_MOUSEMOVE.
No processo das mensagens do mouse, existem alguns valores prdefinidos (Tabela 4.15) que indicam o estado de seus botes (pressionado ou
no), fazendo a verificao em wParam. No exemplo da Listagem 4.17,
comparamos wParam com MK_RBUTTON, para verificarmos se o boto direito do
mouse est pressionado.
Valor
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
Descrio
Boto esquerdo do mouse est pressionado.
Boto do meio do mouse est pressionado.
Boto direito do mouse est pressionado.
Tabela 4.15: Estado dos botes do mouse.
121
Verificando o mouse, II
Tambm podemos utilizar a funo GetAsyncKeyState() para obtermos
o estado dos botes do mouse quando no estamos processando suas
mensagens (veja valores dos botes do mouse na Tabela 4.12).
Para sabermos a posio do cursor do mouse a qualquer momento,
utilizamos a funo GetCursorPos():
BOOL GetCursorPos(
LPPOINT lpPoint // posio do cursor
);
122
123
Um simples ponto
Em computao grfica, o pixel (ponto) a base da criao de todos os
grficos e o menor grfico que voc pode manipular. Retas e curvas so
formadas por diversos pixels, assim como uma foto no computador
composta por milhares de pixels, cada um com uma certa tonalidade de cor.
Podemos desenhar pontos na rea cliente de um programa com duas
funes: SetPixel() e SetPixelV().
COLORREF SetPixel(
HDC hdc, // identificador do DC
int X, // coordenada x do pixel
int Y, // coordenada y do pixel
COLORREF crColor // cor do pixel
);
BOOL SetPixelV(
HDC hdc, // identificador do DC
int X, // coordenada x do pixel
int Y, // coordenada y do pixel
COLORREF crColor // cor do pixel
);
124
Y)
125
Canetas e pincis
Alguns termos utilizados na programao grfica do Windows podem
ser facilmente relacionados com a vida real. Assim, veremos como funciona o
uso de canetas e pincis GDI com exemplos do dia-a-dia.
Um dos principais usos da caneta a caligrafia, mas tambm podemos
usar canetas (e lpis) para desenhar, ou seja, fazer o contorno de uma figura.
Existem diversos tipos e modelos de canetas algumas tm cor da tinta azul,
preta, vermelha, entre outras cores; H canetas com ponta fina e outras com
ponta grossa. Quando desenhamos algo, podemos tracejar linhas contnuas,
espaadas, pontilhadas e de diversas outras maneiras. exatamente para isso
que serve uma caneta na GDI: definir propriedades (cor, espessura, tipo de
linha) para ser aplicado em retas, curvas e contornos de figuras.
Numa pintura leo, depois que o pintor faz o esboo (traado) da sua
obra na tela, ele comea a trabalhar com pincis e tintas (e outras ferramentas
que no vem ao caso) para preencher os espaos vazios entre os traados. No
caso da GDI, os pincis tambm so utilizados para preenchimento (podemos
pensar nos pincis como a ferramenta balde de tinta encontrada em softwares
de edio grfica), podendo ter cores slidas, preenchimento de linhas ou de
texturas.
Criando canetas
Para criarmos uma caneta, usamos a funo CreatePen(), definindo suas
propriedades.
HPEN CreatePen(
int fnPenStyle,
fnPenStyle, // estilo da caneta
int nWidth, // espessura da caneta
COLORREF crColor // cor da caneta
);
Descrio
Caneta slida.
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
126
PS_DASH
Caneta tracejada.
Caneta pontilhada.
Caneta alternando trao e ponto.
Caneta alternando trao e pontos duplos.
Caneta invisvel.
PS_DOT
PS_DASHDOT
PS_DASHDOTDOT
PS_NULL
127
Criando pincis
Podemos criar e utilizar quatro tipos de pincis: preenchimento com
cores slidas, com linhas, com texturas e pincis definidos pelo sistema. Para
cada tipo, existem funes especficas para criar pincis, respectivamente:
CreateSolidBrush(),
CreateHatchBrush(),
CreatePatternBrush()
e
GetStockObject().
HBRUSH CreateSolidBrush(
COLORREF crColor // cor do pincel
);
Descrio
Linhas diagonais (da esquerda para direita e
para cima).
Linhas horizontais e verticais.
Linhas diagonais cruzadas.
Linhas diagonais (da esquerda para direita e
para baixo).
Linhas horizontais.
Linhas verticais.
Tabela 5.2: Estilos de preenchimento de linhas.
HBRUSH CreatePatternBrush(
HBITMAP hbmp // identificador do bitmap
);
128
NULL
no
Descrio
Cor sempre preta.
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
129
130
aquele efeito de negativo da imagem. Com o mix mode definido como R2_NOT,
uma linha ser desenhada com a cor inversa da rea cliente. Caso a mesma
linha seja desenhada novamente, a mesma ser apagada, pois a cor da rea
cliente voltar ao seu original.
Nota: o valor R2_NOT funciona como o operador
como no exemplo abaixo:
(not) da linguagem C,
131
132
133
134
Arc(),
com a direo no
135
Nota: h tambm a funo ArcTo() para desenhar arcos, porm, ela utiliza
e atualiza o cursor invisvel. Uma linha traada da posio atual do
cursor invisvel at a coordenada do ponto inicial do arco quando
utilizamos ArcTo().
H casos em que no queremos desenhar curvas como arcos, mas sim
curvas com formato livre. Para isso, utilizamos curvas de Bzier, com a funo
PolyBezier(). As curvas de Bzier so criadas com quatro pontos: os pontos das
extremidades da curva e dois pontos de controle, que determinam a forma da
curva. A matemtica por trs do clculo das curvas de Bzier est fora do
alcance desse livro, portanto, veremos apenas como funciona a funo
PolyBezier().
Dica: esse tipo de curva foi criado por um engenheiro francs, Pierre Bzier,
que as utilizou para criar o design de um carro da Renault nos anos 70.
BOOL PolyBezier(
HDC hdc, // identificador do DC
CONST POINT* lppt, // pontos das extremidades e de controle
DWORD cPoints // quantidade de pontos
);
136
=
=
=
=
5;
10;
100;
100;
//
//
//
//
extremidade
pt controle
pt controle
extremidade
// Desenha a curva
PolyBezier(hDC, ptUmaCurva, 4);
// Define extremidades e
POINT ptTresCurvas[10];
ptTresCurvas[0].x = 10 ;
ptTresCurvas[1].x = 40 ;
ptTresCurvas[2].x = 50 ;
ptTresCurvas[3].x = 100;
ptTresCurvas[4].x = 140;
ptTresCurvas[5].x = 170;
ptTresCurvas[6].x = 200;
ptTresCurvas[7].x = 220;
ptTresCurvas[8].x = 200;
ptTresCurvas[9].x = 240;
=
=
=
=
=
=
=
=
=
=
100;
30;
130;
100;
75;
90;
200;
180;
140;
100;
//
//
//
//
//
//
//
//
//
//
extremidade
pt controle
pt controle
extremidade
pt controle
pt controle
extremidade
pt controle
pt controle
extremidade
// Desenha as 3 curvas
PolyBezier(hDC, ptTresCurvas, 10);
// Restaura caneta antiga e deleta nova caneta
// Libera DC e valida rea
EndPaint(hWnd, &psPaint);
return(0);
} break;
Listagem 5.5: Criando curvas de Bzier com PolyBezier().
Dica: para que duas curvas de Bzier consecutivas sejam interligadas sem
uma mudana brusca de angulao, certifique-se que o segundo ponto de
controle da curva anterior, sua extremidade final e o primeiro ponto de
controle da curva atual estejam em uma mesma linha (como entre a
primeira e a segunda curva da Figura 4.4).
137
Desenhando retngulos
O primeiro tipo de figura fechada que veremos o retngulo, que
criado utilizando a funo Rectangle().
BOOL Rectangle(
HDC hdc, // identificador do DC
int nLeftRect, // coordenada x do canto superior esquerdo
int nTopRect, // coordenada y do canto superior esquerdo
int nRightRect, // coordenada x do canto inferior direito
int nBottomRect // coordenada y do canto inferior direito
);
138
139
A sada da Listagem 5.6 (que parte do cdigo-fonte do arquivo prog054.cpp) mostrada na Figura 5.5 abaixo.
140
Desenhando elipses
Outro tipo de figura fechada que a GDI pode desenhar so as elipses,
atravs do uso da funo Ellipse(). Quando aprendemos a desenhar arcos,
vimos que para desenh-los era necessrio especificar um retngulo invisvel,
formado pelas extremidades da elipse (Figura 5.3). Essa regra continua valendo
para desenhar elipses, sendo que o centro da elipse o centro do retngulo
especificado na funo.
BOOL Ellipse(
HDC hdc, // identificador do DC
int nLeftRect, // coordenada x do canto superior esquerdo do retngulo
int nTopRect, // coordenada y do canto superior esquerdo do retngulo
int nRightRect, // coordenada x do canto inferior direito do retngulo
int nBottomRect // coordenada y do canto inferior direito do retngulo
);
141
142
Desenhando polgonos
Para concluir a seo de figuras fechadas, vamos aprender como
desenhar polgonos com o uso da funo Polygon(). Polgonos so figuras
formadas por um conjunto de pontos interligados com retas consecutivas
(vrtices).
BOOL Polygon(
HDC hdc, // identificador do DC
CONST POINT *lpPoints, // vrtices do poligono
int nCount // quantidade de vrtices do polgono
);
143
modos
SetPolyFillMode():
de
preenchimento
so
definidos
pela
funo
int SetPolyFillMode(
HDC hdc, // identificador do DC
int iPolyFillMode // modo de preenchimento
);
144
145
146
147
148
Captulo 6 Bitmaps
Entre os objetos GDI citados no captulo 4, um deles foi HBITMAP, que
um objeto do tipo bitmap. Nesse captulo, estaremos estudando como utilizar
esse objeto, carregando e mostrando imagens armazenadas em arquivos *.bmp
nos nossos programas.
O que so bitmaps?
Podemos definir bitmaps como um vetor de (largura * altura) bits,
onde uma certa quantidade de bits representa um ponto/cor que compe a
figura. Atualmente, existem dezenas de mtodos para armazenar uma figura no
computador, resultando em diferentes tipos de arquivos, como, por exemplo,
imagens do tipo JPEG ou GIF, famosos pela utilizao em pginas HTML.
Cada tipo de arquivo de imagem possui um cabealho, um mtodo de
armazenamento dos bits e compresso de dados, tornando-se invivel o estudo
de todos os tipos de imagem nesse livro. Veremos como utilizar apenas o tipo
nativo do Windows (bitmap, arquivos com extenso .bmp ou .dib).
Dica: voc pode verificar a estrutura de outros tipos de arquivos de
imagens consultando o livro Encyclopedia of Graphics File Formats (Murray,
James D. e Vanryper, William editora OReilly) ou pela Internet existe
um timo site especificamente sobre estrutura de arquivos em
http://www.myfileformats.com.
Os bitmaps, quanto quantidade de cores, podem ser classificados
conforme a Tabela 6.1
Bitmap de n-bit
1
4
8
16
24
32
Captulo 6 Bitmaps
149
150
Captulo 6 Bitmaps
151
Carregando bitmaps
Em nossos programas, possvel utilizar imagens armazenadas em
disco (arquivos *.bmp) ou imagens de recursos (conforme visto no captulo 3),
armazenadas no final do arquivo executvel. Carregamos bitmaps atravs da
funo LoadImage().
HANDLE LoadImage(
HINSTANCE hinst, // identificador da instncia
LPCTSTR lpszName, // imagem a ser carregada
UINT uType, // tipo de imagem
int cxDesired, // largura desejada
int cyDesired, // altura desejada
UINT fuLoad // opes de carregamento
);
Dica: essa funo tambm pode ser utilizada para carregar cones e
cursores, pois ela tem o retorno do tipo HANDLE genrico (sendo necessrio
fazer type-casting para o tipo de imagem que estamos carregando).
O primeiro parmetro da funo LoadImage() recebe o identificador da
instncia do programa, se a imagem for carregada de um recurso, ou NULL
quando for carregada de um arquivo em disco. Quando estamos carregando a
152
Captulo 6 Bitmaps
153
100,
100,
154
DC de memria
Antes de aprendermos como mostrar um bitmap na rea cliente de um
programa, devemos saber como criar um DC de memria, que auxilia essa
operao.
Um DC de memria pode ser utilizado em trs ocasies principais:
quando no queremos que as modificaes do DC de vdeo sejam passadas
diretamente para a tela; quando precisamos salvar o contedo do DC de vdeo
(problema que surgiu no programa prog05-8.cpp); ou quando vamos mostrar um
bitmap na tela (o objetivo desse captulo). Nessa ltima ocasio, obrigatrio o
uso de um DC de memria, pois no h funes da Win32 API que mostrem
diretamente um bitmap na tela.
O DC de memria trabalha como o DC de vdeo podemos definir os
objetos GDI que esto selecionados nele, suas propriedades, etc. Mas,
conforme o nome diz, um DC de memria s existe na memria; para que
possamos mostrar o seu contedo, devemos copiar o mesmo para o DC de
vdeo (explicado mais adiante).
Dica: um DC de memria costuma ser chamado tambm como um DC
off-screen, devido ao fato que suas operaes e seu contedo no so
mostrados diretamente no vdeo.
A funo CreateCompatibleDC() utilizada para criar um DC de
memria compatvel com o dispositivo especificado no seu parmetro,
conforme o prottipo abaixo:
HDC CreateCompatibleDC(
HDC hdc // identificador do DC
);
Captulo 6 Bitmaps
155
156
BOOL DeleteDC(
HDC hdc // identificador do DC
);
Captulo 6 Bitmaps
157
DC particular de um programa
At agora, estvamos trabalhando com um DC de vdeo que tinha sua
memria compartilhada com o sistema e os programas em execuo. Para
programas que usam operaes de desenho intensivamente (como programas
grficos e jogos), o compartilhamento da memria do DC de vdeo no
vivel, sendo recomendado o uso de um DC com sua memria restrita
unicamente para o programa.
O uso de um DC particular extremamente simples, sendo necessrio
informar apenas o valor CS_OWNDC no membro style da estrutura WNDCLASSEX
(localizado dentro da WinMain()). Com isso, o programa j ter uma memria
reservada para o seu DC. Ainda, no necessrio liberar ou deletar o DC do
programa (como fazemos com um DC compartilhado), pois o mesmo
automaticamente liberado quando o programa finalizado.
Mostrando bitmaps
Agora que j aprendemos que para mostrar um bitmap na tela
necessrio o uso de um DC de memria, vamos ver como podemos visualizar
um bitmap.
Para isso, o que fazemos, na verdade, no mostrar o bitmap, mas sim
copiar o contedo do DC de memria para o DC de vdeo. Dessa maneira, se
um bitmap estiver selecionado no DC de memria, o mesmo ser mostrado na
tela quando houver a cpia de contedo entre os DCs (por isso criamos um
identificador do tipo HBITMAP e o selecionamos no DC de memria).
A cpia do contedo de um DC para outro pode ser feito com duas
funes: BitBlt() e StretchBlt(). O nome da funo BitBlt() (pronunciado bit
blit) vem de BIT BLock Transfer (transferncia de um bloco de bits), que
exatamente o que a funo faz. A funo StretchBlt() faz a transferncia de
um bloco de bits ajustando o tamanho da imagem de acordo com o retngulo
de destino especificado na funo, podendo alargar (se o retngulo de destino
for maior que o de origem) ou comprimir (retngulo de destino menor que de
origem) a imagem. Essa funo ainda pode inverter a visualizao da imagem
(como um espelho) tanto na horizontal quanto na vertical (veja prximo
tpico).
158
MERGEPAINT
NOTSRCCOPY
NOTSRCERASE
PATCOPY
Descrio
Preenche o retngulo de destino com a cor
preta.
Combina as cores do retngulo de origem
com o pincl selecionado no DC de destino
usando a operao AND.
Combina as cores inversas do retngulo de
origem com as cores do retngulo de destino
usando a operao OR.
Copia as cores inversas do retngulo de
origem para o destino.
Combina as cores dos retngulos de origem e
destino usando a operao OR e inverte a
cor resultante.
Copia o pincel selecionado no DC de destino
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
Captulo 6 Bitmaps
PATINVERT
PATPAINT
SRCAND
SRCCOPY
SRCERASE
SRCINVERT
SRCPAINT
WHITENESS
159
no bitmap de destino.
Combina as cores do pincel selecionado no
DC de destino com as cores do retngulo de
destino usando a operao XOR.
Combina as cores do pincel selecionado no
DC de destino com as cores inversas do
retngulo de origem usando a operao OR.
O resultado dessa operao combinada
com as cores do retngulo de destino usando
a operao OR.
Combina as cores dos retngulos de origem e
destino usando a operao AND.
Copia o retngulo de origem diretamente no
retngulo de destino.
Combina as cores inversas do retngulo de
destino com as cores do retngulo de origem
usando a operao AND.
Combina as cores dos retngulos de origem e
destino usando a operao XOR.
Combina as cores dos retngulos de origem e
destino usando a operao OR.
Preenche o retngulo de destino com a cor
branca.
Tabela 6.2: Modos de transferncia (combinao de cores entre os DCs).
BOOL StretchBlt(
HDC hdcDest, // identificador do DC de destino
int nXOriginDest, // x do canto superior esquerdo do retngulo de destino
int nYOriginDest, // y do canto superior esquerdo do retngulo de destino
int nWidthDest, // largura do retngulo de destino (canto inferior
direito)
int nHeightDest, // altura do retngulo de destino (canto inferior
direito)
HDC hdcSrc, // identificador do DC de origem
int nXOriginSrc,
nXOriginSrc, // x do canto superior esquerdo do retngulo de origem
int nYOriginSrc, // y do canto superior esquerdo do retngulo de origem
int nWidthSrc, // largura do retngulo de origem (canto inferior direito)
int nHeightSrc, // altura do retngulo de origem (canto inferior direito)
DWORD dwRop // modo de transferncia
);
160
Captulo 6 Bitmaps
161
162
Captulo 6 Bitmaps
Figura 6.2: Direo que StretchBlt() mostra bitmaps: (a) normais e (b) invertidos.
163
164
DIB Section
Os bitmaps do tipo DDB possuem a desvantagem de no podermos
acessar e manipular diretamente os seus bits, como j dito anteriormente. Por
exemplo, no podemos carregar uma imagem colorida e mostr-la em tons de
cinza, pois para isso devemos manipular os bits da imagem.
A soluo para esse problema utilizarmos bitmaps do tipo DIB, mas
como necessrio uma converso DIB para DDB para mostrar a imagem na
tela (ocorrendo perda de performance), o melhor caminho criar um objeto
GDI HBITMAP configurado como DIB Section.
Embora exista mais de uma maneira para criar e carregar um bitmap do
tipo DIB Section, apresentarei aqui a soluo mais rpida e fcil, utilizando a
funo LoadImage(), que j estudamos no comeo do captulo.
O ltimo parmetro da funo LoadImage() pode receber o valor
LR_CREATEDIBSECTION, indicando que o retorno da funo ser um objeto HBITMAP
do tipo DIB Section. Simples, no? Inclusive, j vimos um exemplo da criao
de um DIB Section com LoadImage() na Listagem 6.3.
Criar um DIB Section com LoadImage() rpido e fcil. Mas no
queremos somente isso; o nosso objetivo de usar um DIB Section manipular
os bits de uma imagem para podermos criar certos efeitos na mesma. Para
acessarmos os bits de uma imagem, devemos preencher uma estrutura
DIBSECTION:
typedef struct tagDIBSECTION {
BITMAP dsBm;
dsBm;
BITMAPINFOHEADER dsBmih;
dsBmih;
DWORD dsBitfields
dsBitfields[3];
ds[3];
HANDLE dshSection;
dshSection;
DWORD dsOffset;
dsOffset;
} DIBSECTION, *PDIBSECTION;
Captulo 6 Bitmaps
CreateDIBSection()
165
utilizando
166
Captulo 6 Bitmaps
167
luz
// R * 77
// G * 150
// B * 29
256
168
Captulo 6 Bitmaps
169
novo contraste
pow(R / 255.0, fGamma);
pow(G / 255.0, fGamma);
pow(B / 255.0, fGamma);
170
Captulo 7 Regies
H alguns anos, os programas para Windows eram montomos;
todos eles tinham o mesmo visual-padro retangular que j estamos
acostumados a trabalhar. Com o lanamento e o grande uso do tocador de
msicas digitais Winamp, essa padronizao de programas com janelas
retangulares perdeu um pouco seu territrio, pois o Winamp deu ao usurio a
possibilidade de modificar totalmente o visual do programa, atravs de imagens
conhecidas por skins. Seguindo o conceito de utilizao de skins, diversos
programas foram surgindo, onde acabaram acrescentando algo mais: a
personalizao no somente do visual, como tambm do formato da janela do
programa.
Hoje, os programas no precisam mais serem retangulares; podemos
criar programas com janelas redondas, em forma de estrela, com os cantos de
um retngulo arredondados e at mesmo com o formato de uma foto. A
criao desses tipos de janelas possvel atravs do uso de regies.
O que so regies?
Regies so objetos GDI (HRGN) que armazenam retngulos, polgonos,
elipses ou combinaes desses trs tipos de geometria, sendo possvel
preencher, executar testes da posio de cursor e modificar o formato da janela
(rea cliente) de um programa.
Dica: uma regio pode ser classificada de acordo com sua complexidade,
ou seja, de que forma ela formada. Uma regio do tipo SIMPLEREGION
quando composta por um nico retngulo e do tipo COMPLEXREGION
quando composta por mais de um retngulo. NULLREGION significa que uma
regio vazia.
Criando regies
Podemos criar quatro tipos de regies: no formato de uma elipse
(funo CreateEllipticRgn()), retangulares (funo CreateRectRgn()),
retangulares com cantos arredondados (funo CreateRoundRectRgn()) e
poligonais (funo CreatePolygonRgn()). Cada um desses formatos possuem
suas prprias funes para criao de regies, conforme mencionados entre
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
Captulo 7 Regies
171
Desenhando regies
Uma regio fica invisvel at que o programa seja instrudo para
preencher seu interior por determinado pincel, inverter as cores do seu interior
ou traar uma borda em volta da regio.
Para preencher o interior de uma regio, podemos utilizar duas
funes: FillRgn() e PaintRgn(). A primeira funo preenche a regio com as
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
172
Captulo 7 Regies
173
);
BOOL EqualRgn(
HRGN
HRGN hSrcRgn1, // identificador da primeira regio
HRGN hSrcRgn2 // identificador da segunda regio
);
174
Captulo 7 Regies
175
Regies de corte
As regies tambm atuam como regies de corte (clipping region),
especificando um espao onde qualquer operao grfica fora desse limite no
ser afetada. Isso pode ser til quando precisamos modificar apenas um
determinado pedao da rea cliente ou quando queremos que todas as
operaes sejam feitas em apenas uma regio da rea cliente, no limitando-se
regies retangulares.
Para determinar uma regio de corte, basta que criemos uma regio (e,
se necessrio, realizar operaes com regies, conforme mencionado nesse
captulo) e em seguida selecionarmos a regio no DC atual. Por exemplo,
podemos criar uma regio de corte circular em um programa que mostre um
bitmap (retangular), conforme a Listagem 7.1. Como definimos uma regio de
corte, toda a rea ocupada pela imagem que no esteja dentro da regio
delimitada no ser mostrada na tela (Figura 7.1).
//-------------------------------------------------------------------------// WindowProc() -> Processa as mensagens enviadas para o programa
//-------------------------------------------------------------------------LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
// ...
case WM_CREATE: // Janela foi criada
{
// Cria uma regio elptica
hRgn = CreateEllipticRgn(80, 50, 230, 200);
// Cria DC de memria (hMemDC global)
hDC = GetDC(hWnd);
176
Captulo 7 Regies
177
178
Captulo 7 Regies
179
180
181
Reproduzindo sons
A maneira mais rpida e simples de reproduzir um som wave
utilizando a funo PlaySound(). Essa funo pode reproduzir arquivos wave
do disco ou um som wave que est em um arquivo de recursos (que
geralmente anexado ao programa executvel em tempo de compilao),
porm, no suporta a reproduo de mltiplos sons ao mesmo tempo.
BOOL PlaySound(
LPCSTR pszSound, // arquivo ou recurso wave
HMODULE hmod, // instncia do executvel que contm o recurso (som)
DWORD fdwSound // flags
);
182
SND_FILENAME
SND_LOOP
SND_NOWAIT
SND_RESOURCE
SND_SYNC
Descrio
A funo retorna o controle para o programa
imediatamente aps o som comear a ser
reproduzido.
O parmetro pszSound recebe o nome de um
arquivo.
A funo reproduz o som repetidamente, at
que a funo seja chamada novamente com o
valor NULL no parmetro pszSound. O valor
SND_ASYNC tambm deve ser informado nesse
caso.
Se o driver de som estiver ocupado, retorna
imediatamente sem reproduzir o som.
O parmetro pszSound recebe um
identificador de recurso e o parmetro hmod
indica a instncia que contm o recurso.
O controle para o programa retornado
somente aps o som ter sido reproduzido
por completo.
Tabela 8.1: Como PlaySound() deve reproduzir um som.
183
MCI
Para trabalharmos com multimdia atravs da Win32 API, podemos
utilizar a Interface de Controle de Mdia (Media Control Interface, ou
simplesmente MCI). Essa interface nos fornece comandos padres para o
acesso e uso de diversos dispositivos multimdia, tais como som, msica e
vdeo.
O uso da MCI pode ser feito atravs de strings de comando ou por
mensagens de comando. Quando usamos strings de comando, enviamos uma
string de determinada ao para a funo mciSendString(). No caso de
mensagens de comando, usamos constantes e estruturas para manipulao da
MCI atravs da funo mciSendCommand().
Nota: o sistema operacional converte as strings de comando para
mensagens de comando antes de envi-las para o processamento do driver
MCI. Estudaremos como trabalhar com a MCI atravs de mensagens de
comando.
Vamos supor que precisamos reproduzir um arquivo wave em disco,
chamado teste.wav, e que queremos usar strings de comando. O cdigo para
essa ao ficaria como na Listagem 8.1.
// Reproduz o arquivo wave teste.wav em disco
mciSendString("play teste.wav", NULL, 0, NULL);
Listagem 8.1: Uso de strings de comando MCI.
MCI_OPEN_ELEMENT,
184
185
Descrio
Libera acesso ao dispositivo ou arquivo.
Inicia um dispositivo ou abre um arquivo.
Pausa o dispositivo.
Comea reproduo dos dados do
dispositivo.
Despausa o dispositivo.
Muda a posio atual dos dados do
dispositivo.
Pra a reproduo dos dados do dispositivo.
Tabela 8.2: Principais mensagens de comando.
186
187
188
mciDeviceID = NULL;
Listagem 8.5: Fechando um dispositivo MCI.
189
Timers
H momentos em que precisamos utilizar timers (temporizadores) em
nossos programas recursos que enviam mensagens WM_TIMER em um
determinado intervalo de tempo para serem processadas pela funo
WindowProc() (ou uma funo callback especfica para timers TimerProc(),
como veremos mais a frente). Um exemplo do uso de timers quando
queremos mostrar a hora atual no programa, sendo atualizada a cada segundo.
Seguiremos com esse exemplo para o estudo de timers.
Basicamente, o uso de timers feito da seguinte forma: cria-se um
timer com intervalo de n-milisegundos, executa-se um algoritmo a cada
intervalo do timer (ou seja, quando o timer envia a mensagem WM_TIMER ou
chama a funo TimerProc()) e o destri quando no for mais til.
Para criar um timer, usamos a funo SetTimer().
UINT_PTR SetTimer(
HWND hWnd,
hWnd, // identificador da janela associada ao timer
UINT_PTR nIDEvent,
nIDEvent, // identificador do timer
UINT uElapse,
uElapse, // intervalo do timer em milisegundos
TIMERPROC lpTimerFunc // funo callback de timers
);
190
191
192
IDT_TIMER2)
193
194
GENERIC_WRITE, 0, NULL,
hWndBotao)
195
Figura 9.1: Boto criado na rea cliente aps arquivo ser aberto/criado.
Fechando arquivos
Para fechar um arquivo, liberando a memria do seu identificador (e o
acesso ao arquivo para outros programas, dependendo do modo de
compartilhamento em que o mesmo foi aberto), chamamos a funo
CloseHandle(), que recebe o identificador do arquivo como parmetro.
BOOL CloseHandle(
HANDLE hObject // identificador do arquivo
);
Escrita em arquivos
Para escrever alguma informao no arquivo aberto, utilizamos a
funo WriteFile().
196
BOOL WriteFile(
HANDLE hFile,
hFile, // identificador do arquivo
LPCVOID lpBuffer,
lpBuffer, // buffer de dados
DWORD nNumberOfBytesToWrite,
nNumberOfBytesToWrite, // nmero de bytes a serem escritos
LPDWORD lpNumberOfBytesWritten,
lpNumberOfBytesWritten, // nmero de bytes escritos
LPOVERLAPPED lpOverlapped // buffer de sobreescrita
);
197
Leitura em arquivos
Depois de aberto o arquivo, podemos acessar seu contedo atravs da
funo ReadFile().
BOOL ReadFile(
HANDLE hFile,
hFile, // identificador do arquivo
LPVOID lpBuffer,
lpBuffer, // buffer de dados
DWORD nNumberOfBytesToRead,
nNumberOfBytesToRead, // nmero de bytes a serem lidos
LPDWORD lpNumberOfBytesRead,
lpNumberOfBytesRead, // nmero de bytes lidos
LPOVERLAPPED lpOverlapped // buffer de sobreescrita
);
198
MessageBox(hWnd,
"Contedo
MB_ICONINFORMATION | MB_OK);
lido
do
arquivo.",
"Aviso!",
Excluindo arquivos
Para apagar um arquivo em disco, usamos a funo DeleteFile(). Essa
funo recebe o nome do arquivo que ser excludo, retornando um valor
diferente de zero caso o arquivo seja apagado ou zero caso contrrio.
BOOL DeleteFile(
LPCTSTR lpFileName // nome do arquivo a ser excludo
);
199
Registro do Windows
O registro do Windows um banco de dados onde so armazenadas
informaes de configurao sobre o ambiente do sistema, dispensando o uso
de arquivos de inicializao (.ini) que eram comuns em sistemas Windows 16bit (at a verso 3.11). No registro, por exemplo, possvel armazenar as
preferncias de diferentes usurios, fazendo com que cada usurio trabalhe em
um ambiente personalizado (escolha de temas, configurao de teclado, entre
outros). Ainda, podemos associar determinado tipo de arquivo a ser aberto
com um determinado programa, como tambm podemos incluir um programa
para ser executado assim que o Windows inicializado (ou seja, assim que um
usurio faa login no sistema).
Podemos verificar o contedo e a estrutura do registro do Windows
atravs do programa regedit.exe, localizado no diretrio onde o Windows foi
instalado. O registro trabalha com uma hierarquia de chaves (keys), subchaves
(subkeys) e valores (values), conforme exemplo na Figura 9.3.
E-Book gratuito disponvel em http://www.tupinihon.com
2006-2012, Andr Kishimoto
200
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG
Descrio
Parte da chave HKEY_LOCAL_MACHINE, contm
definies de tipos de documentos,
associao de arquivos e interface de
comando (shell).
Ligao com HKEY_USERS, corresponde s
configuraes do usurio atual. Usurios
padres que no possuem configuraes
especficas utilizam as informaes de
.DEFAULT (da chave HKEY_USERS)
Armazena configuraes de hardware,
protocolos de rede e classes de software.
Utilizado para armazenar as preferncias de
cada usurio.
Configurao selecionada na subchave de
configurao de HKEY_LOCAL_MACHINE.
Tabela 9.1: Descrio das 5 principais chaves-razes.
201
202
RegCloseKey(),
LONG RegCloseKey(
HKEY hKey // identificador da chave de registro
);
"Valor
obtido
no
registro:",
Note
que,
no trecho de
HKEY_LOCAL_MACHINE\SOFTWARE\___prog09-2
MessageBox()
203
"Erro!",
do else.
LONG RegCreateKeyEx(
HKEY hKey
hKey, // chave-raz ou identificador da chave de registro
LPCTSTR lpSubKey,
lpSubKey, // subchave
DWORD Reserved,
Reserved, // reservado (deve receber zero)
LPTSTR lpClass,
lpClass, // classe da chave (recebe string null)
DWORD dwOptions,
dwOptions, // opes especiais
REGSAM samDesired,
samDesired, // modo de acesso
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
lpSecurityAttributes, // herana de processos (null)
PHKEY phkResult,
phkResult, // identificador da chave de registro
LPDWORD lpdwDisposition // ao (cria nova chave ou abre chave existente)
);
204
"Erro!",
205
206
RegQueryValueEx(),
LONG RegQueryValueEx(
HKEY hKey,
hKey, // chave-raz ou identificador da chave de registro
LPCTSTR lpValueName,
lpValueName, // nome do valor ( para valor padro de uma chave)
LPDWORD lpReserved,
lpReserved, // reservado (deve receber zero)
LPDWORD lpType,
lpType, // tipo do valor (REG_SZ, REG_DWORD, REG_BINARY, ...)
LPBYTE lpData,
lpData, // ponteiro para os dados do valor
LPDWORD lpcbData // ponteiro para o tamanho dos dados do valor
);
RegDeleteValue(),
LONG RegDeleteValue(
HKEY hKey,
hKey, // identificador da chave de registro
LPCTSTR lpValueName // nome do valor que ser excludo
);
207
208
Ou visite o site:
http://www.tupinihon.com
- Andr Kishimoto
Bibliografia
209
Bibliografia
CALVERT, Charles. Teach Yourself Windows Programming in 21 Days.
Indianopolis: Sams. 1993.
CHANDLER, Damon; FTSCH, Michael. Windows 2000 Graphics API Black
Book. Scottsdale: The Coriolis Group. 2001.
LAMOTHE, Andr. Tricks Of The Windows Game Programming Gurus
Fundamentals Of 2D And 3D Game Programming. Indianopolis: Sams. 1999.
LAMOTHE, Andr. Windows Game Programming for Dummies. New York:
Hungry Minds. 1998.
MORRISON, Michael; WEEMS, Randy. Windows 95 Game Developers Guide
Using the Game SDK. Indianopolis: Sams, 1996.
MSDN. Microsoft Developers Network. Disponvel em: http://www.msdn.com.
PAMBOUKIAN, Srgio Vicente D. Desenvolvendo Interfaces Grficas Utilizando
Win32 API e Motif 2a Edio. So Paulo: Scortecci. 2003.
PETZOLD, Charles. Programming Windows, Fifth Edition. Redmond: Microsoft
Press. 1998.
SIMON, Richard J. Windows NT Win32 API SuperBible. Corte Madera: The
Waite Group. 1997.
STEVENS, Roger T. Computer Graphics Dictionary. Hingham: Charles River
Media. 2002.
YOUNG, Michael J. Introduction To Graphics Programming For Windows 95
Vector Graphics Using C++. Chestnut Hill: Academic Press. 1996.
YUAN, Feng. Windows Graphics Programming Win32 GDI and DirectDraw.
Upper Saddle River: Prentice Hall. 2001.
210
ndice Remissivo
reas
De corte
Validando
Arquivos
.INI
Abrindo
Criando
Escrita em
Excluindo
Fechando
Leitura em
Atoms
86
91
193
193
193
195
198
195
197
208
Bitmaps
Carregando
151
Classificao
148
Compatvel
155
DDB
150
De recursos
152
Definio
148
Device-dependent bitmap
(ver DDB)
Device-independent bitmap
(ver DIB)
DIB
150
DIB Section
164
Invertidos
161
Luminance
168
Manipulando bits
166
Mostrando
157
Obtendo informaes de 153
C++
Caixas de dilogo
Comuns
Criar
Destruindo
Estilos
Mensagens
Canvas
Charles Simonyi
Classe
Da Janela
Registrando
7
208
63, 74
74
64
75
83
6
15
20
Classes
Clipping region
(ver rea de corte)
Comentrios
Controles
Barra de rolagem
Botes
Caixas de edio
Genricos
Labels
(ver Textos estticos)
Lista de seleo
Textbox
(ver Caixas de edio)
Textos estticos
Cores
Combinao
Inverso de
Paleta de
Preenchimento
RGB
Cursores
Carregar
De Recursos
Curvas de Bzier
6
8
72
66
66
69
71
65, 73
128
143
149
144
99
18
45
133
Delphi
Device context
De memria
De vdeo
Obter identificador
Off-screen
(ver DC de memria)
Particular
Pblico
Fontes
Form
103
24
154
85
85, 87
157
83
GDI
82
Graphics Device Interface
(ver GDI)
ndice
Handle
(ver Identificador)
Hello World
MS-DOS
MSDN
5
13
Nomenclatura
Notao hngara
6
6
Objetos GDI
Bitmaps
Canetas
Elipses
Excluindo
Linhas curvas
Obtendo informaes de
Pincis Padres
Pincis
Polgonos
Ponto
Retngulos
Retas
Selecionando
Textos
148
125
140
93
133
94
19
127
142
123
137
130
91
95
Platform SDK
Portabilidade
5
9
Identificador
cones
Carregar
De Recursos
10
17
42
Janelas
Criando
Destruir
Estilos de
Janela-pai
Mostrar
No-retangulares
Java
21
32
24
74
24
177
7
Macros
9
Main()
9
MCI
(ver Sons)
Mensagens
Caixa de
12
Caixas de dilogo
75
Enviando
38
Envio de
5, 27
Gerando WM_PAINT 89
Loop de
25
Processamento de
5
Processando
28
Traduzir
27
WM_PAINT
85
Menus
Definindo
54
Destruindo
58
Hot keys
56
Menu-pai
55
Modificando itens do
62
Teclas de atalho
54
Usando
57
MFC
5
Microsoft Foundation Class
(ver MFC)
MIDI
(ver Sons)
Mouse
118, 121
Recursos
Arquivos de
Bitmaps
Caixas de dilogo
Cursores
IDs
cones
Menus
Sons
Teclas de atalho
Verso do programa
Regies
Criando
De corte
Definio
Desenhando
Operaes com
Registro
Abrindo chaves do
Criando chaves do
Excluindo chaves do
Excluindo valores do
41
46
63
45
42
42
54
46
54
46
170
175
170
171
173
201
203
204
206
211
212
Fechando chaves do
Gravando valore do
Hierarquia
Obtendo valores do
Sons
MCI
Msicas MIDI
Reproduo de mltiplos
Reproduzindo
Windows Multimedia
202
205
199
206
183
188
185
181
182
Teclado
Teclas aceleradoras
(ver Teclas virtuais)
Teclas virtuais
Textos
Escrevendo
Modificando atributos
Threads
Timers
Criar
Destruir
Funo callback
Processar
111, 117
189
191
190
190
Visual Basic
Wave
(ver Sons)
Win32 API
Windows
Windows.h
WinMain()
5
5
9
9
26
95
100
208
Pgina em branco
Programao Windows:
C e Win32 API com nfase em Multimdia
Copyright 2006-2012, Andr Kishimoto
[email protected]
http://www.tupinihon.com