0

sábado, 20 de setembro de 2008

CAIXA DE DIALOGO COR E CONTROLE ANIMADO





Ola galera não sei se vocês sabem mas na api win32 contem
alguns funções que são chamados de diálogos comuns que são
usado por programas que precisam por exemplo escolher as cores de um
determinado objeto, como por exemplo quando clicamos na
em cores/editar cores no PAINT, encontrar (ctrl +f) no
NOTEPAD entre outros, ensinarei alguns passos básicos
de como escolher uma cor com uma caixinha igual aquela
do PAINT.

E há também a possibilidade de criar controles animados
durante essa explicação você aprenderá tmbem como mostrar animação
em janelas Windows (arquivos avis sem som).

Obs:O exemplo usado aqui foi compilado no dev-ccpp.
Continuando se voce é iniciante na programção windows c/c++
tudo bem não sera um quebra cabeça, lembrando duvida so comentar.
Lembrando este tutorial esta todo dentro de comentários.
vamos a primeira parte:


/* aqui se encontra os handles das janelas */
HWND hwnd , botao,ANIMADO, hJanAni;

HBRUSH hbrush; //essa HBRUSH recebe o valor da cor
// escolhida pelo usuario
/* Declaração da Windows procedure */
LRESULT CALLBACK WindowProcedure (
HWND, UINT, WPARAM, LPARAM);
/* coloca-se o nome da classe em um variavel global */
char szClassName[ ] = "WindowsApp";

/*Bem a seguinte parte é a que eu criei uma funçãozinha
para ficar mais limpo o codigo.Essa função é usada
apenas para abria a caixa de dialogo e guardar a
cor escolhida em um HBRUSH
*/


//FUNÇÃO QUE INICIALIZA O DIALOGO PARA
// ESCOLHER E TROCAR A COR //
void PINTAR(){
//A estrutura de CHOOSECOLOR contém informação que a
//funçao ChooseColor usa para inicializar caixa de
// diálogo comum Cor. Depois que o usuário fechar caixa

//de diálogo, o de sistema retorna a informação sobre a
//seleção do usuário nesta estrutura.

CHOOSECOLOR cc; //estrutura da caixa de dialogo comum que deve
// ser preenchida com os elementos necessarios
static COLORREF acrCustClr[16]; // array de cores personalizadas
static DWORD rgbCurrent; // inicialização da seleção de cor
// Initializar CHOOSECOLOR
ZeroMemory(&cc, sizeof(CHOOSECOLOR));

cc.lStructSize = sizeof(CHOOSECOLOR);
//Especifica o tamanho em bytes da estrutura.
cc.hwndOwner = botao; //janela principal
//Este membro pode ser qualquer handle de
//janela valido ou NULL caso o caixa de
//dialogo nao tenha um janela principal.

cc.lpCustColors = (LPDWORD) acrCustClr;
cc.rgbResult = rgbCurrent;
cc.Flags = CC_FULLOPEN CC_RGBINIT;
if (ChooseColor(&cc)==TRUE)
{
hbrush = CreateSolidBrush(cc.rgbResult);
rgbCurrent = cc.rgbResult;
}

}
depois de inicializar todos elementos da estrutura é feito
uma condição ou seja se for verdadeira(TRUE) é
criado uma HBRUSH com a cor escolhida
pelo usuario, umas vez que voce sabe que a cor foi
quardada em uma HBRUSH voce pode usar onde
quizer certo, então foi isso que fizemos.
vamos ao proximo passo:

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{

PINTAR();

//Observe chamamos a função pintar logo
//Para que ela seja a primeira a ser executada

MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */

wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* Chamado pelo */
wincl.style = CS_DBLCLKS; /* Aceitar clicks duplos */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* sem menu */
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;

wincl.hbrBackground = (HBRUSH) hbrush ;
/* Registra a classe a janela , e se falhar quita o programa*/
if (!RegisterClassEx (&wincl))

return 0;
/* classe registrada, cria-se o programa*/
hwnd = CreateWindowEx (
0,
szClassName, /* Nome da classe da nossa janela principal */
"janela com conteudo animado e dialogo comum", /*Titulo da janela */
WS_OVERLAPPEDWINDOW, /* estilo */
CW_USEDEFAULT, /* Windows decide a posição */
CW_USEDEFAULT,
544, /* width */
375, /* height */
HWND_DESKTOP, /* Uma janela para desktop*/
NULL, /* Sem menu */
hThisInstance, /* handler da instancia do programa */
NULL /* não importa ainda */
);
/*Isso faz a janela visivel na tela */
ShowWindow (hwnd, nFunsterStil);


Bem vamos agora para a criação da nossa janela com uma animação,
Eu usei nesse exemplo um vídeo avi ele precisa ser semn nenhuma compressão
Para seus teste eu recomendo que use algum do próprio WINDOWS, como
Lupinha que aparece quando pesquisamos com o explorer.


a varivel ANIMADO foi criada no inicio da nossa explicação

ANIMADO = CreateWindowEx (
0,
"STATIC",
"animado",
WS_VISIBLEWS_CHILDWS_BORDER,
200, 200, 30, 30,
hwnd,
NULL,
GetModuleHandle(0),
NULL
);

A macro Animate_Create cria uma um controle animado
pois ela chama a função CreateWindow.Ela é seguida de
Animate_Open que precisa do controle animado criado com
Animate_Create e de um endereço para algum arquivo.
Animate_Play dispença comentários.

hJanAni = Animate_Create(
ANIMADO, 0, WS_VISIBLEWS_CHILD,
GetModuleHandle(0));


Animate_Open(
hJanAni,
"gis.avi");
Animate_Play(hJanAni,
1,
-1,
-1);

Bem aqui esta o loop de mensagens
Sem nehuma modificação.

while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}


/* O programa retorna um valor igual a zero dado por PostQuitMessage() */

return messages.wParam;
}


LRESULT CALLBACK WindowProcedure (HWND hwnd
, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message) /* handle de mensagens */
{

case WM_DESTROY:
PostQuitMessage (0);

/* envia um WM_QUIT para a fila de mensagem */
break;
default: /* para mensagens com as que nós não lidamos */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}


Lembrando, acompanhe atenciosamente os comentarios que são as explicaçoes
para cada item do codigo.
Obrigado pela vossa atençao e ate mais.Qualquer duvida deixa-a nos
comentários que tentarei explicar.