การสร้างกล่องโต้ตอบสร้าง

คุณสร้างกล่องโต้ตอบที่สร้าง โดยใช้ฟังก์ชันCreateDialogระบุรหัสหรือชื่อของทรัพยากรที่แม่แบบกล่องโต้ตอบและอยู่ของกระบวนงานกล่องโต้ตอบ CreateDialogโหลดแม่แบบ สร้างกล่องโต้ตอบ และเลือกแสดง โปรแกรมประยุกต์ของคุณจะรับผิดชอบสำหรับการเรียก และการจัดส่งผู้ใช้ข้อความป้อนข้อมูลลงในกระบวนงานของกล่องโต้ตอบ.

ในตัวอย่างดังต่อไปนี้ แอพลิเคชันจะแสดงกล่องโต้ตอบสร้าง — ถ้ามันไม่มีแสดง — เมื่อผู้ใช้เลือกคำสั่งไปจากเมนูโปรแกรมประยุกต์ที่มีอยู่ กล่องโต้ตอบประกอบด้วยตัวควบคุมการแก้ไข กล่องกาเครื่องหมาย และปุ่ม OK และยกเลิก แบบกล่องโต้ตอบเป็นทรัพยากรในแฟ้มที่ปฏิบัติการได้ของโปรแกรมประยุกต์ และมีตัวระบุทรัพยากร DLG_GOTO ผู้ใช้ป้อนหมายเลขบรรทัดในตัวควบคุมการแก้ไข และตรวจสอบที่กล่องกาเครื่องหมายเพื่อระบุว่า เป็นหมายเลขของบรรทัดที่สัมพันธ์กับบรรทัดปัจจุบัน ตัวระบุการควบคุมคือ ID_LINE, ID_ABSREL, IDOK และ IDCANCEL.

คำสั่งในส่วนแรกของตัวอย่างสร้างกล่องโต้ตอบสร้าง คำสั่งเหล่านี้ ในกระบวนงานหน้าต่างสำหรับหน้าต่างหลักของโปรแกรมประยุกต์ สร้างกล่องโต้ตอบ เมื่อกระบวนการหน้าต่างได้รับข้อความWM_COMMANDมีตัวระบุคำสั่ง IDM_GOTO แต่เฉพาะใน กรณีตัวแปรส่วนกลางhwndGotoไม่ประกอบด้วยหมายเลขอ้างอิงถูกต้อง ส่วนสองของตัวอย่างเป็นการวนรอบข้อความหลักของโปรแกรมประยุกต์ การวนรอบมีฟังก์ชันIsDialogMessageเพื่อให้แน่ใจว่า ผู้ใช้สามารถใช้อินเทอร์เฟซแป้นพิมพ์กล่องโต้ตอบในกล่องโต้ตอบสร้างนี้ ส่วนที่สามของตัวอย่างเป็นขั้นตอนในกล่องโต้ตอบ กระบวนการดึงข้อมูลเนื้อหาของในกล่องกาเครื่องหมายและตัวควบคุมการแก้ไขเมื่อผู้ใช้เลือกปุ่ม'ตกลง' ขั้นตอนเมื่อผู้ใช้เลือกปุ่มยกเลิกกล่องโต้ตอบการขัด.

HWND hwndGoto = NULL  / / หน้าต่างจัดการของกล่องโต้ตอบ 
    . 
    . 
 
    กรณี WM_COMMAND: สลับ (LOWORD(wParam)) {กรณี IDM_GOTO: if (IsWindow(hwndGoto)) { hwndGoto = CreateDialog (hinst, MAKEINTRESOURCE(DLG_GOTO), hwnd, GoToProc (DLGPROC)); 
                    ShowWindow (hwndGoto, SW_SHOW); 
                } 
                break; 
        } กลับ 0 L 

 

ในคำสั่งก่อนหน้านี้CreateDialogเรียกว่าถ้าhwndGotoไม่เท่านั้นไม่ประกอบด้วยตัวจัดการหน้าต่างถูกต้อง นี้ช่วยให้แน่ใจว่า แอปพลิเคชันไม่แสดงผลกล่องโต้ตอบสองในเวลาเดียวกัน การสนับสนุนนี้วิธีการตรวจสอบ กระบวนการโต้ตอบต้องตั้งค่าhwndGotoเป็น NULL เมื่อมันขัดกล่องโต้ตอบ.

การวนรอบข้อความสำหรับโปรแกรมประยุกต์ที่ประกอบด้วยคำสั่งต่อไปนี้:

