利用OnHelp( )在BCB中實現上下文敏感的html help (轉)

worldblog發表於2007-12-09
利用OnHelp( )在BCB中實現上下文敏感的html help (轉)[@more@]

關於Html Help,在CSDN上推薦得最多的是如何利用Execute( )或HtmlHelp( )來開啟相應的幫助和幫助主題。本人在查詢了一些資料後試驗成功一種在BCB中簡單易行的顯示上下文敏感的Html Help的方法,其效果和舊式的上下文敏感的WinHelp( )完全相同。這種方法的程式碼量小,而且可擴充套件性好,當你以後在幫助檔案中增加主題時根本不需要再改動你的程式碼,只需要修改chm檔案和窗體上各的HelpContext屬性值即可。

假定的chm幫助檔案中有三個主題檔案1.htm、2.htm、3.htm,窗體上有3個TEdit控制元件,要達到的目的為:
當在第一個TEdit控制元件上按F1鍵時顯示1.htm的內容,在第二個TEdit控制元件上按F1鍵時顯示2.htm的內容,依次類推。這就是所謂的上下文敏感幫助。
當然你可以透過截獲F1鍵並判斷當前是哪個TEdit控制元件擁有輸入焦點,從而ShellExecute( )或HtmlHelp( )來顯示相應的html主題。但這種方法可擴充套件性不好,以後增加html檔案時需要修改程式程式碼。

做法如下:

1、用文字編輯器直接編輯html help的project檔案*.hhp,加入下面的內容。也可以透過html help workshop的介面加入。這相當於將3個html檔案對映為3個context ID。之後重新編譯你的project。

[ALIAS]
IDH_CHAPTER1 = 1.htm
IDH_CHAPTER2 = 2.htm
IDH_CHAPTER3 = 3.htm

[MAP]
#define IDH_CHAPTER1 1001
#define IDH_CHAPTER2 1002
#define IDH_CHAPTER3 1003

2、設定窗體上的3個TEdit控制元件的HelpContext屬性分別為1001、1002、1003。

3、修改程式程式碼,過載TApplication->OnHelp(當然也可以過載各Form的OnHelp),利用HtmlHelp( )來顯示相應的上下文敏感幫助。當Command取值為HELP_CONTEXT時,Data就是你按F1鍵時擁有輸入焦點的那個控制元件的HelpContext屬性值。

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  Application->HelpFile = "Main.chm";
  Application->OnHelp = AppHelp;
}
//--------------------------------------------------------------------------
bool __fastcall TForm1::AppHelp( Command, int Data, bool &CallHelp)
{
  switch(Command)
  {
  case HELP_CONTEXT:

  HtmlHelp(GetDesktopWindow(), Application->HelpFile.c_str( ), HH_HELP_CONTEXT, Data);
  CallHelp = false;

  break;

  default:

  CallHelp = true;
  }

  return true;
}
//--------------------------------------------------------------------------
void __fastcall TForm1::FormClose(T *Sender, TCloseAction &Action)
{
  HtmlHelp(NULL, NULL, HH_CLOSE_ALL, 0);
}
//---------------------------------------------------------------------------

這樣就Ok了。上述沒有儲存Application->OnHelp的舊值,也沒有處理Command為其它值的情況,可根據需要加上。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990326/,如需轉載,請註明出處,否則將追究法律責任。

相關文章