TN028: ตามบริบทความช่วยเหลือสนับสนุน

หมายเหตุนี้อธิบายกฎสำหรับการกำหนด 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 ในลำดับต่อไปนี้

  1. ตรวจสอบสำหรับการโทรAfxMessageBoxที่ใช้งานด้วยวิธีใช้รหัสการ ถ้ากล่องข้อความอยู่ในขณะนี้ WinHelp จะทำงานกับบริบทที่เหมาะสมกับกล่องข้อความนั้น?

  2. ถ้าไม่มีกล่องข้อความอยู่CWinApp::OnHelpส่งแบบWM_COMMANDHELP (ข้อความส่วนตัวไปยังคลาสที่ Microsoft Foundation) ไปยังหน้าต่างที่ใช้งานอยู่ ถ้าหน้าต่างที่ไม่ตอบสนอง โดยการเรียกใช้ WinHelp ข้อความเดียวแล้วส่งไปแม่ของหน้าต่าง จนกระทั่งมีการประมวลผลข้อความ หรือหน้าต่างปัจจุบันคือ หน้าต่างระดับบนสุด (และดังนั้นจึง ไม่มีหน้าต่างหลัก)?

  3. ถ้าข้อความยังคง unprocessed แล้วเริ่มต้นวิธีใช้เรียก สามารถทำได้ โดยการส่งคำสั่งID_DEFAULT_HELPในหน้าต่างหลัก คำสั่งนี้ถูกแมปโดยทั่วไปการCWinApp::OnHelpIndex?

ทั่วโลกแทนที่ 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)

Index