0

quinta-feira, 18 de setembro de 2008

criaçao de controle animado e caixas de dialogo para escolher cor

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 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á como mostrar animação

em janelas Windows.



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:





#include

#include

#include

#include



/* 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(){


CHOOSECOLOR cc; //estrutura da caixa de dialogo comum

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

cc.hwndOwner = botao; //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 classed a janela , e se falhar quita o programa*/

if (!RegisterClassEx (&wincl))a

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.



Essa varivel foi criada no inicio da nossa explicação



ANIMADO = CreateWindowEx (

0,

"STATIC",

"animado",

WS_VISIBLE|WS_CHILD|WS_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_VISIBLE|WS_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;

}



Bem galera qualquer duvida deixa-a nos comentários que tentarei explicar.