יצירת תיבת דו-שיח Modeless

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

בדוגמה הבאה, היישום יציג תיבת הדו-שיח modeless — אם הוא כבר לא מוצג — כאשר המשתמש בוחר בפקודה מעבר אל מתפריט היישום. תיבת הדו-שיח מכילה פקד עריכה, תיבת הסימון ואת הלחצנים אישור וביטול. התבנית בתיבת הדו-שיח משאב בקובץ הפעלה של היישום, יש מזהה המשאב DLG_GOTO. המשתמש מזין מספר שורה בפקד העריכה, תבדוק את תיבת הסימון כדי לציין מספר השורה הוא יחסית לשורה הנוכחית. מזהי הבקרה הם ID_LINE, ID_ABSREL, IDOK, IDCANCEL.

משפטי בחלק הראשון של הדוגמה ליצור תיבת הדו-שיח modeless. הצהרות אלה, בהליך חלון בחלון הראשי של היישום, ליצור בתיבת הדו-שיח כאשר הפרוצדורה של חלון מקבל הודעה WM_COMMAND נתקל מזהה פקודה IDM_GOTO, אך רק אם משתנה גלובלי hwndGoto אינה מכילה כבר נקודת אחיזה חוקית. החלק השני של הדוגמה היא לולאה המסר העיקרי של היישום. הלולאה כוללת את הפונקציה IsDialogMessage כדי להבטיח כי המשתמש יכול להשתמש בממשק לוח המקשים בתיבת הדו-שיח תיבת הדו-שיח modeless זו. החלק השלישי של הדוגמה היא ההליך של תיבת הדו-שיח. ההליך מאחזר את התוכן של פקד עריכה ובתיבת הסימון כאשר המשתמש בוחר בלחצן אישור. ההליך הורסת את תיבת הדו-שיח כאשר המשתמש בוחר בלחצן ביטול.

HWND hwndGoto = NULL;  / / חלון לטפל בתיבת הדו-שיח. 
    . 
    . 
 
    מקרה WM_COMMAND: מעבר (LOWORD(wParam)) {מקרה IDM_GOTO: אם (!IsWindow(hwndGoto)) {hwndGoto = CreateDialog (hinst, MAKEINTRESOURCE(DLG_GOTO), hwnd, GoToProc (DLGPROC)); 
                    מסוג ShowWindow (hwndGoto, SW_SHOW); 
                } 
                break; 
        } להחזיר 0 L 

 

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

לולאת הודעה עבור יישום מורכב המשפטים הבאים:

בעוד (GetMessage (כח; הודעת NULL, NULL, NULL)) {אם (!IsWindow(hwndGoto) || !IsDialogMessage (hwndGoto, & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

 

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

המשפטים הבאים מגדירים את הפרוצדורה תיבת הדו-שיח:

int iLine;             / / מקבל שורה מספר BOOL fRelative;        / / מקבל מצב תיבת הסימון GoToProc BOOL להתקשרות חזרה (HWND hwndDlg, ההודעה UINT, WP&ARAM wParam, LPARAM lParam) {BOOL fError; 
 
    מתג (הודעה) {מקרה WM_INITDIALOG: CheckDlgButton (hwndDlg, ID_ABSREL, fRelative); 
            החזרת TRUE; 
 
        מקרה WM_COMMAND: מעבר (LOWORD(wParam)) {מקרה IDOK: fRelative = IsDlgButtonChecked (hwndDlg, ID_ABSREL); 
                    iLine = GetDlgItemInt (hwndDlg, ID_LINE, כח; fError, fRelative); 
                    אם (fError) {MessageBox (hwndDlg, SZINVALIDNUMBER, SZGOTOERR, MB_OK); 
                        SendDlgItemMessage (hwndDlg, ID_LINE, EM_SETSEL, 0,-1 L); 
                    } אחר / / ליידע את חלון הבעלים לשאת / / לבצע את הפקודה. 
 
                    החזרת TRUE; 
 
                מקרה IDCANCEL: DestroyWindow(hwndDlg); 
                    hwndGoto = NULL; 
                    החזרת TRUE; 
            }} להחזיר שקר; 
} 

 

בפסקאות הקודמות, ההליך מעבד את ההודעות WM_INITDIALOG ו- WM_COMMAND . במהלך WM_INITDIALOG עיבוד, ההליך מאתחלת את תיבת הסימון על-ידי העברת הערך הנוכחי של משתנה גלובלי fRelative ל- CheckDlgButton. ההליך ומחזירה TRUE כדי לכוון את המערכת כדי להגדיר את מוקד הקלט של ברירת המחדל.

במהלך עיבוד WM_COMMAND, ההליך סוגר את תיבת הדו-שיח רק אם המשתמש בוחר בלחצן ביטול — כלומר, לחצן נתקל מזהה IDCANCEL. ההליך עליך לקרוא DestroyWindow כדי לסגור את תיבת הדו-שיח modeless. שים לב ההליך מגדיר גם את המשתנה hwndGoto ל- NULL כדי להבטיח הצהרות אחרות התלויים משתנה זה לפעול כראוי.

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

Index