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

對於取得可視元件ClassName的疑惑?

尚未結案
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-24 22:44:21 IP:163.29.xxx.xxx 未訂閱
大家好: 我在Form擺上各式各樣可視元件,透過攔截訊息方來取得滑鼠所在位置之元件類別(ClassName)名稱,大部分都可以順利取得,但有些例外,如TSpeedButton、TShape、TLabel、TImage...等等,附上程式碼,有勞各位幫忙看看原因何在?方法錯了嗎?如何修改?     .h void __fastcall AppMessage(tagMSG &Msg, bool &Handled); .cpp //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Application->AppMessage; } //--------------------------------------------------------------------------- void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled) { if(Msg.message==WM_MOUSEMOVE) { char name[256]; GetClassName(Msg.hwnd,name,256); AnsiString str; Caption = str.sprintf("滑鼠座標:(x=%d,y=%d);類別名稱:%s",Msg.pt.x,Msg.pt.y,name); } } 發表人 - g6101 於 2004/03/24 22:45:54
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-24 23:02:22 IP:140.135.xxx.xxx 未訂閱
g6101您好: 原因是因為您例舉的那些元件都沒有Handle< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-25 00:06:37 IP:163.29.xxx.xxx 未訂閱
taishyang 版主您好: 非常感謝您的答覆,原來是這樣啊!那再請教版主是否有變通方法可以取得無>
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-25 00:13:50 IP:140.135.xxx.xxx 未訂閱
您好: 試試
void __fastcall TForm1::Shape1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  ShowMessage(Sender->ClassName());
}
再將其他如TImage, TLabel的MouseDown事件都設為Shape1MouseDown 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-25 10:23:46 IP:61.218.xxx.xxx 未訂閱
q6101:    試試:
Unit1.H
//---------------------------------------------------------------------------    #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
#include <Buttons.hpp>
#include 
#include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:        // IDE-managed Components
        TListBox *ListBox1;
        TButton *Button1;
        TTimer *Timer1;
        TImage *Image1;
        TRichEdit *RichEdit1;
        void __fastcall Button1Click(TObject *Sender);
private:        // User declarations
public:                // User declarations
        __fastcall TForm1(TComponent* Owner);
   void __fastcall ShowObjInf(TObject *Obj);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif        Unit1.cpp
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::ShowObjInf(TObject *Obj)
{
  ListBox1->Items->Add("類別名稱 :"   Obj->ClassName());
  ListBox1->Items->Add("父系類別名稱 :"   Obj->ClassParent()->ClassName());
  ListBox1->Items->Add("物件大小 :"   IntToStr((int)Obj->InstanceSize()));      if (!Obj->InheritsFrom(__classid(TControl)))
        ListBox1->Items->Add("這是非可視元件");
  else
        ListBox1->Items->Add("這是可視元件");       ListBox1->Items->Add("");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ShowObjInf(ListBox1);
  ShowObjInf(Timer1);
  ShowObjInf(Image1);
  ShowObjInf(Form1);
  ShowObjInf(RichEdit1);
}
//---------------------------------------------------------------------------
/*生活是一種藝術,用心生活才能享受生活*/
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-26 00:13:49 IP:163.29.xxx.xxx 未訂閱
二位版主您們好: (1)主題純屬試驗性質,祇能移動滑鼠,而不可有點選的動作或傳送KeyWord前提下,判斷滑鼠所在位置之元件類別名稱,在發表主題時沒有描述清楚,真是非常抱歉。 (2)在還沒有發表這篇主題之前,誤以為所有可視元件都有Handle值,多虧taishyang 版主提醒,才驚覺「代誌不是像憨人想的那麼簡單(指本人)」要完成本題有那麼一點點難度。 ( >,又學會了一招,謝謝啦! (> <> >
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-26 00:32:54 IP:140.135.xxx.xxx 未訂閱
您好:
引言: 一個元件位置大小如何傳入TRect結構中?又如何與滑鼠座標做比對?有沒現成的方法或API可以用?
我想您要的應該是像下面連結的討論 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=25078 取得滑鼠座標
GetCursorPos();
假設您用之前的方式或得該元件的ClassName 自然會得到其Top, Left, Right, Bottom, 也就可以傳入TRect了 分數我想axsoft大哥和我都不會在意,但我個人認為axsoft大哥的範例非常有參考價值 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
系統時間:2024-11-22 7:55:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!