ในขณะที่ (GetMessage (แอมป์ msg, NULL, NULL, NULL)) {ถ้า (IsWindow(hwndGoto) || !IsDialogMessage (hwndGoto, & msg)) {TranslateMessage(&msg) 
        DispatchMessage(&msg) 
    } 
} 

 

การวนรอบตรวจสอบความถูกต้องของหมายเลขอ้างอิงหน้าต่างสำหรับกล่องโต้ตอบ และเรียกฟังก์ชันIsDialogMessageเท่านั้น ถ้าหมายเลขอ้างอิงไม่ถูกต้อง IsDialogMessageประมวลผลข้อความเท่านั้นถ้ามันเป็นของกล่องโต้ตอบ จะส่งกลับค่า FALSE มิฉะนั้น และการวนรอบ dispatches ข้อความไปยังหน้าต่างที่เหมาะสม.

ขั้นตอนในกล่องโต้ตอบกำหนดคำสั่งต่อไปนี้:

int iLine             / / รับบรรทัดหมายเลข BOOL fRelative        / / ได้รับสถานะของกล่องกาเครื่องหมายเรียกกลับ BOOL GoToProc (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); 
                    } else / / แจ้งเจ้าของหน้าต่างเพื่อกระทำ / / คำสั่ง 
 
                    ส่งกลับ TRUE 
 
                กรณี IDCANCEL: DestroyWindow(hwndDlg) 
                    hwndGoto = NULL 
                    ส่งกลับ TRUE 
            }} ส่งกลับ FALSE 
} 

 

ในคำสั่งก่อนหน้านี้ กระบวนการประมวลผลข้อความWM_INITDIALOGและWM_COMMAND ในระหว่างการประมวลผล WM_INITDIALOG กระบวนการเริ่มต้นกล่องกาเครื่องหมาย ด้วยการส่งผ่านค่าปัจจุบันของตัวแปรส่วนกลางfRelativeกับCheckDlgButton กระบวนการแล้วส่งกลับค่า TRUE เมื่อต้องการนำระบบการตั้งค่าเริ่มต้นสำหรับการป้อนค่าโฟกัส.

ในระหว่างการประมวลผล WM_COMMAND กระบวนการปิดกล่องโต้ตอบเฉพาะในกรณีที่ผู้ใช้เลือกปุ่มยกเลิก — นั่นคือ ปุ่มมีตัวระบุ IDCANCEL กระบวนการต้องโทรDestroyWindowเพื่อปิดกล่องโต้ตอบสร้าง สังเกตเห็นว่า กระบวนการนี้สามารถตั้งค่าตัวแปรhwndGotoให้เป็น NULL เพื่อให้แน่ใจว่า คำสั่งอื่น ๆ ที่ขึ้นกับตัวแปรนี้ทำงานถูกต้อง.

ถ้าผู้ใช้เลือกปุ่ม OK กระบวนการดึงสถานะปัจจุบันของกล่องกาเครื่องหมาย และกำหนดให้กับตัวแปรfRelative นั้นแล้วใช้ตัวแปรในการดึงข้อมูลหมายเลขบรรทัดจากตัวควบคุมการแก้ไข GetDlgItemIntแปลข้อความในตัวควบคุมการแก้ไขที่เป็นจำนวนเต็ม ค่าของfRelativeกำหนดว่า ฟังก์ชันการแปลหมายเลขที่เป็นค่ามีการเซ็นชื่อ หรือไม่มีลายเซ็น การแก้ไขตัวควบคุมข้อความไม่ใช่ ตัวเลขที่ถูกต้องGetDlgItemIntตั้งค่าของตัวแปรfErrorไปไม่ใช่ศูนย์ กระบวนการตรวจสอบค่านี้เพื่อกำหนดว่าจะแสดงข้อความแสดงข้อผิดพลาด หรือดำเนินการคำสั่ง ในกรณีของข้อผิดพลาด กระบวนการกล่องโต้ตอบการส่งข้อความไปยังตัวควบคุมแก้ไข นำให้เลือกข้อความในตัวควบคุมเพื่อให้ผู้ใช้สามารถแทนได้อย่างง่ายดายมัน ถ้าGetDlgItemIntไม่ส่งกลับข้อผิดพลาด ขั้นตอนสามารถดำเนินการคำสั่งที่ร้องขอตัวเอง หรือส่งข้อความไปยังหน้าต่างเจ้า นำไปดำเนินการคำสั่ง.

Index