คุณสร้างกล่องโต้ตอบที่สร้าง โดยใช้ฟังก์ชัน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ไม่ส่งกลับข้อผิดพลาด ขั้นตอนสามารถดำเนินการคำสั่งที่ร้องขอตัวเอง หรือส่งข้อความไปยังหน้าต่างเจ้า นำไปดำเนินการคำสั่ง.