TN029: แยก Windows

หมายเหตุนี้อธิบายถึงคลา MFC CSplitterWndซึ่งถูกใช้เมื่อต้อง การให้หน้าต่าง splits และ การจัดการการปรับขนาดของหน้าต่างบานหน้าต่างอื่น?

หมายเหตุnbsp  โปรดแน่ใจอ่าน20 หมายเหตุทางเทคนิคเกี่ยวกับการใช้รหัสและช่วง ID ที่ถูกต้อง(&N)?

แยกลักษณะ

CSplitterWndการสนับสนุนสองลักษณะที่แตกต่างกันของการแบ่ง windows?

ใน "คง splitters บานหน้าต่างถูกสร้างเมื่อมีสร้างหน้าต่างแยก และใบสั่งและหมายเลขของบานหน้าต่างไม่เคยเปลี่ยน แถบตัวแยกจะใช้เพื่อปรับขนาดบานหน้าต่างงานต่าง ๆ และบานหน้าต่างงานต่าง ๆ มักเป็นของชั้นมุมมองที่แตกต่างกัน ตัวแก้ไขกราฟิกของ Visual c ++และจัดการแฟ้ม Windows มีตัวอย่างของโปรแกรมที่ใช้ลักษณะที่แยกนี้ ไม่ใช้กล่องแยก โดยแบ่งลักษณะนี้?

ใน "แบบไดนามิก splitters บานหน้าต่างเพิ่มเติมจะถูกสร้าง และทำลายเป็นมุมผู้ใช้ splits un-splits ใหม่มองและ แยกนี้เริ่มต้นออกกับมุมมองเดียว และแยกกล่องไว้เพื่อเริ่มการแบ่ง ถ้ามุมมองเป็นแยกในทิศทางเดียว มุมมองเพิ่มเติมวัตถุถูกสร้างเพื่อแสดงบานหน้าต่างใหม่แบบไดนามิก ถ้ามุมมองเป็นแยกในสองทิศทาง (ได้ ด้วยอินเทอร์เฟซสำหรับแป้นพิมพ์), มุมมองใหม่ที่สามถูกสร้างเพื่อแสดงบานหน้าต่างใหม่สาม เมื่อแยกการทำงาน กล่องแยกจะปรากฏขึ้นเป็นแถบตัวแยกระหว่างบานหน้าต่าง ดูเพิ่มเติมที่วัตถุถูกทำลายเมื่อผู้ใช้เอาการแยก แต่ในมุมมองต้นฉบับ (0 แถว คอลัมน์ 0) ยังคงอยู่จนกว่าหน้าต่างแยกตัวเองถูกทำลาย Microsoft Excel หรือ Microsoft Word เป็นตัวอย่างของลักษณะแยกแบบไดนามิก?

เมื่อสร้างหน้าต่างแยกประเภทใด คุณต้องระบุจำนวนสูงสุดของแถวและคอลัมน์ที่แยกที่จะจัดการ สำหรับตัวแยกสัญญาณแบบ static บานหน้าต่างต้องสร้างเพื่อกรอกข้อมูลแถวและคอลัมน์ทั้งหมด สำหรับตัวแยกสัญญาณแบบไดนามิก บานหน้าต่างแรกถูกสร้างโดยอัตโนมัติเมื่อสร้างการCSplitterWnd?

จำนวนสูงสุดของบานหน้าต่างที่คุณสามารถระบุสำหรับ splitters คงเป็น 16 แถว โดยคอลัมน์ 16 การกำหนดค่าที่แนะนำคือ:

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

ตัวอย่างการแบ่ง

MFC ตัวอย่างโปรแกรมจำนวนมากใช้ windows แยกทั้งทางตรง หรือทางอ้อม ขั้นตอนที่ 4 ของการกวดวิชา MFC เขียนเพิ่มการแยก CScribView ที่เป็นบานหน้าต่างหลายหน้าต่างแยกแบบไดนามิก ตามที่แสดงในขั้นตอนนี้ เพิ่มหน้าต่างแยกเฟรมใหม่เป็นเรื่องที่ง่ายมาก ด้วยคุณลักษณะเพิ่มคลาของ ClassWizard ตัวอย่างนี้มีหน้าต่างแบบไดนามิกแยกตามค่าเริ่มต้น?

ตัวอย่างทั่วไปของ MFC VIEWEXแสดงให้เห็นคง splitters รวมถึงวิธีการทำตัวแยกสัญญาณในการแยกการใช้หลาย?

ClassWizard จะสร้างใหม่หลายเอกสาร (MDI) เด็กกรอบหน้าต่างคลาสอินเทอร์เฟซซึ่งประกอบด้วยหน้าต่างแยก โปรดดูที่ Windows แยกในVisual c ++ Programmer ของคำแนะนำ?

คำศัพท์ที่ใช้ โดยการใช้งาน

คำศัพท์ส่วนต่าง ๆ ของแบบCSplitterWndและวัตถุที่เกี่ยวข้อง?

CSplitterWnd:

