Delphi 7 自定义消息框MessageMyDlg

      在之前的文章《深入了解Delphi 7中的四种消息框》了解到MessageDlg消息框不够强大,而Application.MessageBox、MessageBox实质都是Windows API函数MessageBox,无法根据自己需要所修改。于是,从MessageDlg入手,定制自己所需要的消息框。有时候我们需要在消息框上弹出的按钮不是“确定”、“是”、“否”等等,而需要“继续”、“退出”等按钮文本;有时候我们不需要消息框上还出现了标题栏的关闭按钮,给用户逃避选择的机会,于是去掉标题栏关闭按钮也是根据实际可能需要的。

自定义消息框MessageMyDlg函数原型:

{------------------------------------------------------------------------------- 
  过程名:    MessageMyDlg 
  功能:      自定义的消息框 
  参数:      Msg: string;                  消息内容 
               MsgTitle: string;             消息标题 
               DlgType: TMsgDlgType;         消息显示图标 
               Buttons: TMyMsgDlgButtons;    消息按钮集合 
               ShowClose: Boolean            消息框标题栏关闭按钮的显示 
  返回值:    Integer 
-------------------------------------------------------------------------------} 
function MessageMyDlg( const Msg, MsgTitle:  string; DlgType: TMsgDlgType; Buttons: TMyMsgDlgButtons; ShowClose: Boolean): Integer; 


自定义消息框源码:(展开即可显示

使用示例:

unit Unit1; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, XPMan; 
 
type 
  TForm1 =  class(TForm) 
    btn1: TButton; 
    xpmnfst1: TXPManifest; 
     procedure btn1Click(Sender: TObject); 
   private 
     { Private declarations } 
   public 
     { Public declarations } 
   end
 
var 
  Form1: TForm1; 
 
implementation 
 
uses MyMessagebox; 
 
{$R *.dfm} 
 
procedure TForm1.btn1Click(Sender: TObject); 
begin 
  MessageDlg( '这是MessageDlg弹出消息框',mtError,mbYesNoCancel, 0);      //全英文 
  MessageMyDlg( '这是MessageMyDlg弹出消息框', '自定义标题',mtError,mcYesNoCancel,False);  //全中文 
 
   case MessageMyDlg( '您的操作还未完成?' + # 13# 13 +  '请点击“继续”按钮继续完成操作,如果您想终止操作,' + # 13 +  '请点击“退出”按钮。''提示', mtInformation,  [mcContinute, mcExit]of 
    mrContinute: ShowMessage( '按了继续按钮'); 
    mrExit: ShowMessage( '按了退出按钮'); 
   else ShowMessage( '按了标题栏的关闭按钮'); 
   end
end
 
end
 

结果如下图所示:

应用程序在运行当中经常要输出各种即时信息,Delphi提供了多种形式的消息对话可以满足这些要求,尽管可以使用各种标志定制一个消息,但仍不能将自己的图标放在消息内,也不能修改其标准行为去创建自己的消息,其实通过调用函数MessageBoxIndirect()就很容易绕过这些明确的限制,这是一个功能很强、易于使用的函数。 ---- 此函数在WINDOWS单元里面,文件位于Delphi安装路径Source\Rtl\Win里面,需要指出的是,Delphi的原代码中它的返回值类型是BOOL型,而实质上它的返回值应为Integer。修改方法:在WINDOWS单元中找到此函数后,把BOOL改为Integer,共有三处要修改,然后在Delphi安装路径Lib中找到WINDOWS.DCU文件,把它改名或者删除,并把修改后的WINDOWS.PAS源码复制到Lib路径中。 ---- 该函数只有一个参数,类型是TMsgBoxParams,它的结构及说明如下: tagMSGBOXPARAMSA = packed record cbSize: UINT; {数据结构的长度} hwndOwner: HWND; {所有者窗口句柄} hInstance: HINST; {应用程序实例句柄} lpszText: PAnsiChar; {在消息客户区内显示的文本} lpszCaption: PAnsiChar; {标题栏文本} dwStyle: DWORD; {确定消息内按钮和图符 的数量及种类的MB_标志} lpszIcon: PAnsiChar; {从资源文件中取出的一个 图符资源的名字} dwContextHelpId: DWORD; {指定帮助文本的ID号} lpfnMsgBoxCallback: TPRMsgBoxCallback; {当用户按下HELP按钮时调用的一个回 调函数} dwLanguageId: DWORD; {显示在按钮内文本的语言定义} end; ---- 由于直接使用此函数比较复杂,我们可以自定义一个函数来封装此函数,对它进行简化,在用法上尽量做到与Delphi消息相一致,自定义函数代码如下: function MessageEx (lText,lCaption:PChar; lStyle:DWord;lIcon:PChar):Integer; var Msg:TMsgBoxParams; begin Msg.cbSize:=Sizeof(Msg); Msg.hwndOwner:=Application.Handle; Msg.hInstance:=hinstance; Msg.lpszText:=lText; Msg.lpszCaption:=lCaption; Msg.dwStyle:=lStyle; Msg.lpszIcon:=lIcon; Msg.dwContextHelpId:=1; Msg.lpfnMsgBoxCallback:=nil; Msg.dwLanguageId:=LANG_NEUTRAL; Result:=MessageBoxIndirect(Msg); end; ---- 要想在消息中显示自己的图标,先准备一个装有图标的资源文件,加在程序中,如{$R c:\mydir\myres.res},在lStyle参数里除了所需的MB_标志外还要加上MB_USERICON标志,并在最后一个参数里写上资源文件中图标的名字,如果不想使用自定义的图标,可将最后一个参数设为nil。函数的其它用法和返回值的处理与Delphi提供的消息一样。 ---- 强烈建议把自定义函数放在一个单元文件里,并把此文件放在Delphi的搜索路径如Lib下,以后只需要把此单元加在uses语句里,就可以直接使用自定义函数,非常方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值