線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4140
推到 Plurk!
推到 Facebook!

判斷視窗類別並取得其文字

缺席
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-21 10:56:14 IP:61.231.xxx.xxx 未訂閱
請先參考: 【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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-21 15:47:26 IP:61.218.xxx.xxx 未訂閱
這問題我以前有稍微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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-21 17:15:18 IP:61.231.xxx.xxx 未訂閱
引言: 這問題我以前有稍微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;
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....
------
http://www.ViewMove.com
allanchou
一般會員


發表:9
回覆:35
積分:8
註冊:2003-04-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-21 18:11:53 IP:61.218.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-22 15:53:29 IP:61.218.xxx.xxx 未訂閱
我找到一本舊書, ' 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-22 18:15:41 IP:61.231.xxx.xxx 未訂閱
剛才用 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-22 18:43:37 IP:211.23.xxx.xxx 未訂閱
我想, 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-22 22:05:32 IP:61.224.xxx.xxx 未訂閱
或許是我對於 API 真的研究太少,不太清楚如何表達  舉例好了,例如,目前使用 >這是問題之一。 <>問題之二,就是在上述步驟中,以 > <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-27 20:28:11 IP:61.224.xxx.xxx 未訂閱
今天看到這篇 ■ 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-30 19:50:39 IP:61.224.xxx.xxx 未訂閱
在未來的一段時間,可能會比較忙, 因此,暫時將此問題結案了 < > 如果您有好的解答,歡迎回應,目前的系統可以重新給分喔 < > 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
系統時間:2024-04-25 4:26:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!