判斷視窗類別並取得其文字 |
缺席
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
請先參考:
【BCB】【發表】取得視窗列表 + 視窗內所有子視窗元件列表(分層顯示)+ 顯示 / 隱藏 / 改文字
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30743 我有一些疑問... 在 Message 中是否有類別判斷的 messageID 呢,否則,我只要將 ListBox 類別的元件故意另外做一個並取 graphics 之類的名稱,那這類的程式不就無法判讀了嗎?
另外,像 TLabel 之類的要如何取得/修改呢? 沒空更新的網頁...
http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
allanchou
一般會員 發表:9 回覆:35 積分:8 註冊:2003-04-01 發送簡訊給我 |
這問題我以前有稍微stusy, 不過還沒解決 cc... 從 TGraphicControl下來的元件, 是用 Device context 畫的,
因此不能從取得 window handle 來操作, 但是DC也是有handle可以取, 例如 Label->Canvas->Handle
只是如何例舉出來... 或許可以攔截 TWMPaint裡的DC下手,
因為從程式碼 Canvas.Handle是從 Message.DC指定的. (我猜的啦) procedure TGraphicControl.WMPaint(var Message: TWMPaint);
begin
if Message.DC <> 0 then
begin
Canvas.Lock;
try
Canvas.Handle := Message.DC;
try
Paint;
finally
Canvas.Handle := 0;
end;
finally
Canvas.Unlock;
end;
end;
end;
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: 這問題我以前有稍微stusy, 不過還沒解決 cc... 從 TGraphicControl下來的元件, 是用 Device context 畫的, 因此不能從取得 window handle 來操作, 但是DC也是有handle可以取, 例如 Label->Canvas->Handle 只是如何例舉出來... 或許可以攔截 TWMPaint裡的DC下手, 因為從程式碼 Canvas.Handle是從 Message.DC指定的. (我猜的啦)TGraphicControl -> TCustomLabel -> TLabel 所以 TLabel 上的「字」是「畫」出來的!是這樣嗎? 我也看了一下 TWinControl -> TCustomControl -> TCustomGrid -> TDrawGrid -> TStringGrid 來自 DrawGrid 是否也表示 TStringGrid 上的 String 都是「畫」的呢? 我比較想知道在 Windows API 中,到底提供了多少基本物件及存取這些基本物件的方法,這樣對別人的應用程式,不論是否是用 Delphi/BCB 寫的,都可以存取其內容。 如果已知是 Delphi/BCB 寫的,可以使用 Delphi Application Peeper http://www.devrace.com 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....procedure TGraphicControl.WMPaint(var Message: TWMPaint); begin if Message.DC <> 0 then begin Canvas.Lock; try Canvas.Handle := Message.DC; try Paint; finally Canvas.Handle := 0; end; finally Canvas.Unlock; end; end; end;
------
http://www.ViewMove.com |
allanchou
一般會員 發表:9 回覆:35 積分:8 註冊:2003-04-01 發送簡訊給我 |
引言: TGraphicControl -> TCustomLabel -> TLabel 所以 TLabel 上的「字」是「畫」出來的!是這樣嗎? 我也看了一下 TWinControl -> TCustomControl -> TCustomGrid -> TDrawGrid -> TStringGrid 來自 DrawGrid 是否也表示 TStringGrid 上的 String 都是「畫」的呢? 我比較想知道在 Windows API 中,到底提供了多少基本物件及存取這些基本物件的方法,這樣對別人的應用程式,不論是否是用 Delphi/BCB 寫的,都可以存取其內容。 如果已知是 Delphi/BCB 寫的,可以使用 Delphi Application Peeper http://www.devrace.com其實我是沒學過pascal, 不過看這段是 DrawText畫出來的應該沒錯, 就我知道除了一般control項, 有許多是應用 GDI的API 畫的, vcl 是從 TContrl 分為 TWinControl 與 TGraphicControl 我最不熟的就GDI, 該去買本書來看看了... procedure TCustomLabel.DoDrawText(var Rect: TRect; Flags: Longint); var Text: string; begin Text := GetLabelText; if (Flags and DT_CALCRECT <> 0) and ((Text = '') or FShowAccelChar and (Text[1] = '&') and (Text[2] = #0)) then Text := Text ' '; if not FShowAccelChar then Flags := Flags or DT_NOPREFIX; Flags := DrawTextBiDiModeFlags(Flags); Canvas.Font := Font; if not Enabled then begin OffsetRect(Rect, 1, 1); Canvas.Font.Color := clBtnHighlight; DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags); OffsetRect(Rect, -1, -1); Canvas.Font.Color := clBtnShadow; DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags); end else DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags); end; 至於 dllee san 說的 TStringGrid, 我稍微看了一下 我認為Grid 是畫的, String 似乎是用 TCustomMaskEdit 配合 Message 實作出來的. 好龐大喔... 有說錯, 麻煩跟我說, 我已經一年沒碰BCB, 最近才開始複習ㄋㄟ. |
allanchou
一般會員 發表:9 回覆:35 積分:8 註冊:2003-04-01 發送簡訊給我 |
我找到一本舊書, ' C++ Builder 深度歷險' 裡面有講解,
怪我自己忘的太快了...
引用內文;
TGraphicControl 是所有自製圖形元件的始祖, 他們是可視元件, 不過與TWinControl元件不同, 這些元件不會建立window, 因此無法擁有鍵盤輸入焦點...
TGraphicControl 比TControl多出兩項特點
1. 攔截WM_PAINT 提供Paint虛擬函數供後代類別改寫.
2. 提供Canvas供後代類別使用.
因此TGraphicControl 類別主要功用, 擔任自製圖形元件的父類別,
讓元件撰寫者繼承使用, 由它衍生新的元件時, 只要改寫Paint函式
,就可以在其中繪製元件外觀, 創造出新的non-windowed 元件.
因此 TLabel 是不具window的, 要用 TStaticText才有window.
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
剛才用 Dr.Eye 試一下,它也無法取得 TLabel 的文字,所以,可能無法由 WinAPI 取得,不過 TStringGrid 內的文字 Dr.Eye 是可以取到的喔,但不知 TStringGrid 是要如何由 API 來取得其內容?
目前的【BCB】【發表】取得視窗列表 + 視窗內所有子視窗元件列表(分層顯示)+ 顯示 / 隱藏 / 改文字
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30743
並不能取得 TStringGrid 的內容... 另外,我重申我問題的重點:
在 Message 中是否有類別判斷的 messageID 呢?或是有 API 可以得知它的類別,而不是由 classname 取得。
否則,我只要將 ListBox 類別的元件故意另外做一個並取 graphics 之類的名稱,那這類的程式不就無法判讀了嗎? 沒空更新的網頁...
http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
我想, Windows Message可以從PostMessage & SendMessage這兩個API來看
第一個參數傳Handle, 後面接著的是要傳的Windows Message ID, 接下來的是兩個參數
因此, 在 Windows Message 中是完全沒有類別判斷的 messageID 另一方面, 不管你的Class怎麼寫, VCL怎麼繼承, Windows Message的傳遞, 就是對Handle來送, 每一個VCL都有不同的Handle, 每個視窗都有不同的Handle, 是唯一, 絕對/一定/肯定不會有重覆的Handle Windows Messages的玩法大概就是這樣. 只是單純的傳遞, 只不過在VCL裡, 會有相對應的Messages Dispatch來處理不同Message傳過來的參數, 作不同的behavior 若是你把ListBox故意亂改, 作成另一個VCL, 不管你怎麼改怎麼變, 在下次執行這個新的VCL時, OS會重新給一個Handle 你不可能在ListBox已經在執行中, runtime改變ClassName吧? 好吧, 就算你改了ListBox的ClassName之類的東西, 只要不改變Handle, 只要對他送Messages, 還是收得到的. 判斷類別和Windows Message是兩回事. 作用也不同. 如果我的見解有什麼錯誤, 請不吝指教
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
今天看到這篇
■ findwindowex為何失效?
http://delphi.ktop.com.tw/topic.php?topic_id=20123 ccchen 介紹了如何使用 GetMenu/GetMenuItemCount/GetMenuItemID/GetMenuString/GetSubMenu 等函式取得選單的文字及 ID 還可透過 ID 幫使用者「按下」選單 我看 > 不過至少用 > <>沒空更新的網頁...
href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
在未來的一段時間,可能會比較忙,
因此,暫時將此問題結案了 < >
如果您有好的解答,歡迎回應,目前的系統可以重新給分喔 < > 沒空更新的網頁...
http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |