Posted by: kevinlin on: 八月 28, 2006
遇到一個小問題,要紀錄一下以免以後忘記
我現在的Button有弄一個ButtonDown跟ButtonUp的事件
可以設定該button的CallBackFunction
ex.
使用的時候只要照下面這樣設定,前端就不用在去理會鍵盤有沒有按了
Button->pfnOnButtonDown = OpenMenu; //傳給他函式
Button->pClientArg = anythig //用來擴充用的,傳任何型態都可以(這時候就知道void的好用)
所以如果我們在類別裡面做的時候 OpenMenu() 必須要弄成static
假設有一個Test的類,裡面有一個按鈕 跟一個CallBackFunction(OpenMenu)跟一個簡單的Function
Class Test
{
public:
static void OpenMenu( Button*pBtn, void*pClientArg );
void fuctionA();
Button *m_button;
int m_x;
}//為了方便 都假設是public
如果我建立m_button時候
給他一個CallBackFunction
m_Button->pfnOnButtonDown = OpenMenu;
這樣基本上簡單的操作都沒有問題了,不過下面的情況下就有問題了
這時候我發現問題就是如果我OpenMenu是這樣實做的
void OpenMenu( Button*pBtn, void*pClientArg )
{
functionA();
m_x=1;
}
就是說使用到那個Test類別的成員,會有錯誤產生,因為static基本上算是另類的全域,不允許我這樣呼叫
這時候叫要那個擴充用的參數就有用了
只要
m_Button->pfnOnButtonDown = OpenMenu;
m_Button->pClientArg = this;
然後把OpenMenu改成
void OpenMenu( Button*pBtn, void*pClientArg )
{
Test*pTestInstance = (Test*)pClientArg;
pTestInstance->functionA();
pTestInstance->m_x=1;
}//這樣就解決了問題了
Posted by: kevinlin on: 八月 26, 2006
今天一早6點半就去坐車去台北了
保誠人壽辦的連誼活動硬是被邀去,不然我今天早上應該是在打太極拳,下午睡個好覺
因為早上很早起,沒什麼睡到覺,車上又沒睡著,到了台北真是累到不行,然後坐著捷運到士林站換公車到故宮,基本上呢,人是有點多,連誼稿個100多人,真是誇張,然後女生人數出乎我意料的多,本來想說100人大概90個男的10個女的,結果差不多是60個女的40個男的
活動內容是這樣的 1.自我介紹 2.做第一印象的選擇 3.分組烤肉 4.分組打高爾夫 5.告白回家
一開始就是自我介紹,全部輪完都1個多小時過去了,四處張望有沒有特別的女生,發現了一個女生還漫可愛的當然還有許多很漂亮的,不過我喜歡的就不一樣,聽他介紹說是做旅遊業的,從他的行為中可以看出帶有很深的搞笑因子,介紹完後就是做選擇了,就是一人發一張貼紙,貼在覺得不錯的女生的身上,本來要貼她的,不過時間太短了,而且她在左邊,我一開始就往右邊去了,尷尬了一下,每個女生都在看我,我只好把貼紙隨便黏在一個人身上快跑了,老實說我真的忘記我貼給誰了,貼完後想說就算了,後面不見得會再相遇.
後來分組烤肉,令人驚訝的是我被分在跟她同一組,就聊了一點點,我也不會聊什麼東西,同一組的還有仁寶廣達電的,真是工程師大會,不過我不做硬體的,我做軟體所以領域應該算不同.反正呢!時間咻一下就過去了,就這樣到了烤肉結束.
後來又分組打高爾夫球(我今天才發現原來我打的還漫好的,竿竿都超過70碼),打高爾夫又分到跟她同一組了,其實就又講了幾句話,我也不知道說什麼,要輪流打,其實這打高爾夫還漫無聊的,打完不知道幹嘛,又沒半個認識,只好閒晃到大家都打完
打完後就是叫男生一個一個跟喜歡的女生告白,真是有挑戰性的關卡,這個關卡主要就是看誰想要出來跟誰告白,然後有同樣心儀對象的男生也出來,讓女生選,不過在這邊發現了一個小問題,我完全忘記剛剛我覺得不錯那女生的名字,還好名字不是問題,有人記得,然後我就跟著出去跟人競爭了.
我這輩子還沒說過這麼肉麻的話,但是看到大家都講又不得不講,最後我當然就告白了一下還唱了一段歌,結果還是失敗了(不過另一個也是失敗的),換回一張名片跟一個MSN,當作認識了一個新朋友,大家想出國買機票可以跟我說,哈哈!!不過算是有緣分的了,從第一眼就見到到後面分組都分到同一組,算是比相逢的有緣更有緣一點點,不過她在台北我在台中,我想,這緣大概會慢慢消失.
告白失敗就回台北車站,逛了一下,又小小的shopping了一下,最近喜歡上一些扭蛋模型,我想把我的桌子擺的滿滿的,到地下街去找海賊王,我想買羅賓的,結果找不到,只買了一個機器人大戰的,逛了2個多小時,然後就回台中,實在非常累. 結果回到台中不是累到不行,是餓到快昏了,在台北忘記吃晚餐了.
Posted by: kevinlin on: 八月 3, 2006
之前研究了一下IME該怎麼整合到程式裡,很多全螢幕的3D遊戲都是自己用自己方式表現中文輸入的,怎麼做呢??本來覺得很難後來覺得還好,其實就是攔截本來windows幫我們處理的一些訊息,由我們自己去實作就好了。
其實輸入文字主要就分幾個部份(下面這張是我自己做出來的圖),左邊綠色的字是自己擷取的,中間常常看到的輸入框是windows處理的,我把兩個一起顯示出來,通常自己有處理就不給windows處理了
(下面這張是新注音,MSDN上的圖)(其實注音跟新注音不太一樣),這張說明了我們要處理的東西有四個,一個是所謂字根(字根在這裡指的是注音符號,當然還有日文跟簡體中文的字根都不同)(A),一個是輸入的字串(這時候會送給視窗WM_CHAR把字送出去)(B),一個是選字的內容(C),一個是目前的輸入法(D),其實呢,注音輸入法沒有下圖的A部分,所以新注音的處理上怪怪的,但是技術上來說,只把他當作三種就好,就是我們只處理這三個東西
D.狀態(Status Windows)-顯示目前的輸入法
B.字根輸入(Composition Windows)-顯示目前鍵盤按的情況
C.選字視窗(Candidates Windows)-列出目前字根對應的全部文字
以下稍微列出幾個需要處理的訊息
WM_INPUTLANGCHANGE: //用來處理輸入法改變
WM_IME_STARTCOMPOSITION: //開始打字根的時候會送出的訊息
WM_IME_ENDCOMPOSITION: //處理結束打字的時候,就是選好字後,要作的動作
WM_IME_COMPOSITION: //輸入改變時會送的訊息,這裡面根據lParam還有很多參數,常用的是GCS_RESULTSTR(得到選好的字時),GCS_COMPSTR(得到轉換後的字),GCS_COMPREADSTR(得到從鍵盤輸入的字根)
WM_IME_NOTIFY: //這就根據wParam控制很多了,IMN_SETCONVERSIONMODE(全形/半形,中/英這些的改變),IMN_OPENCANDIDATE(進入選字狀態),IMN_CHANGECANDIDATE(選字表翻頁),IMN_CLOSECANDIDATE(關閉選字表)
這只是簡單的紀錄一下,以免忘記每個訊息的意義
詳細還是要看規格或DX9SDK裡面的DXUT範例
MSDN例子
Posted by: kevinlin on: 八月 2, 2006
自己做按鈕還要自己改變滑鼠游標的圖案,要改成超連結的鼠標圖案,真是有夠麻煩
HCURSOR hcur=::LoadCursorFromFile(xxx.ani);
::SetClassLong(App.GetHWnd(),GCL_HCURSOR,(LONG)hcur);
這樣就能改變滑鼠的游標了的圖案
最近的回應