怎麼處理VCL的Message之終極必殺技 (全) |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
前題:不管你是用Delphi或BCB開發出來的VCL, 儘管各式各樣的都有, 但有時
想處理一些Message來達到自己的目的時, 你要如何下手呢? 1.無法拿到
Source Code 2.不想寫VCL. 優點:處理速度最快, 而且適合喜歡純手工打造的朋友, 而且整個處理過程,一
目了然, 不像BEGIN_MESSAGE_MAP的marco, 不知道BCB在裡面動了什麼手
腳 原理:1.先把原來VCL處理Messge的程式位址記錄下來.
2.每次Window有送Message進來時, 判斷是不是自己要處理的Message
3.如果是, 可以決定要不要作原來VCL要作的事, 還是自己要處理的事先
作 現在, 就以一個TMemo的範例, 把原來游標只有一條線, 改成粗粗的方塊
學會這個必殺技後, 日後你覺得那一個VCL不爽, 就可以自己改寫它囉 步聚:
1. New一個Application. 擺一個TMemo上去, 設好你要的屬性
2. 宣告儲存原始VCL處理Message的程式位址 TWndMethod OldWinProc;
至於要宣告在public or private隨你高興
3. 作一個改變游標粗細的程式
void __fastcall TForm1::MyCaret()
{
CreateCaret(Memo1->Handle, NULL, 8, 20);
ShowCaret(Memo1->Handle);
}
4. 再來, 整個主題的關鍵報告來囉
OldWinProc=Memo1->WindowProc;
Memo1->WindowProc=MyMessage;
5. 接著, 你就可以寫個MyMessage, 來個大搞特搞, ^^ void __fastcall TForm1::MyMessage(TMessage & Message)
{
switch (Message.Msg)
{
case WM_KEYDOWN:
case WM_LBUTTONDOWN:
case WM_PAINT:
case WM_SETFOCUS:
OldWinProc(Message);
MyCaret();
return;
}
OldWinProc(Message);
} 6. 按下Run吧 ^^, 沒事可以把這些事件, 尤其是WM_PAINT, 點掉看看
等有別的Form移到你的Form, 看有什麼變化, 那你就知道WM_PAINT是何時
會來處理囉 ^^ 學會了嗎? 開始大搞特搞吧! 這個技巧真的是屢試不爽, 贊 Source Code:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=20072
|
鈴鐺
初階會員 發表:33 回覆:81 積分:35 註冊:2002-03-13 發送簡訊給我 |
感謝 lcsboy, 我翻譯成 delphi 也可以用. 先建立 memo,button 物件
var G_OldWinProc : TWndMethod; procedure TForm1.MyMemoMessage(var Message: TMessage); begin if (Message.Msg=WM_KEYDOWN) or (Message.Msg=WM_LBUTTONDOWN) or (Message.Msg=WM_PAINT) or (Message.Msg=WM_SETFOCUS) then begin G_OldWinProc(Message); CreateCaret(Memo1.Handle, 0, 8, 20); ShowCaret(Memo1.Handle); end else G_OldWinProc(Message); end; procedure TForm1.Button1Click(Sender: TObject); begin // 切換 memo1 的 cursor size Button1.Tag := 1 - Button1.Tag; if Button1.Tag>0 then begin G_OldWinProc:=memo1.WindowProc; memo1.WindowProc := MyMemoMessage; end else begin memo1.WindowProc := G_OldWinProc; G_OldWinProc:=nil; end; end; |
HomeSound
中階會員 發表:44 回覆:178 積分:94 註冊:2002-08-31 發送簡訊給我 |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |