ตัวควบคุมทั่วไปในแถบเครื่องมือ Windows มีคุณลักษณะแบบกำหนดเองที่มีอยู่แล้ว รวมถึงระบบที่กำหนดเองกล่องโต้ตอบ ซึ่งอนุญาตให้ผู้ใช้สามารถแทรก ลบ หรือการจัดเรียงปุ่มแถบเครื่องมือ โปรแกรมประยุกต์ที่กำหนดว่า คุณสมบัติกำหนดเองจะพร้อมใช้งาน และตัวควบคุมขอบเขตซึ่งผู้ใช้สามารถกำหนดแถบเครื่องมือ?
คุณสามารถทำคุณลักษณะแบบกำหนดเองเหล่านี้พร้อมใช้งานสำหรับผู้ใช้ โดยการกำหนดแถบเครื่องมือลักษณะCCS_ADJUSTABLE คุณลักษณะกำหนดเองอนุญาตให้ผู้ใช้ลากปุ่มไปยังตำแหน่งใหม่ หรือเอาปุ่มออก โดยการลากออกจากแถบเครื่องมือ นอก ผู้ใช้สามารถคลิกสองครั้งแถบเครื่องมือเพื่อแสดงแถบเครื่องมือแบบกำหนดเองกล่องโต้ตอบ ซึ่งช่วยให้ผู้ใช้สามารถเพิ่ม ลบ และการจัดเรียงปุ่มแถบเครื่องมือ โปรแกรมประยุกต์ที่สามารถแสดงการตั้งค่ากล่องโต้ตอบ โดยใช้ฟังก์ชันสมาชิกกำหนดเอง?
ตัวควบคุมแถบเครื่องมือส่งข้อความแจ้งเตือนในหน้าต่างหลักในแต่ละขั้นตอนในกระบวนการกำหนดเอง ถ้าผู้ใช้กดแป้น SHIFT และเริ่มลากปุ่ม แถบเครื่องมือจัดการกับการดำเนินการลากโดยอัตโนมัติ แถบเครื่องมือส่งข้อความแจ้งเตือนTBN_QUERYDELETEไปหน้าต่างหลักการตรวจสอบว่า ปุ่มอาจถูกลบ การดำเนินการลากสิ้นสุดถ้าหน้าต่างหลักจะส่งกลับค่าเท็จ มิฉะนั้น แถบเครื่องมือครอบคลุมการป้อนข้อมูลของเมาส์ และรอให้ผู้ใช้ปล่อยปุ่มเมาส์?
เมื่อผู้ใช้รุ่นปุ่มเมาส์ ตัวควบคุมแถบเครื่องมือกำหนดตำแหน่งของเคอร์เซอร์ของเมาส์ ถ้าเคอร์เซอร์อยู่นอกแถบเครื่องมือ ปุ่มจะถูกลบ ถ้าเคอร์เซอร์อยู่บนปุ่มแถบเครื่องมืออื่น แถบเครื่องมือส่งข้อความแจ้งเตือนTBN_QUERYINSERTไปหน้าต่างหลักการตรวจสอบหากอาจจะแทรกปุ่มทางด้านซ้ายของปุ่มที่กำหนด ปุ่มจะถูกแทรกถ้าหน้าต่างหลักจะส่งกลับค่าTRUE มิฉะนั้น ไม่ แถบเครื่องมือส่งข้อความแจ้งเตือนTBN_TOOLBARCHANGEเพื่อส่งสัญญาณจุดสิ้นสุดของการดำเนินการลาก?
ถ้าผู้ใช้เริ่มต้นการดำเนินการลาก โดยแป้น SHIFT ค้างไว้ ตัวควบคุมแถบเครื่องมือส่งข้อความแจ้งเตือนTBN_BEGINDRAGไปยังเจ้าของหน้าต่าง โปรแกรมประยุกต์ที่ใช้รหัสที่ลากปุ่มของตนเองสามารถใช้ข้อความนี้เป็นสัญญาณเพื่อเริ่มต้นการดำเนินการลาก แถบเครื่องมือส่งข้อความแจ้งเตือนTBN_ENDDRAGเพื่อส่งสัญญาณจุดสิ้นสุดของการดำเนินการลาก?
ตัวควบคุมแถบเครื่องมือส่งข้อความแจ้งเตือนเมื่อผู้ใช้กำหนดเองแถบเครื่องมือ โดยใช้กล่องโต้ตอบกำหนดเองแถบเครื่องมือ แถบเครื่องมือส่งข้อความแจ้งเตือนTBN_BEGINADJUSTหลังจากผู้ใช้ดับเบิลคลิแถบเครื่องมือ แต่ก่อนกล่องโต้ตอบ สร้างกล่อง ถัดไป แถบเครื่องมือเริ่มต้นส่งชุดข้อมูลของข้อความแจ้งเตือนTBN_QUERYINSERTเพื่อตรวจสอบว่า แถบเครื่องมือทำให้ปุ่มถูกแทรก เมื่อหน้าต่างหลักจะส่งกลับค่าTRUEแถบเครื่องมือหยุดส่งข้อความแจ้งเตือนTBN_QUERYINSERT ถ้าหน้าต่างหลักไม่ส่งกลับค่าTRUEสำหรับปุ่มใด ๆ แถบเครื่องมือขัดกล่องโต้ตอบ?
ถัดไป ตัวควบคุมแถบเครื่องมือกำหนดถ้าปุ่มใด ๆ อาจถูกลบออกจากแถบเครื่องมือ โดยการส่งข้อความแจ้งเตือนTBN_QUERYDELETEหนึ่งสำหรับแต่ละปุ่มในแถบเครื่องมือ ส่งกลับค่าหน้าต่างหลักจริงเพื่อบ่งชี้ว่า ปุ่มที่อาจถูกลบ มิฉะนั้น จะส่งกลับค่าเป็น FALSE แถบเครื่องมือเพิ่มปุ่มแถบเครื่องมือทั้งหมดไปยังกล่องโต้ตอบ แต่ grays ที่อาจไม่ถูกลบ?
เมื่อใดก็ ตามตัวควบคุมแถบเครื่องมือต้องการข้อมูลเกี่ยวกับปุ่มในกล่องโต้ตอบกำหนดเองแถบเครื่องมือ ส่งTBN_GETBUTTONINFOข้อความแจ้งเตือน การระบุดัชนีของปุ่มที่คุณต้องการให้ข้อมูลและอยู่ของโครงสร้างแบบTBNOTIFY หน้าต่างหลักต้องกรอกรายละเอียดโครงสร้างข้อมูลเกี่ยวข้อง?
กล่องโต้ตอบกำหนดเองแถบเครื่องมือรวมถึงวิธีใช้ปุ่มและปุ่มตั้งค่าใหม่ เมื่อผู้ใช้เลือกปุ่มวิธีใช้ ตัวควบคุมแถบเครื่องมือส่งข้อความแจ้งเตือนTBN_CUSTHELP หน้าต่างหลักควรตอบสนอง โดยการแสดงข้อมูลความช่วยเหลือ กล่องโต้ตอบการส่งข้อความแจ้งเตือนTBN_RESETเมื่อผู้ใช้เลือกปุ่ม Reset ข้อความนี้สัญญาณว่า แถบเครื่องมือที่จะเตรียมใช้งานใหม่กล่องโต้ตอบ?
ข้อความเหล่านี้เป็นข้อความการWM_NOTIFYทั้งหมด และพวกเขาสามารถจัดการหน้าต่างของเจ้าของ โดยการเพิ่มรายการของข้อความแผนผังของแบบฟอร์มต่อไปนี้ในการแมปข้อความของเจ้าของหน้าต่างของคุณ:
ON_NOTIFY ( wNotifyCode, idControl, memberFxn )
wNotifyCode
ข้อความระบุรหัสการแจ้งเตือน เช่นTBN_BEGINADJUST?
idControl
ตัวระบุของตัวควบคุมที่ส่งการแจ้งเตือน?
memberFxn
สมาชิกฟังก์ชันถูกเรียกว่าเมื่อได้รับการแจ้งเตือนนี้?
ฟังก์ชันของสมาชิกจะถูกประกาศกับตัวแบบตัวอย่างต่อไปนี้:
afx_msgโมฆะmemberFxn(NMHDR *LRESULT* pNotifyStruct,ผล);
ถ้าตัวจัดการข้อความแจ้งเตือนที่ส่งกลับค่า นั้นควรใส่ไว้ในLRESULTที่ชี้ไปตามผล?
สำหรับแต่ละข้อความpNotifyStructจุดเป็นโครงสร้างแบบNMHDRหรือโครงสร้างTBNOTIFY โครงสร้างเหล่านี้อธิบายไว้ด้านล่าง:
โครงสร้างของNMHDRประกอบด้วยสมาชิกต่อไป:
typedef struct tagNMHDR {
HWND hwndFrom; nbsp / / หมายเลขอ้างอิงของการควบคุมการส่งข้อความ
UINT idFrom; / / รหัสควบคุมการส่งข้อความ
รหัส UINT / / รหัสการแจ้งเตือน ดูที่ด้านล่าง
} NMHDR(&N)
hwndFrom
หมายเลขอ้างอิงหน้าต่างของตัวควบคุมที่มีการส่งการแจ้งเตือน การแปลงหมายเลขอ้างอิงนี้เป็นตัวชี้CWndใช้CWnd::FromHandle?
idFrom
รหัสของตัวควบคุมที่ส่งการแจ้งเตือน?
รหัส
รหัสการแจ้งเตือน สมาชิกนี้สามารถเป็นค่าเฉพาะสำหรับชนิดตัวควบคุม เช่นTBN_BEGINADJUSTหรือTTN_NEEDTEXTหรือสามารถเป็นหนึ่งในค่าแจ้งทั่วไปที่แสดงอยู่ด้านล่าง:
โครงสร้างของTBNOTIFYประกอบด้วยสมาชิกต่อไป:
typedef struct {
NMHDR hdr / / ข้อมูลทั่วไปทั้งหมด WM_NOTIFY ข้อความ
int iItem / / ดัชนีของปุ่มที่เกี่ยวข้องกับการแจ้งเตือน
TBBUTTON tbButton / / ข้อมูลเกี่ยวกับปุ่มที่เกี่ยวข้องกับการแจ้งเตือน
int cchText; nbsp / / นับจำนวนของอักขระในข้อความบนปุ่ม
LPSTR lpszText; / / ที่อยู่ของข้อความบนปุ่ม
} TBNOTIFY ไกล * LPTBNOTIFY(&N)
hdr
ข้อมูลทั่วไปทั้งหมดWM_NOTIFYข้อความ?
iItem
ดัชนีของปุ่มที่เกี่ยวข้องกับการแจ้งเตือน?
tbButton
โครงสร้างของTBBUTTONที่ประกอบด้วยข้อมูลเกี่ยวกับปุ่มแถบเครื่องมือที่เกี่ยวข้องกับการแจ้งเตือน?
cchText
จำนวนของอักขระในข้อความบนปุ่ม?
lpszText
ชี้ไปยังข้อความปุ่ม?
การแจ้งเตือนที่ส่งของแถบเครื่องมือจะเป็นดังนี้: