יצירת לולאת הודעה

המערכת יוצרת באופן אוטומטי תור הודעות עבור כל הליך משנה. אם הליך המשנה יוצר אחד או חלונות נוספים, לולאת הודעה יש לספק; לולאת הודעה זו אחזור הודעות מתור ההודעות של הליך המשנה, ומשגר אותם הנהלים המתאימים חלון.

מכיוון המערכת מנחה הודעות בודדות החלונות ביישום, הליך משנה עליך ליצור חלון אחד לפחות לפני הפעלת לולאה ההודעה שלו. רוב היישומים מבוססי-Win32 להכיל הליך משנה יחיד שיוצר windows. יישום אופייני רושמת את מחלקת חלון עבור החלון הראשי שלו, יוצר מציג את החלון הראשי של ולאחר מכן יתחיל שלו לולאת הודעה — כל בפונקצית WinMain.

באפשרותך ליצור לולאת הודעה על-ידי שימוש בפונקציות GetMessage ו- DispatchMessage . אם היישום שלך עליך להשיג תו קלט מהמשתמש, כלול את הפונקציה TranslateMessage הלולאה. TranslateMessage מתרגם מקש וירטואלי הודעות להודעות תו. הדוגמה הבאה מציגה את לולאת הודעה בפונקציה WinMain של יישום מבוסס-Win32 פשוט.

HINSTANCE hinst; 
HWND hwndMain; 
 
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) פסקל {MSG msg; 
    WNDCLASS wc; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / הרשמה מחלקת חלון עבור החלון הראשי. 
 
    אם (! hPrevInstance) {wc.style = 0; 
        wc.lpfnWndProc = WndProc (WNDPROC); 
        wc.cbClsExtra = 0; 
        wc.cbWndExtra = 0; 
        wc.hInstance = hInstance; 
        wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION); 
        wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); 
        wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
        wc.lpszMenuName = "MainMenu"; 
        wc.lpszClassName = "MainWndClass"; 
 
        אם (!.RegisterClass(amp;wc)) מחזירה FALSE; 
    } hinst = hInstance;  / / שמור המזהה הייחודי של המופע / / ליצור את החלון הראשי. 
 
    hwndMain = של createwindow ליצירת ("MainWndClass", "דוגמה", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL (HWND), NULL (HMENU), hinst, NULL (LPVOID)); 
 
    / / אם אין אפשרות ליצור את החלון הראשי, לסיים / / היישום. 
 
    אם (! hwndMain) להחזיר שקר; 
 
    / / הצג את החלון, לצבוע את תוכנו. 
 
    מסוג ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / התחלת לולאה ההודעה. 
 
    בזמן (GetMessage (& msg, NULL (HWND), 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / להחזיר את קוד היציאה של המערכת. 
 
    לחזור msg.wParam; 
} 

 

הדוגמה הבאה מציגה לולאת הודעה עבור הליך משנה נעשה שימוש במאיצים ומציג את תיבת הדו-שיח modeless. כאשר TranslateAccelerator או IsDialogMessage מחזירה TRUE (המציין לעבד את ההודעה), TranslateMessage ו- DispatchMessage הם לא נקרא. הסיבה לכך היא TranslateAccelerator , IsDialogMessage לבצע כל תרגום הצורך ואת בשיגור הודעות.

HWND hwndMain; 
HWND hwndDlgModeless = NULL; 
MSG msg; 
HACCEL haccel; 
/ / / / לבצע אתחול וליצור בחלון הראשי. 
/ / בזמן (GetMessage (כח; msg, NULL (HWND), 0, 0)) {אם (hwndDlgModeless = = NULL (HWND) || 
            !IsDialogMessage (hwndDlgModeless, & msg) & &!TranslateAccelerator (hwndMain, haccel, & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

 

Index