1.Delphi是怎样实现Windows的消息机制,并写出一个消息函数捕获WMUser_Test。
    Const
          WMUser_Test=WM_User+2001;
2. VCL类库的成次结构图。
刚学Delphi不久,遇到难题无人指导望各位帮忙。

解决方案 »

  1.   

    http://www.swissdelphicenter.ch/torry/showcode.php?id=1101
      

  2.   

    1.
    const
      WMUser_Test=WM_User+2001;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure WMUserTest(var Msg: TMessage);message WMUser_Test;
      end;
    ....
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SendMessage(handle,WMUser_Test,0,0)
    end;procedure TForm1.WMUserTest(var Msg: TMessage);
    begin
      ShowMessage('Reach the Message')
    end;
      

  3.   

    一般情况下,VCL的组件可以从Tcomponent为开始。其最明显的特征就是它的属性可以在设计时通过对象察看器来操纵,另外,他还能拥有其他组件。  从Tcomponent下,分出非可视组件和可视组件。  非可视组件如TOPenDialog,TTimer,TTable等,这些组件因为继承自Tomponent,所以也就继承了在设计时可以被操纵的特性。  可视化组件始自TControl,是它引入了可视化属性和方法,使继承自它的类都有了这些可视化特性。  TControl又分出两类组件类型:从TWinControl(窗口控件)自下的控件,和从TGraphicControl(图形控件)自下的控件。继承自TWinControl的控件将windows控件进行封装,所以拥有windows控件的很多特性,比如可以得到焦点,有唯一的句柄,用户可以通过发送消息与这些控件进行交互等。而继承自TGraphicControl的控件,也是可见的,但没有句柄,可以称之为图形控件,比如TLabel,TBevel,都是Delphi画出来的,并不占用系统资源。
      

  4.   

    给你一个Delphi自定义消息应用的例子,注意其中自定义的消息是:const 
    WM_BARICON=WM_USER+200; 捕获它并且对它进行处理:
    现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标。象FoxMail 3.0 NetVampire 3.0等都提供了这样的功能。实现这样的功能实际上并不复杂,在窗口最小化时,窗口会发出WM_SYSCOMMAND消息,你只要需要截取Windows的WM_SYSCOMMAND消息,在窗口最小化时隐藏窗口并调用WindowsAPI函数Shell_NotifyIcon将定义的图标添加到任务栏上,Shell_NotifyIcon的函数定义是这样的:function Shell_NotifyIcon(dwMessage:DWORD; lpData: PNotifyIconData): BOOL; stdcall; 其中的参数dwMessage指定Shell_NotifyIcon函数的操作,可以是NIM_ADD NIM_DELETE NIM_MODIFY三个值中的一个,分别对应添加图标、删除图标、修改图标的动作。   参数lpData指向的PNotifyIconData结构的定义如下: _NOTIFYICONDATAW = record 
    cbSize: DWORD; 
    Wnd: HWND; 
    uID: UINT; 
    uFlags: UINT; 
    uCallbackMessage: UINT; 
    hIcon: HICON; 
    szTip: array [0..63] of WideChar; 
    end; TNotifyIconData = _NOTIFYICONDATAW;   在这个结构中Wnd指明所属的窗口,UCallbackMessage指明回调消息,如果指明了Wnd和 uCallbackMessage,则当用户对任务栏图标有动作(如点击图标,在图标上移动光标等)。系统都会发送uCallbackMessage消息给Wnd指定的窗口。hIcon是要添加的图标的句柄,szTip 是图标的提示行(就是当移动光标到图标上,出现的一个小黄方框内出现的文字)。消息。实现上面的功能,最主要的是要处理WM_SYSCOMMAND消息和自定义的图标消息,这些消息在Delphi中并没有相应的事件。这里就需要使用到Delphi的自定义消息处理功能来截取并处理这些消息。   首先看下面的程序。在执行程序之前,首先要改变Form1的Icon属性,给Form1装入一个图标,否则在任务栏上会出现一块空白。 unit Unit1; 
    interface 
    uses 
    Windows, Messages, SysUtils, 
    Classes, Graphics, Controls, Forms, 
    Dialogs,ShellAPI; const 
    WM_BARICON=WM_USER+200; type 
    TForm1 = class(TForm) 
    private 
    procedure WMSysCommand(var 
    Message: TMessage); message WM_SYSCOMMAND; 
    procedure WMBarIcon(var 
    Message:TMessage);message WM_BARICON; 
    { Private declarations } 
    public 
    { Public declarations } 
    end; var 
    Form1: TForm1; implementation {$R *.DFM} 
    procedure TForm1.WMSysCommand 
    (var Message:TMessage); 
    var 
    lpData:PNotifyIconData; 
    begin 
    if Message.WParam = SC_ICON then 
    begin 
    //如果用户最小化窗口则将窗口 
    隐藏并在任务栏上添加图标 
    lpData := new(PNotifyIconDataA); 
    lpData.cbSize := 88; 
    //SizeOf(PNotifyIconDataA); 
    lpData.Wnd := Form1.Handle; 
    lpData.hIcon := Form1.Icon.Handle; 
    lpData.uCallbackMessage := WM_BARICON; 
    lpData.uID :=0; 
    lpData.szTip := 'Samples'; 
    lpData.uFlags := NIF_ICON 
    or NIF_MESSAGE or NIF_TIP; 
    Shell_NotifyIcon(NIM_ADD,lpData); 
    dispose(lpData); 
    Form1.Visible := False; 
    end 
    else 
    begin 
    //如果是其它的SystemCommand 
    消息则调用系统缺省处理函数处理之。 
    DefWindowProc(Form1.Handle,Message. 
    Msg,Message.WParam,Message.LParam); 
    end; 
    // 
    end; procedure TForm1.WMBarIcon(var Message:TMessage); 
    var 
    lpData:PNotifyIconData; 
    begin 
    if (Message.LParam = WM_LBUTTONDOWN) then 
    begin 
    //如果用户点击任务栏图标则将图标删除并回复窗口。 
    lpData := new(PNotifyIconDataA); 
    lpData.cbSize := 88;//SizeOf(PNotifyIconDataA); 
    lpData.Wnd := Form1.Handle; 
    lpData.hIcon := Form1.Icon.Handle; 
    lpData.uCallbackMessage := WM_BARICON; 
    lpData.uID :=0; 
    lpData.szTip := 'Samples'; 
    lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; 
    Shell_NotifyIcon(NIM_DELETE,lpData); 
    dispose(lpData); 
    Form1.Visible := True; 
    end; 
    end; end.   运行上面的程序,点击程序窗口标题栏上的最小化按钮,你就可以看到窗口被“最小化”成了一个任务栏图标,点击图标,窗口又会恢复原来的状态。   从上面的程序可以看到,Delphi的自定义消息处理功能的实现也是十分简单的,首先在Form类的Private定义中加入自定义消息处理函数的定义,定义的描述如下: procedure UserPro(Var Message: 
    TMessage):message WindowsMessage 
    其中UserPro是用户自定义消息处理函数的名称, 
    WindowsMessage是Windows消息常量或自定义消息常量。   然后在程序中加入消息处理函数,函数的一般格式如下: Procedure UserClass.UserPro(Var Message:TMessage); 
    var 
    //加入定义 
    Begin 
    //加入程序语句 
    End; 
    其中UserClass是封装自定义消息处理函数的类的名称。   最后,Delphi的自定义消息处理函数要涉及到Windows的消息的结构,在这里我就不多说了,大家可以参考Windows API帮助和Delphi的相关帮助信息。相信大家如果掌握了Delphi的自定义消息处理函数,一定可以编写出象VB一样简洁,象C++一样功能强大的程序来的。 
      

  5.   

    这里比较全面的http://www.mlxx.net/0dian/printpage.asp?ArticleID=122
      

  6.   

    层次图?嘿嘿我这里用好几张
    公司买的正版delphi带的我都拿来铺桌子:)