用過emacs的人都知道,其快捷鍵有多麼強大,利用組合鍵c-x c-w,你可以將buffer內容另存為乙個新的檔案。那麼程式是如何響應使用者輸入的快捷鍵呢?又如在linux的shell環境中,ctrl+r可以查詢以前使用過的歷史命令,這是由readline庫來實現的。下面實現的這個**,允許將乙個函式繫結到一串字串,如果命中了該字串,則呼叫繫結的介面函式。
目前的實現,是使用樹來管理所有的快捷鍵路徑,每個節點都可以繫結乙個函式,但我們應該遵循最長命令的原則,即如果a-b是乙個快捷鍵,a-b-c也是乙個快捷鍵,那麼當輸入a-b時需要等待使用者下乙個輸入,如果沒有輸入,或者輸入非c,則呼叫a-b快捷方式;否則呼叫a-b-c快捷方式。還有以下兩個問題沒有很好地解決,乙個是,在使用者輸入a-b後,如何判斷使用者沒有後續的輸入了?乙個是,如果a和a-b都是快捷鍵,如果使用者連續輸入兩個a,應該怎麼呼叫快捷鍵a?
例如對於下面五個快捷鍵,
axh, axe, axeh, abxh, acxh
我們將會生成一棵如下的多分枝樹:
/->c->x->h* |
a->x->h*
| |
| /->e*->h*
/->b->x->h*
我們知道,esc鍵的ascii值為0x1b, 而方向鍵和f1-f12功能鍵的序列值也是以0x1b開始的,那麼如何區別使用者鍵入的是esc鍵還是方向鍵呢?
下面開始貼上分析**。
首先是資料結構,如果有不清楚的,請看詳細注釋。
然後是初始化和銷毀介面,提供了節點記憶體的申請和釋放介面和整個keymap的初始化和銷毀介面。
下面的介面函式可用來列印所有的快捷鍵路徑。
這個介面用來查詢某個字串是否繫結了快捷鍵,如果沒有繫結, 則返回空指標。
下面是實現繫結的介面, 將快捷鍵分散到樹的各個節點上:
以下為測試函式:
另外,下面使用乙個while迴圈來響應使用者的輸入,用來測試如何檢查使用者輸入的每個字元是否被繫結到快捷鍵。
其中函式wdm_keymap_get_next()使用當前節點和當前使用者輸入的鍵值來獲取下乙個節點。
自定義可拖拽view
我們知道view的繪製有三個重要的過程分別是measure,layout,draw.measure負責測量view的尺寸,layout負責定位view的位置,draw負責把view繪製到上。我們這就是通過layout重新定位view。public class custommoveview exten...
可復用的自定義Adapter
public abstract class myadapterextends baseadapter public myadapter arraylis ata,int mlayoutres override public intgetcount override public t getitem ...
自定義Visual Studio 2010 快捷鍵
當我們要輸入console.writeline 的時候,只要輸入cw,然後兩下tab鍵就自動完成輸入了,這個應該你知道吧。可是要想輸入console.readline 怎麼辦?是不是輸入cr,然後兩下tab鍵也可以自動完成呢?可是,不是。額。那怎麼辦呢?嗯。那就自定義咯。自定義步驟 以cr cons...