หมายเหตุนี้อธิบายกฎสำหรับการกำหนด Id บริบทของความช่วยเหลือ (นั่นคือ หมายเลขหัวข้อ) และปัญหาอื่น ๆ ช่วยใน MFC 2.0 พึ่งบริบทการสนับสนุนต้องการวิธีใช้คอมไพเลอร์ซึ่งจะมีอยู่ใน Visual c ++ Professional?
ชนิดของความช่วยเหลือที่ได้รับการสนับสนุน
มีอยู่สองชนิดของวิธีใช้ตามบริบทที่ถูกนำมาใช้ในโปรแกรมประยุกต์ของ Windows แรก ที่อ้างอิงถึงเป็น "F1 ช่วย" เกี่ยวข้องกับการเปิดใช้ WinHelp กับบริบทที่เหมาะสมตามวัตถุที่ใช้งานอยู่ในขณะนี้ สองคือ โหมด SHIFT + F1 ในโหมดนี้ เคอร์เซอร์ของเมาส์เปลี่ยนเป็นเคอร์เซอร์วิธีใช้ (การผสมศร + เครื่องหมายคำถาม), และผู้ใช้ดำเนินการให้คลิกที่วัตถุพวกเขาอยากช่วยใน ที่จุด WinHelp จะทำการให้ความช่วยเหลือสำหรับวัตถุที่ผู้ใช้คลิก?
Microsoft Foundation คลาสที่ใช้ฟอร์มเหล่านี้ความช่วยเหลือทั้งสอง นอกจากนี้ กรอบสนับสนุนสองวิธีใช้ง่าย ๆ สั่ง ดัชนีวิธีใช้และการใช้วิธีใช้?
แฟ้มวิธีใช้
คลาสที่ Microsoft Foundation สมมติว่าแฟ้มวิธีใช้เดียว ว่า แฟ้มวิธีใช้ต้องมีชื่อเดียวกันและเส้นทางเป็นแอพลิเคชัน (EXE - gt;หารือ(&G)?
นี้เป็นสาธารณะCWinAppสมาชิกแปรm_pszHelpFilePathที่ผู้ใช้สามารถเปลี่ยนได้ถ้าต้องการตั้งชื่อ?
ช่วงบริบทความช่วยเหลือ
0x00000000 - 0x0000FFFF: ผู้ใช้กำหนดเอง
0x00010000 - 0x0001FFFF: คำสั่ง (/ เมนูคำสั่งปุ่ม)
nbsp 0X00010000 + ID_(&N)
nbsp (หมายเหตุ: 0x18000 - > 0x1FFFF คือ ช่วงปฏิบัติเนื่องจากมีรหัสคำสั่ง > = 0x8000)
0x00020000 - 0x0002FFFF: windows และกล่องโต้ตอบ
nbsp 0X00020000 + IDR_(&N)
nbsp (หมายเหตุ: 0x20000 - > 0x27FFF คือ ช่วงปฏิบัติเนื่องจากมี IDRs < = 0x7FFF)
0x00030000 - 0x0003FFFF: ข้อความแสดงข้อผิดพลาด (ตามรหัสสายอักขระของข้อผิดพลาด)
nbsp 0X00030000 + IDP_(&N)
0x00040000 - 0x0004FFFF: วัตถุประสงค์พิเศษ (ไคลเอ็นต์ไม่ใช่พื้นที่)
nbsp 0x00040000 + HitTest พื้นที่(&N)
0x00050000 - 0x0005FFFF: ควบคุม (ที่ไม่ใช่คำสั่ง)
nbsp 0X00040000 + IDW_(&N)
กฎเหล่านี้ไม่ล่วงเข้าไปในการเริ่มต้นใช้งาน Microsoft Foundation คลาสที่ พวกเขาสามารถถูกเขียนทับ โดยการนำเสนอการใช้งานที่แตกต่างกันของฟังก์ชันต่าง ๆ ที่เกี่ยวข้องกับความช่วยเหลือสมาชิก?
คำสั่ง "ช่วยเหลือ" วิ
มีอยู่สองอย่างง่ายช่วยสั่งที่มีการใช้งาน โดยคลาสที่ Microsoft Foundation:
คำสั่งเหล่านี้สองเพียงแสดงดัชนีวิธีใช้สำหรับโปรแกรมประยุกต์ และแสดงวิธีใช้ของผู้ใช้เกี่ยวกับการใช้โปรแกรม WinHelp ตามลำดับ?
วิธีใช้ตามบริบท (F1 วิธีใช้)
นี่คือรูปแบบแรกของวิธีใช้ตามบริบท (มักเรียกว่าช่วย F1) ผู้ใช้กด F1 เพื่อขอความช่วยเหลืองานในมือ (การใช้งานหน้าต่างหรือเมนูรายการ) เกี่ยวข้องกับ "วิธีใช้โหมด" ไม่พิเศษ?
แป้น F1 คือมักจะแปลคำสั่งกับ ID ของID_HELPโดยเร่งการวางลงในตารางการเร่งความเร็วของหน้าต่างหลัก คำสั่งID_HELPยังอาจถูกสร้างขึ้น โดยปุ่มกับ ID ของID_HELPบนกล่องโต้ตอบหรือหน้าต่างหลัก นอกจากนี้ เมื่อเมนูหรือกล่องโต้ตอบมีการใช้งาน และผู้ใช้กด F1 การกดแป้นจะล่วงไปแปลลงในคำสั่งID_HELP?
อย่างไรก็ ตามที่มีสร้างคำสั่งID_HELPจะถูกส่งเป็นคำสั่งที่ปกติจนกระทั่งมาถึงตัวจัดการคำสั่ง (สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Microsoft Foundation คลาสที่กำหนดคำสั่งเส้นทางสถาปัตยกรรม อ้างถึง21 หมายเหตุทางเทคนิค) ถ้าโปรแกรมประยุกต์จะเปิดใช้งานวิธีใช้ คำสั่งID_HELPจะถูกจัดการ โดยฟังก์ชันCWinApp::OnHelp เนื่องจากสายงานเริ่มต้นคำสั่งจะไม่เพียงพอสำหรับการกำหนดบริบทเฉพาะที่สุด คำสั่งแทนเสมอกำหนดเส้นทางไปยังวัตถุโปรแกรมประยุกต์ และทนี้กำหนดเส้นทางสำหรับวิธีใช้แบบกำหนดเอง?
CWinApp::OnHelpความพยายามที่จะเปิดใช้ WinHelp ในลำดับต่อไปนี้
ทั่วโลกแทนที่ ID ฐานค่า (0x10000 สำหรับคำสั่ง 0x20000 สำหรับทรัพยากรเช่นกล่องโต้ตอบ และอื่น ๆ), แอพลิเคชันควรแทนCWinApp::WinHelp ซึ่งในความเป็นจริงทำในการใช้งานโปรแกรมประยุกต์ ClassWizard และ AppWizard ตัวเอง ตัวอย่าง เนื่องจากทั้งสองร่วมกันแฟ้มวิธีใช้เดียว?
เมื่อต้องการแทนที่ฟังก์ชันนี้และวิธีจะกำหนดวิธีใช้บริบท แอปพลิเคชันควรจัดการข้อความWM_COMMANDHELP (ดูด้านล่าง) คุณอาจต้องการให้สายเฉพาะวิธีใช้งานกว่ากรอบแสดง ขณะที่มันเท่านั้นไปลึกเป็นหน้าต่างลูก MDI ปัจจุบัน หรือคุณอาจต้องการให้ความช่วยเหลือเพิ่มเติมเฉพาะสำหรับเฉพาะหน้าต่างหรือโต้ตอบ - บางทียึดภายในสถานะปัจจุบันของวัตถุหรือตัวควบคุมที่ใช้งานอยู่ภายในกล่องโต้ตอบ?
WM_COMMANDHELP
afx_msg LRESULT CWnd::OnCommandHelp (WPARAM, LPARAM lParam)
WM_COMMANDHELP MFC ส่วนตัว Windows ข้อที่ได้รับ โดยหน้าต่างที่ใช้งานเมื่อมีการร้องขอความช่วยเหลือ ได้ เมื่อหน้าต่างได้รับข้อความนี้ มันอาจเรียกCWinApp::WinHelpกับบริบทที่ตรงกับสถานะภายในของหน้าต่าง?
lParam
ประกอบด้วยบริบทความช่วยเหลืออยู่ในปัจจุบัน lParam เป็นศูนย์ถ้ามีการตัดสินไม่มีบริบทความช่วยเหลือได้ การใช้งานของOnCommandHelpสามารถใช้ ID บริบท lParam เพื่อพิจารณาบริบท "ดีกว่า" หรือสามารถเพียงผ่านมันไปCWinApp::WinHelp?
wParam
ไม่ได้ใช้ และจะเป็นศูนย์?
ถ้าฟังก์ชันOnCommandHelpเรียกCWinApp::WinHelpมันควรกลับ TRUE ส่งกลับ TRUE หยุดสายงานการผลิตของคำสั่งนี้ เพื่อเรียนอื่น ๆ (ฐานชั้น) และ windows อื่น ๆ?
วิธีใช้โหมด (Shift + F1 วิธีใช้)
นี่คือรูปแบบที่สองของวิธีใช้ตามบริบท โดยทั่วไปแล้ว โหมดนี้ถูกป้อน โดยการกด SHIFT + F1 หรือผ่าน ทางเมนูแถบมือ มันถูกนำมาใช้เป็นคำสั่ง (ID_CONTEXT_HELP) Hook ของตัวกรองข้อความไม่ได้ใช้การแปลคำสั่งนี้ในขณะที่กล่องโต้ตอบโมดอล หรือมีการใช้งานเมนู ดังนั้น คำสั่งนี้จะพร้อมใช้งานสำหรับผู้ใช้เมื่อโปรแกรมประยุกต์กำลังดำเนินการปั๊มข้อความหลัก (CWinApp::Run)?
หลังจากการเข้าสู่โหมดนี้ เคอร์เซอร์วิธีใช้จะปรากฏบนพื้นที่ทั้งหมดของแอปพลิเคชัน แม้ว่าโปรแกรมประยุกต์โดยปกติจะแสดงเคอร์เซอร์ตัวสำหรับพื้นที่นั้น (เช่นจับสำหรับปรับขนาดเส้นขอบรอบหน้าต่าง) ผู้ใช้จะสามารถใช้เมาส์หรือแป้นพิมพ์เพื่อเลือกคำสั่ง แทนที่เป็นของการดำเนินการคำสั่ง วิธีใช้เกี่ยวกับคำสั่งดังกล่าวจะปรากฏขึ้น นอกจากนี้ ผู้ใช้สามารถคลิกที่วัตถุมองเห็นได้บนหน้าจอ เช่นปุ่มบนแถบเครื่องมือ และจะแสดงวิธีใช้สำหรับวัตถุ โหมดนี้ความช่วยเหลือมาโดยCWinApp::OnContextHelp?
ระหว่างการทำงานของลูปนี้ ทั้งหมดแป้นพิมพ์ป้อนข้อมูลมีการทำงาน ยกเว้นสำหรับคีย์ที่เข้าถึงเมนู ยัง แปลคำสั่งจะยังคงดำเนินผ่านPreTranslateMessageเพื่ออนุญาตให้ผู้ใช้กดคีย์การเร่งความเร็ว และได้รับความช่วยเหลือเกี่ยวกับคำสั่งดังกล่าว?
ถ้ามีเฉพาะแปลหรือการกระทำที่เกิดขึ้นในฟังก์ชันPreTranslateMessageที่ไม่ควรเกิดขึ้นระหว่างโหมดวิธีใช้ SHIFT + F1 คุณควรตรวจสอบสมาชิกm_bHelpMode CWinAppก่อนที่จะทำการดำเนินการดังกล่าว ใช้งานCDialog PreTranslateMessageตรวจสอบนี้ก่อนการเรียกIsDialogMessageตัวอย่าง นี้ปิดใช้งานคีย์ "โต้นำทาง" ในกล่องโต้ตอบสร้างระหว่างโหมด SHIFT + F1 นอกจากนี้CWinApp::OnIdleจะยังคงเรียกว่าระหว่างการวนรอบนี้?
ถ้าผู้ใช้เลือกคำสั่งจากเมนู จะถูกจัดการเป็นวิธีใช้เกี่ยวกับคำสั่ง (ผ่านWM_COMMANDHELPดูด้านล่าง) หากผู้ใช้คลิกที่พื้นที่การมองเห็นของหน้าต่างโปรแกรมประยุกต์ กำหนดแบบทำเป็นการไม่ว่าจะเป็นการคลิ nonclient หรือในไคลเอนต์ให้คลิก OnContextHelpจับการแมปของคลิกที่ nonclient เพื่อรั้งไคลเอนต์โดยอัตโนมัติ ถ้าเป็นในไคลเอนต์ให้คลิก แล้วส่งแบบWM_HELPHITTESTไปยังหน้าต่างที่ถูกคลิ ถ้าหน้าต่างที่ส่งกลับค่าไม่ใช่ศูนย์ ค่าที่จะใช้เป็นบริบทสำหรับความช่วยเหลือ ถ้าจะส่งกลับค่าศูนย์OnContextHelpพยายามที่หน้าต่างหลัก (และความล้มเหลวที่ หลักการ และอื่น ๆ) ถ้าไม่สามารถกำหนดวิธีใช้บริบท ค่าเริ่มต้นคือการ ส่งคำสั่งID_DEFAULT_HELPไปยังหน้าต่างหลัก ซึ่งถูกแล้ว (โดยปกติ) แมปกับCWinApp::OnHelpIndex?
WM_HELPHITTEST
afx_msg LRESULT CWnd::OnHelpHitTest (WPARAM, LPARAM lParam)
WM_HELPHITTEST MFC windows ส่วนข้อ ที่ได้รับ โดยการคลิกระหว่างโหมดวิธีใช้ SHIFT + F1 หน้าต่างที่ใช้งาน อยู่ เมื่อหน้าต่างได้รับข้อความนี้ จะส่งกลับ ID ที่ช่วย DWORD สำหรับใช้ โดย WinHelp?
LOWORD(lParam)
ประกอบด้วยพิกัดที่อุปกรณ์แกน X ที่คลิกเมาส์สัมพันธ์กับพื้นที่ไคลเอ็นต์ของหน้าต่าง?
HIWORD(lParam)
ประกอบด้วยพิกัดที่ y แกน?
wParam
ไม่ได้ใช้ และจะเป็นศูนย์ ถ้าคืนค่าเป็นไม่ใช่ศูนย์ WinHelp เรียกว่า ด้วยบริบทที่ ถ้าคืนค่าเป็นศูนย์ หน้าต่างหลักถูกสอบถามขอความช่วยเหลือ?
ในหลายกรณี คุณสามารถใช้ประโยชน์จากรหัสแบบทดสอบตีคุณอาจมีอยู่แล้ว ดูการใช้งานCToolBar::OnHelpHitTestสำหรับตัวอย่างของการจัดการข้อความWM_HELPHITTEST (รหัส leverages ตีทดสอบรหัสตัวอักษรที่ใช้บนปุ่มและแนะนำเครื่องมือในCControlBar)?
MFC AppWizard สนับสนุนและ MAKEHM
AppWizard สร้างแฟ้มจำเป็นเพื่อสร้างแฟ้มวิธีใช้ (แฟ้ม.cnt และ.hpj) มันยังมีตัวเลขของโซลูชันด้วยไฟล์ RTF ที่เป็นการยอมรับ โดย Microsoft ช่วยคอมไพเลอร์ มีหลายหัวข้อสมบูรณ์ แต่บางอย่างอาจจำเป็นต้องปรับเปลี่ยนสำหรับโปรแกรมประยุกต์ของคุณ?
สร้างโดยอัตโนมัติของแฟ้ม "ช่วยการแมป" ได้รับการสนับสนุน โดยโปรแกรมอรรถประโยชน์เรียกว่า MAKEHM โปรแกรมอรรถประโยชน์ MAKEHM สามารถแปลทรัพยากรของโปรแกรมประยุกต์H แฟ้มการแมปแฟ้มวิธีใช้ ตัวอย่างเช่น:
#กำหนด IDD_MY_DIALOGnbsp 2000
#กำหนด ID_MY_COMMAND 150(&N)
จะแปลเป็น:
HIDD_MY_DIALOGnbsp 0x207d0
HID_MY_COMMAND 0X10096(&N)
รูปแบบนี้จะเข้ากันได้กับของคอมไพเลอร์วิธีใช้ฟังก์ชัน ซึ่งแผนที่บริบท IDs (ตัวเลขด้านขวา) ด้วยหัวข้อชื่อ (สัญลักษณ์บนด้านซ้าย)?
รหัสแหล่งมาสำหรับ MAKEHM อยู่ในตัวอย่าง MFC Programming Utilties MAKEHM?
การเพิ่มการสนับสนุนความช่วยเหลือหลังจากการใช้งาน AppWizard
วิธีที่ดีที่สุดในการเพิ่มความช่วยเหลือไปยังโปรแกรมประยุกต์ของคุณเพื่อ ตรวจสอบการ "ตรงตามบริบท" เลือกวิธีใช้ในกล่องโต้ตอบตัวเลือกของ AppWizard ของก่อนที่จะสร้างโปรแกรมประยุกต์ของคุณได้ AppWizard วิธีเพิ่มแผนผังรายการข้อความที่จำเป็นของคลาส CWinApp มาเพื่อสนับสนุนความช่วยเหลือโดยอัตโนมัติ?
ถ้าคุณได้สร้างโปรแกรมประยุกต์ของคุณไม่สนับสนุนความช่วยเหลือ และขณะนี้ ต้องการเพิ่ม ดูคู่มือ Visual c ++ Programmer ของ?
วิธีใช้กล่องข้อความ
วิธีใช้กล่องข้อความ (บางครั้งเรียกว่าการแจ้งเตือน) ได้รับการสนับสนุนผ่านฟังก์ชันAfxMessageBoxแรปเปอร์สำหรับการสำหรับ Windows MessageBox API?
มีอยู่สองรุ่นAfxMessageBoxหนึ่งสำหรับใช้กับเป็นสตริงที่ ID และอีกส่วนหนึ่งสำหรับใช้งานกับตัวชี้ไปยังสายอักขระ (LPCSTR):
int AFXAPI AfxMessageBox(LPCSTR lpszText, UINT nType, UINT nIDHelp)
int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp)
ในทั้งสองกรณี มีวิธีใช้ ID ก็ได้?
ในกรณีแรก nIDHelp ค่าเริ่มต้นคือ 0 ซึ่งบ่งชี้ว่า ไม่มีวิธีใช้สำหรับกล่องข้อความนี้ ถ้าผู้ใช้กด F1 ในขณะใช้งานเช่นข้อความ กล่องอยู่ ผู้ใช้จะไม่ได้รับความช่วยเหลือ (แม้ว่าโปรแกรมประยุกต์สนับสนุนวิธีใช้) ถ้าไม่พึงปรารถนา ID ช่วยให้ควรมีให้สำหรับ nIDHelp?
ในกรณีที่สอง เป็นค่าเริ่มต้นสำหรับ nIDHelp -1 ซึ่งบ่งชี้ว่า วิธีใช้ ID เดียวกับ nIDPrompt วิธีใช้จะทำงานเฉพาะถ้าโปรแกรมประยุกต์จะเปิดใช้วิธีใช้งาน แน่นอน) คุณควรใส่ 0 สำหรับ nIDHelp ถ้าคุณต้องการให้กล่องข้อความได้ไม่มีการสนับสนุนความช่วยเหลือ คุณควรต้องข้อความที่ต้องการความช่วยเหลือในการเปิดใช้งาน แต่ประสงค์เป็น ID ของวิธีใช้แตกต่างกันกว่า nIDPrompt เพียงแค่ให้เป็นค่าบวกสำหรับ nIDHelp ต่างจากของ nIDPrompt?
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)