如何在自定义图标的消息框上使用'MAINICON'?

xiedewei 2009-02-06 06:12:59
默认情况工程目录都有一个与工程同名的资源文件*.res,里面有一个图标资源MAINICON,
我自己又加进去一个图标101。
下面的代码可以让图标101显示在消息框上,可是如何才能在消息框上使用MAINICON呢??
请各位高人赐教。
procedure TForm1.Button1Click(Sender: TObject);
function MessageEx(lText, lCaption: PChar; lStyle: DWORD; IconId: Integer): 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 := MakeIntResource(IconId);
{如果改成Msg.lpszIcon := 'MAINICON';不能显示图标MAINICON}
Msg.dwContextHelpId := 0;
Msg.lpfnMsgBoxCallback := nil;
Msg.dwLanguageId := LANG_NEUTRAL;
Result := Integer(MessageBoxIndirect(Msg));
end;
begin
MessageEx('MessageEx', 'MessageEx', MB_OK or MB_USERICON, 101);//可以显示图标101
end;
...全文
469 16 打赏 收藏 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiedewei 2009-02-09
  • 打赏
  • 举报
回复
第一段代码应改为:
procedure TForm1.Button1Click(Sender: TObject);

function MessageEx(lText, lCaption: PWideChar; lStyle: DWORD; IconID: PWideChar): Integer;
var
Msg: TMsgBoxParamsW;
begin
Msg.cbSize := Sizeof(Msg);
Msg.hwndOwner := Application.Handle;
Msg.hInstance := HInstance;
Msg.lpszText := lText;
Msg.lpszCaption := lCaption;
Msg.dwStyle := lStyle;
Msg.lpszIcon := IconID;
Msg.dwContextHelpId := 0;
Msg.lpfnMsgBoxCallback := nil;
Msg.dwLanguageId := LANG_NEUTRAL;
Result := Integer(MessageBoxIndirectW(Msg));
end;

begin
MessageEx('Hello MessageEx!','MessageEx', MB_OK or MB_USERICON, 'MAINICON');{PWideChar(101)}
end;

数字ID,字符串ID都没问题了!
xiedewei 2009-02-09
  • 打赏
  • 举报
回复
哈哈终于搞定了!
通过十六进制比对资源文件(*.res)我发现'MAINICON'的十六进制串是这样的:'AD 00 41 00 49 00 4E 00 49 00 43 00 4F 00 4E 00',豁然开朗了:
测试Msg.lpszIcon := 'M'+#0+'A'+#0+'I'+#0+'N'+#0+'I'+#0+'C'+#0+'O'+#0+'N'+#0;成功!
或者说应该直接使用宽字符的MessageBoxIndirectW:
procedure TForm1.Button1Click(Sender: TObject);
var
Msg: TMsgBoxParamsW;
begin
Msg.cbSize := Sizeof(Msg);
Msg.hwndOwner := Application.Handle;
Msg.hInstance := HInstance;
Msg.lpszText := 'MY MAINICON !';
Msg.lpszCaption := 'MAINICON';
Msg.dwStyle := MB_OK or MB_USERICON;
Msg.lpszIcon := 'MAINICON';
Msg.dwContextHelpId := 0;
Msg.lpfnMsgBoxCallback := nil;
Msg.dwLanguageId := LANG_NEUTRAL;
MessageBoxIndirectW(Msg);{成功显示MAINICON}
end;
xiedewei 2009-02-09
  • 打赏
  • 举报
回复
有没有高手能够实现的 我可以加分
lihuasoft 2009-02-08
  • 打赏
  • 举报
回复
我在一楼的回答有误。因从来没有用过MessageBoxIndirect,孤陋寡闻
原来TMsgBoxParams.lpszIcon就是资源文件里的资源名字。但我不会。再顶
yinjingxin3000 2009-02-08
  • 打赏
  • 举报
回复
哦,对不起,虽然什么有点“跑篇”了,但是验证了下面的想法。
不能能显示图标时因为没有找到资源。ms 实现 MessageBoxIndirect函数时,将图标资源的标识符视为一个整数,因此,不支持以字符标识表示的资源。
yinjingxin3000 2009-02-08
  • 打赏
  • 举报
回复
试了一下,这样测试正常

procedure TForm1.Button1Click(Sender: TObject);
function MessageEx(lText, lCaption: PChar; lStyle: DWORD; IconId: Integer): Integer;
var
Msg: TMsgBoxParams;
begin
Msg.cbSize := Sizeof(Msg);
Msg.hwndOwner := Application.Handle;
// Msg.hInstance := HInstance;
Msg.hInstance := 0;//如果使用系统定义的标准图标,这个句柄必须为0
Msg.lpszText := lText;
Msg.lpszCaption := lCaption;
Msg.dwStyle := lStyle;
Msg.lpszIcon := MakeIntResource(IconId);
{如果改成Msg.lpszIcon := 'MAINICON';不能显示图标MAINICON}
Msg.dwContextHelpId := 0;
Msg.lpfnMsgBoxCallback := nil;
Msg.dwLanguageId := LANG_NEUTRAL;
Result := Integer(MessageBoxIndirect(Msg));
end;
begin
MessageEx('MessageEx', 'MessageEx', MB_OK or MB_USERICON, 101);//可以显示图标101
MessageEx('MessageEx', 'MessageEx', MB_OK or MB_USERICON, 32512);//应用程序图标

end;
yinjingxin3000 2009-02-08
  • 打赏
  • 举报
回复
IDI_APPLICATION = MakeIntResource(32512);

MessageEx('MessageEx', 'MessageEx', MB_OK or MB_USERICON,32512 );//可以显示图标101

shishi
xiedewei 2009-02-07
  • 打赏
  • 举报
回复
这段代码可以直接使用的,请有时间的朋友帮帮忙啦
xiedewei 2009-02-07
  • 打赏
  • 举报
回复
TMsgBoxParams、MessageBoxIndirect都是在Windows.pas定义的,
MessageBoxIndirect是API函数,TMsgBoxParams.lpszIcon的类型是PAnsiChar。
都不是我自定义的。
请楼上兄弟测试一下,多谢
xiedewei 2009-02-07
  • 打赏
  • 举报
回复
楼上通过测试的?
hidelphi 2009-02-07
  • 打赏
  • 举报
回复
Msg.lpszIcon := Application.Icon.Handle
xiedewei 2009-02-07
  • 打赏
  • 举报
回复
测试了MessageEx的朋友顶个贴啊
xiedewei 2009-02-07
  • 打赏
  • 举报
回复
真的可以吗 我试了怎么不行呀?
我测试结果:
Msg.lpszIcon := Application.Icon.Handle;//报错类型不匹配
MessageEx('MessageEx', 'MessageEx', MB_OK or MB_USERICON, application.icon.handle);//显示空白
不得闲你是怎么写的?
xieguoking 2009-02-07
  • 打赏
  • 举报
回复
增加些人气。。。。
不得闲 2009-02-07
  • 打赏
  • 举报
回复
2楼说了
application.icon.handle就可以了
lihuasoft 2009-02-06
  • 打赏
  • 举报
回复
不知道你的TMsgBoxParams.lpszIcon是什么类型的(代码中未给出定义部分)

如果是TIcon类型的,可以这样:Msg.lpszIcon := Application.Icon;
如果是HICON类型的,可以这样:Msg.lpszIcon := Application.Icon.Handle;
termux-app_v0.118.3+github-debug_arm64-v8a.apk是专为安卓arm64-v8a架构设备打造的开源终端模拟器安装包,为GitHub编译的debug调试版本,适配主流64位安卓手机、平板设备。该工具最大的核心优势是无需设备ROOT权限,即可在安卓系统中搭建完整且独立的轻量化Linux运行环境,打破移动端系统限制,为移动开发、远程运维、程序调试提供便携的终端工作场景,区别于普通正式版,该调试版本保留完整运行日志,适配开发调试场景。 该软件内置专属Linux包管理体系,搭载pkg包管理器,支持在线安装Python、Git、SSH、编译工具链、网络工具等海量开源组件,完整复刻电脑端Linux常用命令操作,可直接在移动端执行代码编译、脚本运行、网络测试、文件处理等操作。软件采用独立沙盒目录运行,所有程序、配置文件均隔离存储,不会篡改、污染安卓原生系统文件,保障设备系统安全稳定。 在实用功能上,软件支持双向SSH远程运维,既可作为客户端远程连接云服务器、本地主机完成运维工作,也可搭建本地服务端实现电脑反向连接移动端终端。同时支持自定义Shell脚本、自动化任务编写,能够实现文件批量处理、定时任务执行等功能,适配轻量化开发需求。适配手机本地存储读写,可自由调用设备本地文件,实现数据互通处理。 本次arm64架构版本针对64位移动处理器深度优化,运行流畅、资源占用低,后台驻留稳定性更强。Debug调试版本可全程记录程序运行日志、报错信息,方便开发者排查程序异常、调试代码漏洞,是开发测试专用版本。该软件广泛应用于移动轻量开发、便携式服务器运维、网络环境调试等合法场景,是移动端高效的便携Linux终端工具。
本资源提供全国范围2026年水系(线+面)空间分布数据,系统整理全国范围内河流、沟渠、水道、湖泊、水库等水系要素,包含可编辑MXD工程文件、标准Shapefile矢量文件以及标准成图TIF文件,可用于水文地理、水资源管理、生态环境及自然灾害等相关研究。 原始数据来源是Open Street Map(OSM),水系类型包括江、河、溪、水域、水库、河岸、河堤等等,可在shp文件属性表中自行查阅。 数据包含水系线和水系面两类矢量数据。线状水系用于表达河流、沟渠及其他线性水体的空间位置和形态;面状水系用于表达湖泊、水库及其他具有一定面积的水体分布,可较直观地反映全国范围河湖水系的空间格局。 标准Shapefile文件支持空间查询、属性编辑、长度与面积统计、河网密度分析、缓冲区分析及专题制图,可与行政区划、DEM、土地利用、人口、降水及灾害数据进行空间叠加。资源配套提供可编辑MXD工程文件,完成水系图层组织、符号配置、标注及地图版式设置,便于用户直接在ArcGIS中编辑和制图。 该数据可广泛应用于全国范围水资源管理、河湖空间格局研究、洪涝灾害分析、生态环境评价、流域研究及国土空间规划等领域,可为区域水系特征分析及相关GIS空间研究提供基础数据支撑。 同时提供标准成图TIF文件,可直接用于科研论文、项目报告、专题地图及教学展示。整体数据具有线面数据配套、空间分布直观、格式完整、GIS兼容性好等特点,可满足全国范围水系空间分析、专题制图及科研应用需求。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