bis MessageBox erscheint



  • Hallo,
    hier erstmal der Quellcode:
    [cpp]
    #include <windows.h>

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

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
    {
    static TCHAR szAppName[] = TEXT ("Systemmenü") ;
    HWND hwnd ;
    MSG msg ;
    WNDCLASS wndclass ;

    wndclass.style = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = szAppName ;

    if (!RegisterClass (&wndclass))
    { // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit
    MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
    szAppName, MB_ICONERROR) ;
    return 0 ;
    }

    hwnd = CreateWindow (szAppName, // Name der Fensterklasse
    szAppName, // Fenstertitel
    WS_OVERLAPPEDWINDOW, // Fensterstil
    CW_USEDEFAULT, // X-Position des Fensters
    CW_USEDEFAULT, // Y-Position des Fensters
    CW_USEDEFAULT, // Fensterbreite
    CW_USEDEFAULT, // Fensterhöhe
    NULL, // übergeordnetes Fenster
    NULL, // Menü
    hInstance, // Programm-Kopiezähler (Programm-ID)
    NULL) ; // zusätzliche Parameter

    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;
    HMENU hmenu = GetSystemMenu(hwnd, FALSE);
    AppendMenu(hmenu, MF_SEPARATOR, 0, 0);
    AppendMenu(hmenu, MF_STRING, 1, TEXT("INFOOO"));
    DeleteMenu(hmenu, 0, MF_BYPOSITION);
    DeleteMenu(hmenu, 1, MF_BYPOSITION);
    DeleteMenu(hmenu, 2, MF_BYPOSITION);
    DeleteMenu(hmenu, 3, MF_BYPOSITION);
    AppendMenu(hmenu, MF_STRING, 2, TEXT("Close"));
    while (GetMessage (&msg, NULL, 0, 0))
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }
    return msg.wParam ;
    }

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_CREATE:
    return 0 ;

    case WM_PAINT:
    return 0 ;

    case WM_DESTROY:
    PostQuitMessage (0) ;
    return 0 ;
    case WM_SYSCOMMAND:
    switch(LOWORD(wParam))
    {
    case 1:
    MessageBox(hwnd, TEXT("INFO"), TEXT("Information"), 0);
    GetSystemMenu(hwnd, TRUE);
    return 0;
    case 2:
    SendMessage(hwnd, WM_CLOSE, 0, 0);
    return 0;
    }
    break;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
    }

    Also das Problem ist das wenn man About klickt das es zirka 1 minute dauernt bist die MessageBox bei case 1 erscheint. was ist der Fehler?



  • verdammt close tag vergessen:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
    {
    static TCHAR szAppName[] = TEXT ("Systemmenü") ;
    HWND hwnd ;
    MSG msg ;
    WNDCLASS wndclass ;
    
    wndclass.style = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = szAppName ;
    
    if (!RegisterClass (&wndclass))
    { // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit
    MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
    szAppName, MB_ICONERROR) ;
    return 0 ;
    }
    
    hwnd = CreateWindow (szAppName, // Name der Fensterklasse
    szAppName, // Fenstertitel
    WS_OVERLAPPEDWINDOW, // Fensterstil
    CW_USEDEFAULT, // X-Position des Fensters
    CW_USEDEFAULT, // Y-Position des Fensters
    CW_USEDEFAULT, // Fensterbreite
    CW_USEDEFAULT, // Fensterhöhe
    NULL, // übergeordnetes Fenster
    NULL, // Menü
    hInstance, // Programm-Kopiezähler (Programm-ID)
    NULL) ; // zusätzliche Parameter
    
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;
    HMENU hmenu = GetSystemMenu(hwnd, FALSE);
    AppendMenu(hmenu, MF_SEPARATOR, 0, 0);
    AppendMenu(hmenu, MF_STRING, 1, TEXT("INFOOO"));
    DeleteMenu(hmenu, 0, MF_BYPOSITION);
    DeleteMenu(hmenu, 1, MF_BYPOSITION);
    DeleteMenu(hmenu, 2, MF_BYPOSITION);
    DeleteMenu(hmenu, 3, MF_BYPOSITION);
    AppendMenu(hmenu, MF_STRING, 2, TEXT("Close"));
    while (GetMessage (&msg, NULL, 0, 0))
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }
    return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_CREATE:
    return 0 ;
    
    case WM_PAINT:
    return 0 ;
    
    case WM_DESTROY:
    PostQuitMessage (0) ;
    return 0 ;
    case WM_SYSCOMMAND:
    switch(LOWORD(wParam))
    {
    case 1:
    MessageBox(hwnd, TEXT("INFO"), TEXT("Information"), 0);
    GetSystemMenu(hwnd, TRUE);
    return 0;
    case 2:
    SendMessage(hwnd, WM_CLOSE, 0, 0);
    return 0;
    }
    break;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    


  • omg das Programm braucht 40% prozessorleistung
    da muss doch was falschgelaufen sein -.-



  • 1. Wäre einrücken ganz nett
    2. versuchs mal unter WM_COMMAND und nicht WM_SYSCOMMAND
    3. Schreibt du in den cases immer ein return und am Ende des WM_ ein break, es gehört genau anders herum

    Greetz Tobi



  • 1 Minute schrieb:

    verdammt close tag vergessen:

    "Ein" Post hätte trotzdem gereicht.

    case WM_PAINT:
    return 0 ;
    

    Wer eine WM_PAINT abfängt, muss sie auch mit BeginPaint(...) EndPaint(...) verarbeiten, oder an DefWindowProc(..) weiter leiten.

    Lösch die Zeilen und es funktioniert.

    MfG Wally 😉



  • T0bi schrieb:

    3. Schreibt du in den cases immer ein return und am Ende des WM_ ein break, es gehört genau anders herum
    Greetz Tobi

    Da geb ich dir so nicht recht, für die WM_* Nachrichten sollte man den Wert zurückgeben den MS in der MSDN empfiehlt, man kann auch andere Werte returnieren z.B. DefWindowProc(..), aber dann sollte man schon wissen was man macht und warum man es so macht.



  • @case case

    Man "muss" DefWindowsProc(..) zurückgeben, wenn man die Nachricht nicht behandelt bzw. eine Begin-/EndPaint(..) Kombi aufruft. Wenn man Sie behandelt kann man eigentlich zurückgeben, was man möchte.

    MfG Wally



  • danke Wally ohne WM_PAINT gehts.


Anmelden zum Antworten