全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3492
推到 Plurk!
推到 Facebook!

怎麼處理VCL的Message之終極必殺技 (全)

 
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-04 00:50:57 IP:210.85.xxx.xxx 未訂閱
前題:不管你是用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-23 10:44:26 IP:211.21.xxx.xxx 未訂閱
感謝 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-09-06 06:48:23 IP:61.30.xxx.xxx 未訂閱
請教lcsboy大大: 有沒有辦法使的FORM再最小化時也能偵測到 (不是Active時)WM_SYSCOMMAND 的參數(如SC_SCREENSAVE) 的MESSAGE通知啊< > 小弟比較笨,希望你用範例教導一下 無限感激< > 乎搭啦!
------
--==多看.多學.多聽==--
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-09-06 10:49:46 IP:210.85.xxx.xxx 未訂閱
有地! 就是去攔WM_SYSCOMMAND呀... 但是你要串接Form1的WindowProc, 而不是Form上面任一個VCL的WindowProc. 多玩幾鍋! 你就知道Window程式設計的精神, 就可以攔對地方
系統時間:2024-05-20 1:13:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!