Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] Obsługa elementów menu

Ostatnio zmodyfikowano 2013-09-14 22:22
Autor Wiadomość
maniek1310
Temat założony przez niniejszego użytkownika
[WinAPI] Obsługa elementów menu
» 2013-09-14 22:08:34
Witam zrobiłem sobie menu w WinAPI ale nic się nie dzieje po naciśnięciu na Plik -> Informacje, mógłby mi ktoś pomóc przerobić switch, aby robiła jakąś czynność po kliknięciu,np. w wyżej podany Plik -> Informacje.

Tutaj macie pliki źródłowe :

funkcja switch
C/C++
switch( message ) /* handle the messages */
{
case WM_DESTROY:
    PostQuitMessage( 0 ); /* send a WM_QUIT to the message queue */
    break;
case MENU_INFO:
    MessageBox( hwnd, "To jest wiadomość.", "Wiadomość", MB_ICONINFORMATION | MB_OKCANCEL );
    break;
    default: /* for messages that we don't deal with */
    return DefWindowProc( hwnd, message, wParam, lParam );
}
main.cpp
C/C++
#include <windows.h>
#include "nagl.h"

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

/*  Make the class name into a global variable  */
char szClassName[] = "CodeBlocksWindowsApp";
int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    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( NULL, IDI_APPLICATION );
    wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    wincl.hCursor = LoadCursor( NULL, IDC_ARROW );
    wincl.lpszMenuName = NULL; /* No menu */
    wincl.cbClsExtra = 0; /* No extra bytes after the window class */
    wincl.cbWndExtra = 0; /* structure or the window instance */
    /* Use Windows's default colour 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*/
   
    HMENU hMenu = LoadMenu( hThisInstance, MAKEINTRESOURCE( 200 ) );
   
    hwnd = CreateWindowEx(
    0, /* Extended possibilites for variation */
    szClassName, /* Classname */
    "Code::Blocks Template 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, nCmdShow );
   
    /* 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;
    case MENU_INFO:
        MessageBox( hwnd, "To jest wiadomość.", "Wiadomość", MB_ICONINFORMATION | MB_OKCANCEL );
        break;
        default: /* for messages that we don't deal with */
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
   
    return 0;
}
test.rc
C/C++
#include "nagl.h"

200 MENU
{
    POPUP "&Plik"
    {
        MENUITEM "&Informacje", MENU_INFO
        MENUITEM SEPARATOR
        MENUITEM "&Zamknij", MENU_CLOSE
    }
    POPUP "&Kategoria"
    {
        MENUITEM "&Przeglądarki internetowe", MENU_PRZEGLADARKA
        MENUITEM "&Menadżery pobierania", MENU_MENADZERY
        MENUITEM "&Komunikatory", MENU_KOMUNIKATOR
    }
}
nagl.h
C/C++
#define MENU_INFO 100
#define MENU_CLOSE 101
#define MENU_PRZEGLADARKA 111
#define MENU_MENADZERY 112
#define MENU_KOMUNIKATOR 113

@pekfos mam nadzieję że teraz będzie dobrze
P-92131
pekfos
» 2013-09-14 22:14:33
MENU_INFO to nie komunikat. Powinieneś tu obsługiwać WM_COMMAND.
P-92132
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-09-14 22:16:25
A jest jakaś odrębna funkcja do obierania komunikatu z elementów menu ??
P-92133
pekfos
» 2013-09-14 22:18:54
Nie. Komunikaty dotyczące menu odbiera się w procedurze okna.
P-92136
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-09-14 22:22:19
Dopiero zauważyłem że edytowałeś post, użyłem WM_COMMAND i działa. Temat można zamknąć.
P-92138
« 1 »
  Strona 1 z 1