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.