Olá, estou tentando criar uma aplicação simples em C de Windows mas não estou conseguindo criar um menu com atalhos, eu até criei o arquivo de recursos com o menu mas os atalhos não funcionam o menu funciona na barra superior mas quando clico não acontece nada. O código ficou gigante senão eu postaria
Alguém pode dar uma luz um caminho?
Olá,
Qual a IDE você está usando?
Usa algum Framework?
Esta fazendo isso na mão?
Obrigada por responder, estou usando o codeblocks, não estou usando framework algum e sim estou fazendo o código todo a maneira antiga para aprender só então mais tarde começar a usar algum framework na empresa em que trabalho terei a oportunidade futura de ir para desenvolvimento em Windows com c++ e vai valer o sacrifício estudar isso.
Certo, entendi.
Então você vai fazer o seguinte, poste aqui no forum por favor as linhas do seu arquivo de recursos (.rc). Vá no seu arquivo principal e copie e cole aqui no forum a função CreateWindowEx(…), o laço de mensagens e a chamada CALLBACK para darmos uma olhada neles, se o arquivo de recursos estiver grande poste apenas a sessão do menu e dos accelerators. Caso sua função CALLBACK esteja grande poste somente a sessão onde você está recebendo as mensagens do Menu. Acho que com isso dá para ter uma ideia do que está acontecendo.
Se o seu menu está sendo exibido na parte superior corretamente então sua classe de janela está correta não sendo necessário postá-la.
arquivo de recursos
#include "resources.h"
IDM_MAINMENU MENU
{
MENUITEM "Dialogo &1", IDM_DIALOGUE_1
MENUITEM "Dialogo &2", IDM_DIALOGUE_2
POPUP "&Ajuda"
{
MENUITEM "Sobre \t Ctrl+O", IDM_ABOUT
MENUITEM SEPARATOR
MENUITEM "Bibliotecas \t Ctrl+L", IDM_LIBRARY
}
}
IDM_MAINMENU ACCELERATORS
{
"^o", IDM_ABOUT
"^l", IDM_LIBRARY
}
createwindow
hwnd = CreateWindowEx(0, WINDOW_CLASSNAME, WINDOW_TITLE,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, 640,480, HWND_DESKTOP,
NULL, hInstance, NULL);
laço de mensagens
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
mensagem do menu
case WM_COMMAND:
switch(lParam)
{
case IDM_ABOUT:
MessageBox(hwnd, "Sobre o programa", "Sobre", MB_OK);
break;
case IDM_LIBRARY:
MessageBox(hwnd, "Bibliotecas usadas", "Biliotecas", MB_OK);
break;
}
break;
Bom, eu não vou resolver diretamente o seu problema mas vou direcionar você em como resolver.
1) O seu arquivo de recursos está ok não vejo problemas nele.
2) Na sua função CreateWindowEx existe um problema no 10º parâmetro. Ele está NULL sendo que o esperado é o identificador do menu. Você pode carregar o identificador com LoadMenu(…) que retorna esse identificador. Seria algo assim:
HMENU hMenu LoadMenu(hwnd, MAKEINTRESOURCE(IDM_MAINMENU));
Desta forma fique atenta em usar DestroyMenu(…) antes de fechar sua janela. Esta função irá liberar a memória alocada para este menu.
3) O seu laço de mensagem está incompleto, você precisa verificar se a tecla de atalho foi ativada para isso use: TranslateAccelerator(…) o protótipo da função é :
int TranslateAccelerator(HWND hwnd, HACCEL hAccel, MSG *msg)
se o retorno for diferente de 0 seu programa não deve chamar TranslateMessage(…) nem DispatchMessage(…).
Para carregar hAccel use LoadAccelerators(…) esta função retornará o identificador do recurso das teclas de atalho.
4) Na mensagem WM_COMMAND no switch, troque lParam por LOWORD(wParam) as mensagens de menu que o windows envia para o seu programa estão em wParam.
Acho que isso ajudará você a resolver o problema do menu não funcionar. Caso não resolva, por favor avise aqui no forum que tentaremos ajudar.
Dê uma pesquisada nas funções que citei na web, como se trata da WinApi, MSDN é um bom lugar
Muito obrigada pela resposta, funcionou com as funções que você sugeriu. Eu pesquisei estas funções e entendi o funcionamento delas mas fiquei com uma duvida a função LOWORD ela converte para um numero mais baixo é isso?
Mais uma vez muito obrigada.
Então, existem LOWORD(...)
e HIWORD(...)
ambos realizam uma operação bit a bit em um inteiro de 32 bits. Em programação windows você vai encontrar dados que possuem dois inteiros de 16 bits contidos em um inteiro de 32 bits. Estas funções realizam uma operação bit a bit e separa eles.
0000.0100.0010.1001 0000.0100.1110.0111 Este é um número de 32 bits recebido em lParam nele contém as coordenadas do mouse.
Você usa LOWORD(lParam)
a operação vai retornar o LSB do binário acima que contém a coordenada x.
Você usa HIWORD(lParam)
a operação vai retornar o HSB do binário acima que contém a coordenada y.
LSB > Byte menos significativo, HSB > Byte mais significativo.
Seria mais fácil criar uma struct e armazenar as posições do mouse e disponibilizar para o sistema mas a microsoft armazenou as duas coordenadas em um inteiro de 32 bits.
A microsoft fez isso não para complicar, mas sim para aumentar a performance do seu OS pois operações bit a bit são muito rápidas, isso é feito em diversas partes do sistema porém bem encapsulado.
Obrigada novamente