本文的目的是說明,這里的快捷鍵是如何被觸發的。
從控件自身來看,快捷鍵的進入點是在TWincontrol.IsMenuKey。在分析IsMenuKey之前,我們先看一下IsMenuKey是哪里被調用的?
搜索Controls.Pas,可以發現,他是在CNKeyDown事件里被觸發的,如下(Line 13):
那么,CNKeyDown又是如何響應的呢?這就要從消息進入的源頭查找——Application.IsKeyMsg,其實現如下:
SendMessage(Wnd, CN_BASE + Message, WParam, LParam)預先讓控件處理此類消息,然后繼續派送WM_XXXX。
OK,回到IsMenuKey這個觸發快捷鍵的關鍵部位。先看其代碼:
取得Form := GetParentForm(Self);然后Form.IsShortCut(Message) ;
IsShortCut實現過程就不貼代碼了(避免篇幅太長),自己看一下代碼就了解了。
但這里要注意GetParentForm,假設有兩個form:A和B,B嵌入A,這時,我們這樣GetParentForm(Self);取得B上面的控件的父窗口是誰,最終會是A(這里有個前提:嵌入的方式是指定Parent)。
所以,若A中有快捷鍵和B中Action的快捷鍵有沖突,那么B的快捷鍵就不會被觸發(因為被A給處理了)。
下面是GetParentForm做法,這是D5的實現方式,雖然之后的版本有所改動,但結果是一樣的