Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [WIN 32 C++] Problema Message Loop

    Ciao ragazzi, non capisco una cosa in questo semplice programma:

    [/CODE](Quello che non capisco compare nel MessageBox prima del Message Loop)

    [CODE]
    #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("HelloWin");
    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))
    {
    MessageBox(NULL,"Errore nella chiamata a Register Class",szAppName,MB_ICONERROR);
    return 0;
    }

    hwnd = CreateWindow(
    szAppName,
    "Hello program",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL
    );
    ShowWindow(hwnd,iCmdShow);
    UpdateWindow(hwnd);
    MessageBox(NULL,"La domanda è: perchè funziona? \
    il message loop non dovrebbe partire finchè non premo OK!",
    "PERCHE'?????",0);
    while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    return msg.wParam;
    }

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    HDC hdc;
    PAINTSTRUCT ps;

    switch (message)
    {
    case WM_CREATE:
    return 0;
    case WM_PAINT:
    hdc = BeginPaint(hwnd,&ps);
    TextOut(hdc,100,100,"LPCWSTR",sizeof("LPCWSTR"));
    EndPaint(hwnd,&ps);
    return 0;
    case WM_CLOSE:
    PostQuitMessage(0);
    return 0;
    case WM_SIZE:
    InvalidateRect(hwnd,NULL,TRUE);
    return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
    }

  2. #2
    Non capisco se il problema sia la UpdateWindow o la MessageBox.
    Se è la MessageBox, essa funziona perché MessageBox, come DialogBox e compagnia bella, includono al loro interno una message pump (altrimenti come farebbero ad arrivare i messaggi alle message box?); di conseguenza i messaggi continuano ad essere forniti alle finestre. La finestra padre, tuttavia, viene disabilitata, e per questo buona parte degli eventi "normali" non le arrivano.
    Se è la UpdateWindow, non c'è nulla di strano, dato che essa non mette il WM_PAINT nella coda dei messaggi (PostMessage), ma lo invia richiamando direttamente la wndproc (SendMessage).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    ecco!

    Ecco perchè!
    C'è la message pump! mi pareva strano! bene!
    comunque tra PostMessage() e SendMessage() c'è qualche differenza?
    cosa cambia a usarle una dopo l'altra o una sola delle due, forse che il thread che gestisce il messaggio con una delle due viene gestito subito, invece con l'altra aspetta che la procedura ritorni il valore?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5

    Re: ecco!

    Originariamente inviato da kirakira93
    comunque tra PostMessage() e SendMessage() c'è qualche differenza?
    In estrema sintesi:
    PostMessage: il messaggio viene messo in coda, e viene gestito quando è il suo turno; il chiamante non ottiene il valore restituito dalla wndproc.
    SendMessage: il messaggio viene inviato direttamente, la wndproc viene richiamata immediatamente e SendMessage fornisce al chiamante il valore restituito dalla wndproc. Concettualmente è simile al richiamare direttamente la wndproc.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Grazie

    Grazie ad entrambi!

  7. #7
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.