นี่คือหน้าต่างที่มีการควบคุมการแบ่งบานหน้าต่างและแถบเลื่อนที่ใช้ร่วมกันระหว่างบานหน้าต่างทั้งหมดบนแถวหรือคอลัมน์ แถวและคอลัมน์จะระบุ ด้วยตัวเลข zero-based [นั่นคือ บานหน้าต่างแรกคือ แถว = 0 และคอลัมน์ = 0]

บานหน้าต่าง:

หน้าต่างโปรแกรมประยุกต์เฉพาะที่มีจัดการโดยการCSplitterWnd บานหน้าต่างโดยปกติจะอยู่CView-มาวัตถุ แต่ในความเป็นจริงอาจเป็นวัตถุใด ๆCWndที่มีหน้าต่างที่เหมาะสมเด็ก ID.nbsp(&N);

เมื่อต้องการทำเช่นนั้น เพียงแค่ผ่านRUNTIME_CLASSของCWndของคุณมาชั้นเช่นถ้าคุณกำลังใช้ class.nbsp กับCViewมา ชั้นของคุณต้องใช้DECLARE_DYNCREATEและIMPLEMENT_DYNCREATE - กรอบใช้สร้างแบบไดนามิกขณะใช้งานจริง  แม้ว่ามีมากของรหัสที่จะCViewเฉพาะในCSplitterWnd, CObject::IsKindOfถูกใช้เสมอก่อนที่จะดำเนินการกระทำเหล่านั้น  แน่นอน จะง่ายกว่าการใช้CSplitterWndกับCViewมาเรียนกว่าCWndมาเรียนมาก(&N)?

แถบแยก:

ตัวควบคุมที่ถูกวางไว้ระหว่างแถวและคอลัมน์ของบานหน้าต่าง มันอาจใช้ในการปรับขนาดของแถวหรือคอลัมน์ของบานหน้าต่าง?

กล่องแยก:

ตัวควบคุมขนาดเล็กที่ด้านบน ของแถบเลื่อนแนวตั้ง หรือด้านซ้ายของแถบเลื่อนแนวนอนในแบบไดนามิกCSplitterWnd ใช้ในการสร้างใหม่แถวหรือคอลัมน์ของบานหน้าต่าง?

แยกจุดตัด:

การตัดกันของแถบตัวแยกแนวตั้งและแถบแบ่งแนวนอน อาจลากเพื่อปรับขนาดของแถวและคอลัมน์ของบานหน้าต่างพร้อมกัน?

แถบเลื่อนที่ใช้ร่วมกัน

คลาCSplitterWndยังสนับสนุนแถบเลื่อนที่ใช้ร่วมกัน ตัวควบคุมแถบเลื่อนเหล่านี้เป็นลูกของการCSplitterWndและถูกใช้ร่วมกันกับบานหน้าต่างแตกต่างกันในการแยก?

ตัวอย่างเช่น ในหน้าต่างคอลัมน์ 1 แถว x 2 คุณสามารถระบุWS_VSCROLLเมื่อสร้างCSplitterWnd ตัวควบคุมแถบเลื่อนพิเศษจะถูกสร้างที่ใช้ร่วมกันระหว่างสองบานหน้าต่าง?

[nbsp     ][      ][^]
[pane00][pane01][|]
[      ][      ][v](&N)

เมื่อผู้ใช้ย้ายแถบเลื่อนWM_VSCROLLข้อความจะถูกส่งไปทั้งสองมุมมอง เมื่อมุมมองที่กำหนดตำแหน่งแถบเลื่อน แถบเลื่อนที่ใช้ร่วมกันจะถูกตั้งค่า?

หมายเหตุว่า แถบเลื่อนที่ใช้ร่วมกันเป็นประโยชน์มากที่สุดกับแบบไดนามิก หรือแบบ static splits แบ่งวัตถุในมุมมองที่คล้ายคลึงกัน ถ้าคุณรวมมุมมองของชนิดต่าง ๆ ในตัวแยกสัญญาณ แล้วคุณอาจต้องเขียนโค้ดพิเศษเพื่อประสานงานตำแหน่งการเลื่อน CViewใด ๆ-คลาสที่ใช้แถบเลื่อนCWnd APIs จะมอบหมายให้แถบเลื่อนที่ใช้ร่วมกันมีอยู่ มา การใช้งานCScrollViewเป็นตัวเช่นอย่างหนึ่งของคลาCViewการสนับสนุนร่วมแสดงแถบเลื่อน ไม่ใช่ -CViewมาเรียน เรียนที่อาศัยแถบเลื่อน noncontrol หรือชั้นที่ใช้มาตรฐานของ Windows ใช้งาน (ตัวอย่างเช่นCEditView) จะไม่ทำงานกับคุณลักษณะแถบเลื่อนที่ใช้ร่วมกันของCSplitterWnd?

ขนาดต่ำสุด

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

สำหรับหน้าต่างแยกคง ความกว้างความสูงและคอลัมน์แถวต่ำสุดเริ่มต้นคือ 0 สำหรับหน้าต่างแยกแบบไดนามิก การเริ่มต้นขั้นต่ำแถวความสูงและความกว้างคอลัมน์กำหนด โดยพารามิเตอร์sizeMinไปยังฟังก์ชันCSplitterWnd::Create?

ขนาดต่ำสุดเหล่านี้สามารถเปลี่ยนแปลงได้ ด้วยSetRowInfoและSetColumnInfo APIs?

จริง vs.ขนาดที่เหมาะสมที่สุด

เค้าโครงของบานหน้าต่างในหน้าต่างแยกขึ้นอยู่กับขนาดของเฟรมประกอบด้วย (ซึ่งจะปรับขนาดการCSplitterWnd CSplitterWnd repositions และปรับขนาดบานหน้าต่างเพื่อให้พอดีเหมาะที่เป็นไปได้)?

แถวสูงและคอลัมน์กว้างขนาดกำหนด โดยผู้ใช้ หรือผ่านทางCSplitterWnd API แสดงถึงขนาดเหมาะสมที่สุด ขนาดจริงอาจเล็กกว่าขนาดที่เหมาะสมที่สุด (ถ้ามีไม่พอที่จะทำให้บานหน้าต่างที่ขนาดเหมาะสมที่สุด) หรือมีขนาดใหญ่กว่าขนาดเหมาะสมที่สุด (ถ้าบานหน้าต่างที่ต้องทำขนาดใหญ่เพื่อเติมพื้นที่ไปซ้ายบนด้านขวาหรือด้านล่างของหน้าต่างแยก)?

อินเทอร์เฟซที่ได้รับการป้องกัน

ต่อไปนี้อธิบายบางอย่างของตัวแยกหน้าต่างใช้งาน overridables ที่สามารถใช้ได้ โดยผู้ใช้ขั้นสูงของCSplitterWndเพื่อกำหนดคุณลักษณะและส่วนติดต่อผู้ใช้ของคลาสนี้ APIs เหล่านี้จะได้อย่างชาญฉลาด และอยู่ภายใต้การเปลี่ยนแปลงในรุ่นของ MFC กรุณาอ้างอิงถึงรหัสแหล่งมาการใช้งานสำหรับรายละเอียดเพิ่มเติมในการใช้งานเหล่านี้ APIs?

รูปวาดแถบตัวแยก กล่อง และ trackers:

 enum ESplitType nbsp  {splitBox, splitBar, splitIntersection, splitBorder };
เสมือนโมฆะ OnDrawSplitter (CDC * pDC, ESplitType nType, const CRect & rect);
เสมือนโมฆะ OnInvertTracker (const CRect & rect)

ฟังก์ชันเหล่านี้เสมือนสามารถถูกเขียนทับเพื่อให้ถ่ายแบบอื่นสำหรับคอมโพเนนต์กราฟิกต่าง ๆ ของหน้าต่างแยก ภาพถ่ายที่เป็นค่าเริ่มต้นจะคล้ายคลึงกับตัวแยกใน Microsoft Works สำหรับ Windows: หรือที่จุดเท่านั้นตัดของแถบตัวแยกเป็นการผสมผสานกัน ภาพถ่ายที่จะยังค่อนข้างแตกต่างเมื่อกรอบ Windows 4.0 - ที่ตรวจพบเพื่อให้ตรงกับอธิบายในเชลล์บนระบบปฏิบัติการที่ (ในอนาคต)?

การสร้างตัวควบคุมและมุมมอง:

เสมือน BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID)

นี้เรียกว่าการสร้างตัวควบคุมแถบเลื่อนที่ใช้ร่วมกัน มันสามารถถูกเขียนทับการรวมตัวควบคุมพิเศษที่อยู่ติดกับแถบเลื่อน ลักษณะการทำงานค่าเริ่มต้นคือการ สร้างตัวควบคุมแถบเลื่อน Windows ปกติเพียง?

deleteView โมฆะเสมือน (int แถว คอลัมน์ int);
เสมือน BOOL SplitRow(int cyBefore)
เสมือน BOOL SplitColumn(int cxBefore)
เสมือนโมฆะ DeleteRow (int แถว);
เสมือนโมฆะ DeleteColumn (int แถว)

ฟังก์ชันเหล่านี้เรียกว่าการใช้ตรรกะของหน้าต่างแยกแบบไดนามิก (นั่นคือ ถ้าแยกหน้าต่างซึ่งมีลักษณะSPLS_DYNAMIC_SPLIT ) พวกเขาสามารถถูกกำหนดเอง พร้อม ด้วยฟังก์ชันเสมือนCreateViewใช้ขั้นสูงเพิ่มเติมแบบไดนามิก splitters?

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

เสมือน BOOL CanActivateNext(BOOL bPrev = FALSE);

ตรวจสอบเพื่อดูว่าคำสั่ง "บานหน้าต่างถัดไป" หรือ "บานหน้าต่างก่อนหน้า" เป็นไปได้ในขณะนี้?

activateNext โมฆะเสมือน (BOOL bPrev = FALSE);

ดำเนินการคำสั่ง "บานหน้าต่างถัดไป" หรือ "บานหน้าต่างก่อนหน้า"?

เสมือน BOOL DoKeyboardSplit();

ทำแยกคำสั่ง มักจะ "หน้าต่างแยก" แป้นพิมพ์?

หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)

Index