กล่องโต้ตอบกำหนดเอง

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

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

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

กระบวนการหน้าต่างสำหรับกล่องโต้ตอบกำหนดเองมีพารามิเตอร์และความต้องการเหมือนกันกับกระบวนงานหน้าต่างอื่น ๆ แตกต่างจากกระบวนงานอื่นหน้าต่าง อย่างไรก็ตาม กระบวนการหน้าต่างสำหรับกล่องโต้ตอบนี้ควรเรียกฟังก์ชันDefDlgProcแทนของฟังก์ชันDefWindowProcสำหรับข้อความใด ๆ จะไม่ประมวลผล DefDlgProcดำเนินตามคำข้อความเริ่มต้นเดียวกันที่เป็นกระบวนการหน้าต่างสำหรับกล่องโต้ตอบที่กำหนดไว้ล่วงหน้า ซึ่งรวมถึงการเรียกกระบวนงานกล่องโต้ตอบการประมวลผล.

แอปพลิเคชันสามารถสร้างกล่องโต้ตอบแบบกำหนดเอง โดย subclassing กระบวนงานหน้าต่างของกล่องโต้ตอบที่กำหนดไว้ล่วงหน้า ฟังก์ชันSetWindowLongจะช่วยให้แอปพลิเคชันที่การตั้งค่าอยู่ของหน้าต่างขั้นตอนสำหรับการกำหนดหน้าต่าง โปรแกรมประยุกต์อาจยังพยายามซับคลาส โดยใช้ฟังก์ชันSetClassLongแต่มีผลทำให้ต่อกล่องโต้ตอบทั้งหมดในระบบ ไม่ใช่แค่ที่เป็นของโปรแกรมประยุกต์.

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