当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: 比方说,我在dll中,用postmessage(),向delphi主窗口发送消息,然后由delphi响应该消息,怎么写消息响应函数?或者dll中通过窗口句柄怎样访问窗口的成员函数?100分奉送!! ......
    摘要: 求找"纯文本文件转换成超文本文件"例子!!!谢谢!!! ......


Delphi中如何处理自定义消息100分奉送

比方说,我在DLL中,用PostMessage(),向Delphi主窗口发送消息,然后由Delphi响应该消息,怎么写消息响应函数?或者DLL中通过窗口句柄怎样访问窗口的成员函数?100分奉送!!

NO.1   作者: fyje

这里有篇文章,看看对你有没有帮助  
   
  Delphi自定义消息应用一例  
   
   
  现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标。象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++一样功能强大的程序来的。

NO.2   作者: xiaohuan

我刚写的程序,用了三个消息来处理窗口隐藏问题的  
  http://www.csdn.net/cnshare/soft/16/16879.shtm  
   
  源码:http://61.132.118.185:8080/datanew/mynote.rar

NO.3   作者: firetoucher

直接在窗口中使用:  
  procedure   函数名(var   参数名:   TMessage);   message   消息名;  
 


    摘要: 在这一页中有 main form这一下拉列表,这应该是运行application,出现的第一张页面吧? auto-create forms: available forms: 这两栏有什么区别,有些form我移到available forms中就会出错,为什么? 哪些可以放到available formszhong的? ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE