Ir ao conteúdo
  • Cadastre-se

Programação C++ com biblioteca windows.h para windows?


Cris.Pavani

Posts recomendados

Olá

Eu estou tentando utilizar a biblioteca windows.h junto com a linguagem C++ para APRENDER a desenvolver programa com janelas e gráficos. Depois de Aprender C, agora estou estudando C++ e também uma apostila do André Kishimoto chamado "Programação Windows: C e Win 32 API com ênfase em multimídia.

O compilador que uso é o DEV C++.

Agora estou tentando colocar alguns menus na janela seguindo a apostila mas quando eu compilo o código abre a janela sem nenhum menu. Veja o código abaixo:

#include <windows.h>

#include "PROG 03 - ARQ DE CABEÇALHO.h"

/* Declare Windows procedure */

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Make the class name into a global variable */

char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd;

MSG messages;

WNDCLASSEX wincl;

/* The Window structure */

wincl.hInstance = hThisInstance;

wincl.lpszClassName = szClassName;

wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */

wincl.style = CS_DBLCLKS; /* Catch double-clicks */

wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */

wincl.hIcon = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_MEUICONE));

wincl.hIconSm = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_MEUICONE));

wincl.hCursor = LoadCursor (hThisInstance, MAKEINTRESOURCE(IDC_MEUCURSOR));

HMENU hMenu = LoadMenu (hThisInstance, MAKEINTRESOURCE(IDM_MEUMENU));

wincl.lpszMenuName = MAKEINTRESOURCE(IDM_MEUMENU); /* No menu */

wincl.cbClsExtra = 0;

wincl.cbWndExtra = 0; /* structure or the window instance */

/* Use Windows's default color as the background of the window */

wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */

if (!RegisterClassEx (&wincl))

return 0;

/* The class is registered, let's create the program*/

hwnd = CreateWindowEx (

0, /* Extended possibilites for variation */

szClassName, /* Classname */

"Windows App", /* Title Text */

WS_OVERLAPPEDWINDOW, /* default window */

CW_USEDEFAULT, /* Windows decides the position */

CW_USEDEFAULT, /* where the window ends up on the screen */

544, /* The programs width */

375, /* and height in pixels */

HWND_DESKTOP, /* The window is a child-window to desktop */

hMenu, /* No menu */

hThisInstance, /* Program Instance handler */

NULL /* No Window Creation data */

);

/* Make the window visible on the screen */

ShowWindow (hwnd, nFunsterStil);

/* Run the message loop. It will run until GetMessage() returns 0 */

while (GetMessage (&messages, NULL, 0, 0))

{

/* Translate virtual-key messages into character messages */

TranslateMessage(&messages);

/* Send message to WindowProcedure */

DispatchMessage(&messages);

}

/* The program return-value is 0 - The value that PostQuitMessage() gave */

return messages.wParam;

}

/* This function is called by the Windows function DispatchMessage() */

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

{

switch (message) /* handle the messages */

{

case WM_DESTROY:

PostQuitMessage (0); /* send a WM_QUIT to the message queue */

break;

default: /* for messages that we don't deal with */

return DefWindowProc (hwnd, message, wParam, lParam);

}

return 0;

}

AQUI TEM O CÓDIGO DO ARQUIVO DE CABEÇALHO:

#define IDI_MEUICONE 121

#define IDC_MEUCURSOR 122

#define IDM_MEUMENU 123

E, FINALMENTE, AQUI TEM O CÓDIGO DO ARQUIVO DE RECURSOS:

#include "PROG 03 - ARQ DE CABEÇALHO.h"

IDI_MEUICONE ICON "meuicone2.ico"

IDC_MEUCURSOR CURSOR "meucursor.cur"

IDM_MEUMENU MENU

{

POPUP "menu1" , CHECKED

{

MENUITEM "item1", ID_DO_MENU1_ITEM1, CHECKED

MENUITEM "item2", ID_DO_MENU1_ITEM2, HELP

MENUITEM "itemX", ID_DO_MENU1_ITEMX, INACTIVE

}

}

O que será que está dando errado? Será que é o código? Ou o compilador? Ou a biblioteca? Eu fiz igualzinho o livro.

Agradeço a toda e qualquer ajuda.

Link para o comentário
Compartilhar em outros sites

Olá

Eu estou tentando utilizar a biblioteca windows.h junto com a linguagem C++ para APRENDER a desenvolver programa com janelas e gráficos. Depois de Aprender C, agora estou estudando C++ e também uma apostila do André Kishimoto chamado "Programação Windows: C e Win 32 API com ênfase em multimídia.

O compilador que uso é o DEV C++.

Agora estou tentando colocar alguns menus na janela seguindo a apostila mas quando eu compilo o código abre a janela sem nenhum menu. Veja o código abaixo:

#include <windows.h>

#include "PROG 03 - ARQ DE CABEÇALHO.h"

/* Declare Windows procedure */

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Make the class name into a global variable */

char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd;

MSG messages;

WNDCLASSEX wincl;

/* The Window structure */

wincl.hInstance = hThisInstance;

wincl.lpszClassName = szClassName;

wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */

wincl.style = CS_DBLCLKS; /* Catch double-clicks */

wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */

wincl.hIcon = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_MEUICONE));

wincl.hIconSm = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_MEUICONE));

wincl.hCursor = LoadCursor (hThisInstance, MAKEINTRESOURCE(IDC_MEUCURSOR));

HMENU hMenu = LoadMenu (hThisInstance, MAKEINTRESOURCE(IDM_MEUMENU));

wincl.lpszMenuName = MAKEINTRESOURCE(IDM_MEUMENU); /* No menu */

wincl.cbClsExtra = 0;

wincl.cbWndExtra = 0; /* structure or the window instance */

/* Use Windows's default color as the background of the window */

wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */

if (!RegisterClassEx (&wincl))

return 0;

/* The class is registered, let's create the program*/

hwnd = CreateWindowEx (

0, /* Extended possibilites for variation */

szClassName, /* Classname */

"Windows App", /* Title Text */

WS_OVERLAPPEDWINDOW, /* default window */

CW_USEDEFAULT, /* Windows decides the position */

CW_USEDEFAULT, /* where the window ends up on the screen */

544, /* The programs width */

375, /* and height in pixels */

HWND_DESKTOP, /* The window is a child-window to desktop */

hMenu, /* No menu */

hThisInstance, /* Program Instance handler */

NULL /* No Window Creation data */

);

/* Make the window visible on the screen */

ShowWindow (hwnd, nFunsterStil);

/* Run the message loop. It will run until GetMessage() returns 0 */

while (GetMessage (&messages, NULL, 0, 0))

{

/* Translate virtual-key messages into character messages */

TranslateMessage(&messages);

/* Send message to WindowProcedure */

DispatchMessage(&messages);

}

/* The program return-value is 0 - The value that PostQuitMessage() gave */

return messages.wParam;

}

/* This function is called by the Windows function DispatchMessage() */

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

{

switch (message) /* handle the messages */

{

case WM_DESTROY:

PostQuitMessage (0); /* send a WM_QUIT to the message queue */

break;

default: /* for messages that we don't deal with */

return DefWindowProc (hwnd, message, wParam, lParam);

}

return 0;

}

AQUI TEM O CÓDIGO DO ARQUIVO DE CABEÇALHO:

#define IDI_MEUICONE 121

#define IDC_MEUCURSOR 122

#define IDM_MEUMENU 123

E, FINALMENTE, AQUI TEM O CÓDIGO DO ARQUIVO DE RECURSOS:

#include "PROG 03 - ARQ DE CABEÇALHO.h"

IDI_MEUICONE ICON "meuicone2.ico"

IDC_MEUCURSOR CURSOR "meucursor.cur"

IDM_MEUMENU MENU

{

POPUP "menu1" , CHECKED

{

MENUITEM "item1", ID_DO_MENU1_ITEM1, CHECKED

MENUITEM "item2", ID_DO_MENU1_ITEM2, HELP

MENUITEM "itemX", ID_DO_MENU1_ITEMX, INACTIVE

}

}

O que será que está dando errado? Será que é o código? Ou o compilador? Ou a biblioteca? Eu fiz igualzinho o livro.

Agradeço a toda e qualquer ajuda.

Link para o comentário
Compartilhar em outros sites

Olha man, do jeito que você postou fica difícil de ler, use a tag code e coloque com a indentação o código pra ajudar quem tá lendo.

No mais, se você vai estudar a sério, prefira o gcc com netbeans/eclipse ou o visual c++ no visual studio express. Dev é muito ruim e permissivo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olha man, do jeito que você postou fica difícil de ler, use a tag code e coloque com a indentação o código pra ajudar quem tá lendo.

No mais, se você vai estudar a sério, prefira o gcc com netbeans/eclipse ou o visual c++ no visual studio express. Dev é muito ruim e permissivo.


#include <windows.h>
#include "PROG 03 - ARQ DE CABEÇALHO.h"

/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";

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

{
HWND hwnd; /* This is the handle for our window */
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; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_MEUICONE));
wincl.hIconSm = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_MEUICONE));
wincl.hCursor = LoadCursor (hThisInstance, MAKEINTRESOURCE(IDC_MEUCURSOR));
HMENU hMenu = LoadMenu( hThisInstance, MAKEINTRESOURCE(IDM_MEUMENU));
wincl.lpszMenuName = MAKEINTRESOURCE(IDM_MEUMENU);
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;

/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Windows App", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
hMenu, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);

/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);

/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}


/* This function is called by the Windows function DispatchMessage() */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);

case WM_KEYDOWN: //OBTÉM TECLA VIRTUAL
{
if (wParam == VK_F3) //VERIFICA SE A TECLA F3 FOI PRESSIONADA
SendMessage(hwnd, WM_SETTEXT, (WPARAM)0, (LPARAM)"F3 PRESSIONADA"); //ENVIA A MENSAGEM PARA A JANELA PRINCIPAL
return (0);
} break;
}

return 0;
}

ARQUIVO DE CABEÇALHO

#define IDI_MEUICONE 121
#define IDC_MEUCURSOR 122
#define IDM_MEUMENU 123

E O ARQUIVO DE RECURSO


#include "PROG 03 - ARQ DE CABEÇALHO.h"

IDI_MEUICONE ICON "meuicone.jpg"
IDC_MEUCURSOR CURSOR "meucursor.cur"

IDM_MEUMENU MENU
{
POPUP "menu1" , tipos (opcional)
{
MENUITEM "item1", ID_DO_MENU1_ITEM1, CHECKED
MENUITEM "item2", ID_DO_MENU1_ITEM2, HELP
MENUITEM "itemX", ID_DO_MENU1_ITEMX, INACTIVE
}

POPUP "menu2" , tipos (opcional)
{
MENUITEM "item1", ID_DO_MENU1_ITEM1, MENUBREAK
MENUITEM "item2", ID_DO_MENU1_ITEM2, MENUBARBREAK
MENUITEM "itemX", ID_DO_MENU1_ITEMX, HELP
}
}

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Cristhoferson,

Dei uma ajeitada no seu código. O problema era com o arquivo de recursos e depois foi necessário complementar o arquivo de cabeçalho. Outra coisa, para facilitar, evite usar nomes de arquivos complexos, com espaços, etc.

resource.h

#define IDI_MEUICONE 121
#define IDC_MEUCURSOR 122
#define IDM_MEUMENU 123
#define ID_DO_MENU1_ITEM1 124
#define ID_DO_MENU1_ITEM2 125
#define ID_DO_MENU1_ITEMX 126
#define ID_DO_MENU2_ITEM1 127
#define ID_DO_MENU2_ITEM2 128
#define ID_DO_MENU2_ITEMX 129

resource.rc

#include "resource.h"

IDI_MEUICONE ICON "meuicone.ico"
IDC_MEUCURSOR CURSOR "meucursor.cur"

IDM_MEUMENU MENU
{
POPUP "Menu &1"
{
MENUITEM "Item 1", ID_DO_MENU1_ITEM1, CHECKED
MENUITEM "Item 2", ID_DO_MENU1_ITEM2, HELP
MENUITEM "Item X", ID_DO_MENU1_ITEMX, INACTIVE
}

POPUP "Menu &2"
{
MENUITEM "Item 1", ID_DO_MENU2_ITEM1, MENUBREAK
MENUITEM "Item 2", ID_DO_MENU2_ITEM2, MENUBARBREAK
MENUITEM "Item X", ID_DO_MENU2_ITEMX, HELP
}
}

sample.c (o seu programa; altere onde aparece em negrito)

#include <windows.h>
[B]#include "resource.h"[/B]

/* Declare Windows procedure */

Dê uma olhada:

sample.png

Outra coisa, para o ícone da aplicação, use um .ICO.

:natal:

LNW

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olha, sem querer ser chato de responder sua pergunta sem responder, mas já fazendo, por que você está usando a biblioteca nativa do windows? Use alguma cross plataform, além de, geralmente, serem mais bem feitas, são bem menos chatas que a do Windows, recomendo WxWidgets. Ah, e larga desse dev-cpp, use pelo menos CodeBlocks.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Olha, sem querer ser chato de responder sua pergunta sem responder, mas já fazendo, por que você está usando a biblioteca nativa do windows? Use alguma cross plataform, além de, geralmente, serem mais bem feitas, são bem menos chatas que a do Windows, recomendo WxWidgets. Ah, e larga desse dev-cpp, use pelo menos CodeBlocks.

O negócio é o seguinte: eu não entendo absolutamente nada a respeito de interface gráfica para windows, linux , mac, nada.

Eu estudei lógica de programação, já utilizei o pascal zim, para aprender, estudei dois livros a respeito da linguagem C e vária apostilas, e estou estudando C++ pelo Deitel de forma que as linguagens são relativamente tranquilas pra mim. E nesses estudos eu usei o compilador DEV-CPP

Porém eu fiquei aguniado porque depois de ler tudo isso, não queria fazer somente aqueles programas de MS-DOS com linha de comando. Eu quero fazer programas com gráficos para windows. Então dei uma pesquisada e nas primeiras pesquisas vieram muitos termos que eu não entendia. Mas como eu vi que tinha a biblioteca do windows (windows.h) com o DEV-CPP, achei que seria mais fácil e comecei a pesquisar. E já comecei a estudar o livro que o Edmorte indicou.

Outro problema é que eu não faço faculdade, estudo por conta, sozinho, só conto com a ajuda da internet. E por não saber nem os termos que existem fico com dificuldade de perguntar o que eu quero com clareza. Mas a única coisa que eu quero é, em primeiro lugar desenvolver programas MUITO simples com interface gráfica e ir aumentando a complexidade deles, e em segundo lugar, da mesma forma, desenvolver jogos simples e depois ir aumentando a complexidade conforme vou aprendendo.

A única coisa que eu quero é ajuda para dar o ponta-pé-inicial, entende?, a direção inicial de alguém que tenha experiência.

Ainda mais agora que estou começando na interface gráfica.

Para você ter ideia eu nem sei o que é "cross plataform" que você citou.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O negócio é o seguinte: eu não entendo absolutamente nada a respeito de interface gráfica para windows, linux , mac, nada.

Eu estudei lógica de programação, já utilizei o pascal zim, para aprender, estudei dois livros a respeito da linguagem C e vária apostilas, e estou estudando C++ pelo Deitel de forma que as linguagens são relativamente tranquilas pra mim. E nesses estudos eu usei o compilador DEV-CPP

Porém eu fiquei aguniado porque depois de ler tudo isso, não queria fazer somente aqueles programas de MS-DOS com linha de comando. Eu quero fazer programas com gráficos para windows. Então dei uma pesquisada e nas primeiras pesquisas vieram muitos termos que eu não entendia. Mas como eu vi que tinha a biblioteca do windows (windows.h) com o DEV-CPP, achei que seria mais fácil e comecei a pesquisar. E já comecei a estudar o livro que o Edmorte indicou.

Outro problema é que eu não faço faculdade, estudo por conta, sozinho, só conto com a ajuda da internet. E por não saber nem os termos que existem fico com dificuldade de perguntar o que eu quero com clareza. Mas a única coisa que eu quero é, em primeiro lugar desenvolver programas MUITO simples com interface gráfica e ir aumentando a complexidade deles, e em segundo lugar, da mesma forma, desenvolver jogos simples e depois ir aumentando a complexidade conforme vou aprendendo.

A única coisa que eu quero é ajuda para dar o ponta-pé-inicial, entende?, a direção inicial de alguém que tenha experiência.

Ainda mais agora que estou começando na interface gráfica.

Para você ter ideia eu nem sei o que é "cross plataform" que você citou.

Eu também sou autodidata, não fiz faculdade nem curso algum, conheço bem essa dificuldade, crossplatform, ou multiplataforma, é um programa que possui código portável para múltiplas plataformas, ou seja, ele pode ser compilado em windows, mac e linux(geralmente, mas não obrigatoriamente). Mas de fato pode ser importante você aprender a biblioteca Windows, um dia você pode se deparar com um código feito nela e precisar saber usa-la. ^.^

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 5 meses depois...

O comentário do Eventide faz sentido principalmente porque você não está programando C++, mas em C "puro" usando diretamente a API nativa do Windows.

 

Se quiser programar em C++, sugiro que você procure criar seus aplicativos usando algum framework como MFC do Visual C++, OWL (antigo mas é bem poderoso) da Borland, etc.

 

Aí sim poderá explorar mais os recursos de POO do C++

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 4 anos depois...

sou novo  na linguagens de programação, já dei olhada no Pascal, VB, etc, mas o que me tocou mesmo é a linguagem C, e quero ser mesmo capaz de resolver vários problemas com est´a mesma linguagem.

 

a minha questão é seguinte>

será que alguém pode direcionar-me um livro em formato pdf para programar as interfaces gráficos pois estou cansado de programar apenas em consolo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!