Windows SDK编程(Delphi版) 之 消息框和菜单资源

简介:

   博客园这两天又见到了语言的争论哈!这次是C#。我一般都不参与这种争论的,就算我蛋疼的不得了,我也不参与。因为这实在没啥意义可言,就像很多很多时候,在语言之争上,一次又一次的将Delphi推上风口浪尖,这个说Delphi不行,那个说Delphi气数已近。在我的博客的回复中也有不少这样的言论的。然而实际上呢,到目前为止Delphi的使用者还是相当的多,虽然不如以前那么如日中天,但是至少不会死掉。而我们作为一个程序员,停留在语言的一味的争论上,实在不是什么明智之举。不若,花点时间多了解一下语言或工具本身的特性。比如,很多人都只把Delphi看做为一个专门的数据库开发工具(很多Delphi程序员自己也都有这样的误解)。面对这样的言论,我实在不知道说他什么,难道我要说他们无知么?肯定不会,因为我也不是什么大智慧的高人。首先我们要摆正我们自己的思维方向,Delphi和VS这两个都是Windows下的开发工具,既然是Windows的开发工具,那么他们调用的都是 Windows的一套开发接口,也就是说,实际说来,都是用的微软开放的接口。既然如此,那么我们又何必争论这些东西呢,只为图一时痛快,将一方贬低,同时抬高自己?都要遵守Windows的开发准则,使用微软的同一套开发库(这个将QT,Wxdiget等跨平台库排除)。所以,我们将精力放在对于 Windows的编程规则,以及他的开放接口的掌握上作为首要目标,使用Delphi开发的人,要会VC(这个会不一定要会写,至少能看懂他的代码,能将他顺利转换到Delphi下),而使用VC的人,要也可以利用Delphi的资源。这样才是最终目的,而不是去争论谁好谁坏!我的目的只有一个,就是能够找到的资源,都要能够为我所用,而根本不必在乎是什么语言的代码,因为虽然他们的语言格式不同,但是他们的目的相同,要实现的功能相同,这就够了。所以,我才会将Windows的纯API编程方式全部用Delphi来讲解和实现一遍。让自己更加的熟悉Windows的编程规则,同时也能让更多人了解到 Windows程序的运作原理。好了,蛋疼的写了这些个废话,下面进入正题,在Delphi中建立菜单资源和使用消息框。

 

    消息框,是Windows给用户提示的一种非常有用的方法。消息框的主要作用就是通知用户发生了某件事情,让用户响应。这个在前面已经用过了,那便是 MessageBox这个函数

函数原型为:

int MessageBox(Hwnd hwnd,LPCSTR lpszText,LPCSTR lpszCaption,UINT MBType);

function MessageBox(Handle: THandle;lpszText: pchar;Caption: Pchar;MBType: UINT): integer;

第一个参数指定为父窗口句柄,lpszText指定消息框的消息字符串指针。lpSzCaption指定为消息窗口标题。MBType指定为消息框的显示类型,包括显示什么类型的按钮和图标。

MBType的取值为:

MB_ABORTRETRYIGNORE                 显示"终止,重试,护绿"按钮

MB_ICONEXCLAMATION                    显示一个感叹号图标

MB_ICONERROR                              显示一个错误信息图标

MB_ICONINFORMATION                    显示一个信息图标

MB_ICONQUESTION                         显示一个问号

MB_ICONSTOP                                显示一个停止符号

MB_OK                                          确定按钮

MB_OKCANCEL                              确定,取消按钮

MB_RETRYCANCEL                        重试,取消按钮

MB_YESNO                                   是,否按钮

MB_YESNOCANCEL                       是,否,取消按钮

MBType的值可以是上面的值的组合,组合采用OR或操作来表示,比如MB_OK or MB_ICONINFORMATION

 

函数返回用户对消息框的响应。可返回的值为:

  Abort            IDABORT

  Retry             IDRETRY

  Ignore           IDIGNORE

  Cancel           IDCANCEL

  No                IDNO

  Yes               IDYes

  Ok                IDOK


这个函数的用法非常简单,我也就不多说了。

  现在要详细讲解的是通过资源文件来建立菜单。

  Windows支持三种通用类型的菜单:

  1、主菜单

  2、弹出式子菜单

  3、浮动的独立弹出式菜单

主菜单式应用程序的最高层菜单。

  弹出式子菜单是从主菜单下弹出的。

  浮动式弹出菜单是自由菜单,也就是我们常用的TPopupMenu.

  菜单在Windows应用程序中占据着非常重要的地位,因此Windows内部提供了对菜单的大量支持。在Delphi中,我们使用菜单相当简单,仅仅拖一个控件,然后设置一下,就完成了。实际上菜单也是可以在RC文件中编写,然后通过Brcc32编译成资源文件给Delphi使用的。如果对原生的Win32 SDK编程非常了解的话,对这个应该比较清楚,菜单实际上也是资源的形式存在程序中的。现在我就说一下如何向窗口中增加一个菜单:

  1、在资源文件中定义菜单的形式。

  2、在程序创建它的主窗口时加载菜单。

  3、处理菜单的选取。

这就是一个SDK程序中使用菜单的几个步骤。

  资源文件,我想大家都不陌生,Delphi中使用R编译指令来引入资源文件形式为:

{$R XXX.res}

  这个应该都不会陌生了,至于一般的资源文件如何使用,我也就不多说了,仅仅说一下菜单这个资源,如何在Delphi的资源文件中体现出来。这个主要就是看菜单资源的定义语句。定义好了之后,编译一下就可以生成res资源文件了。

  所有菜单资源的定义方式都是:

  MenuName  MENU [Options]

  {

     menu items

  }

  其中,MenuName是菜单名(它可以是指定菜单的整形值,也可以是菜单名,在这里,我全部使用菜单名)。关键字Menu告诉资源编译器正在创建一个菜单。最后跟Option选项,具体内容为:

DISCARDABLE                   当不在需要菜单时,可从内存中将其删除

CHARACTERISTICS info      具体的应用程序信息,其在info中被指定为long

LANGUAGE lang,sub-lang    资源所使用的语言由Lang和sub_lang指定,被用于国际性菜单

VERSION ver                     在ver中指定应用程序定义的版本号

大多数应用程序不需要使用任何选项,而只用简单的使用缺省设置。

用户可使用两种语句来定义菜单,MENUITEM和POPUP。MENUITEM指定最终的选取结果,POPUP指定弹出式子菜单,他内部还可以包含其他的MENUITEM或者POPUP语句。其表现形式为:

MENUITEM  "菜单名", MenuID  [,options]

POPUP  "菜单名" [,Options]

MenuID是与菜单项相联系的唯一整型值,该值在用来在窗口过程中标记用户到底会触发那个菜单的过程。这些整型值通常在头文件中定义为宏,该头文件同时包含在用户的应用程序代码和资源文件rc中。比如

#define  IDM_NEW  102

#define  IDM_OPEN  103

这两个,我们可以写上这两个,然后定义为一个头文件MyMenus.h,之后在定义菜单资源的时候,直接引入

#include "MyMenus.h"

MyMenu MENU

{

   MENUITEM  "新建",  IDM_NEW

   MENUITEM  "打开",  IDM_OPEN

}

不过,我们在dElphi中,不是使用头文件的,所以,我们可以直接将MyMenus.h中的宏定义内容复制到.rc中

#define  IDM_NEW  102

#define  IDM_OPEN  103

MyMenu MENU

{

   MENUITEM  "新建",  IDM_NEW

   MENUITEM  "打开",  IDM_OPEN

}

这个与#include那个效果一样,之后,我们将IDM_NEW 这样的宏定义在Delphi中声明为

const

  IDM_NEW = 102;

  IDM_OPEN = 103;

这样这个菜单的定义就完成了,之后,用Brcc32编译成一个比如MenuTest.res的资源文件

在工程中引入

{$R MenuTest.res}

这样就可以使用这个资源菜单了。

然后我们在看看MenuItem的Options选项信息

CHECKED               复选标记,最顶层菜单不能使用

CRAYED                 灰色,既Enabled := False;

Help                      与帮助的选取有关系,只适用于MenuItem

MenuBARBREAK     对于菜单栏,将引起条目位于一条新线上,对于弹出式菜单,将引起条目位于不同的栏中。此时

                            条目通过一条竖栏与菜单分离

MENUBREAK          与MenuBARBREAK差不多,只是不使用分离栏

 SEPARATOR          创建菜单与菜单之间的分割线,只用于MENUITEM.

 

那么现在就来试验创建一个Delphi2007的部分菜单

 

复制代码

  
  
#define IDM_Package 102
#define IDM_Unit 103
#define IDM_Form 104
#define IDM_VclApp 105
#define IDM_Other 106
#define IDM_Custom 107
#define IDM_OPEN 108
#define IDM_OPEN1 109
#define IDM_Save 110
#define IDM_SaveAs 111
#define IDM_Exit 112
#define IDM_Copy 113
#define IDM_Paste 114
#define IDM_Cut 115
TestMenu_D2007 MENU
{
POPUP
" File "
{
POPUP
" New "
{
MENUITEM
" Package-Delphi for Win32 " ,IDM_Package
MENUITEM
" Unit-Delphi for Win32 " ,IDM_Unit
MENUITEM
" Form-Delphi for Win32 " ,IDM_Form
MENUITEM
" Vcl Application-Delphi for Win32 " ,IDM_VclApp
MENUITEM SEPARATOR
MENUITEM
" Other " ,IDM_Other
MENUITEM SEPARATOR
MENUITEM
" Customize " ,IDM_Custom
}
MENUITEM
" Open " ,IDM_OPEN
MENUITEM
" Open Project " ,IDM_OPEN1
MENUITEM SEPARATOR
MENUITEM
" Save " ,IDM_Save
MENUITEM
" Save as " ,IDM_SaveAs
MENUITEM SEPARATOR
MENUITEM
" Exit " ,IDM_Exit
}
POPUP
" Edit "
{
MENUITEM
" Copy " ,IDM_Copy
MENUITEM
" Paste " ,IDM_Paste
MENUITEM
" Cut " ,IDM_Cut
}
}
复制代码


保存为D2007Menu.rc,然后使用Delphi的brcc32编译一下成为D2007Menu.res,之后,看我在程序中使用这个菜单资源,然后看看效果

编译之后就生成了那个菜单,但是,这个菜单,目前没有添加任何功能,要使菜单响应应用程序的点击,我们需要在窗口过程中处理WM_COMMAND消息,用户每进行一次菜单选择,都会向程序窗口发送一条WM_COMMAND消息,接收到这个消息之后,LOWORD(wParam)中的值就是我们在定义菜单资源时定义的菜单ID比如IDM_OPen这样的,所以我们在窗口过成忠添加一个如下的处理:

代码
这样这个窗口过程就响应了,但是如果仅仅添加这个的话,程序是会报告错误的,所以,我们需要将在资源定义中的宏都作为常量添加进来:

复制代码

  
  
const
IDM_Package
= 102 ;
IDM_Unit
= 103 ;
IDM_Form
= 104 ;
IDM_VclApp
= 105 ;
IDM_Other
= 106 ;
IDM_Custom
= 107 ;
IDM_OPEN
= 108 ;
IDM_OPEN1
= 109 ;
IDM_Save
= 110 ;
IDM_SaveAs
= 111 ;
IDM_Exit
= 112 ;
IDM_Copy
= 113 ;
IDM_Paste
= 114 ;
IDM_Cut
= 115 ;
复制代码

也可以将这个作为一个inc文件,然后再Delphi中以{$I }的方式引入。

如果不这样做的话,那么在那个WM_COMMAND的处理过程中就是用数值吧,而不用这些宏名代替了。

到这里一个简单的菜单程序就完成了。以后再讲解一下其他的菜单资源,各位也可以在网上查找一下相关的资料先参考



本文转自 不得闲 博客园博客,原文链接:http://www.cnblogs.com/DxSoft/archive/2010/06/21/1762139.html   ,如需转载请自行联系原作者

相关文章
|
5月前
|
API 开发工具 C#
神策SDK不支持Windows客户端全埋点,怎么实现用户统计分析?
本文将介绍,ClkLog针对神策不支持全埋点的客户端实现用户访问基础统计分析 1。
神策SDK不支持Windows客户端全埋点,怎么实现用户统计分析?
|
6月前
|
Windows
windows 11 恢复右键传统菜单
windows 11 恢复右键传统菜单
237 27
|
6月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
6月前
|
Windows
[原创]用MASM32编程获取windows类型
[原创]用MASM32编程获取windows类型
|
6月前
|
JavaScript 前端开发 API
MASM32编程通过WMI获取Windows计划任务
MASM32编程通过WMI获取Windows计划任务
|
5月前
|
API 开发工具 UED
在 UWP 中使用 Windows App SDK
【10月更文挑战第17天】在UWP中使用Windows App SDK可增强应用功能和性能。首先了解SDK特性,接着安装Visual Studio 2022及以上版本,并从微软官网下载安装SDK。配置项目时,确保目标版本支持SDK,添加SDK引用后即可使用新API提升应用体验。开发过程中应充分利用调试工具进行测试,确保应用的兼容性和稳定性。
|
6月前
|
API Windows
MASM32编程获取Windows当前桌面主题名
MASM32编程获取Windows当前桌面主题名
|
7月前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
605 0
|
15天前
|
安全 Unix 虚拟化
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
42 11
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
|
15天前
|
Unix 虚拟化 Windows
Windows Server 2025 中文版、英文版下载 (2025 年 2 月更新)
Windows Server 2025 中文版、英文版下载 (2025 年 2 月更新)
42 7
Windows Server 2025 中文版、英文版下载 (2025 年 2 月更新)

热门文章

最新文章

  • 1
    【Azure Storage Account】利用App Service作为反向代理, 并使用.NET Storage Account SDK实现上传/下载操作
    19
  • 2
    【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
    56
  • 3
    CompreFace:Star6.1k,Github上火爆的轻量化且强大的人脸识别库,api,sdk都支持
    49
  • 4
    【Azure Developer】编写Python SDK代码实现从China Azure中VM Disk中创建磁盘快照Snapshot
    28
  • 5
    【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
    39
  • 6
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    170
  • 7
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    174
  • 8
    【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
    80
  • 9
    AutoTalk第十三期-应知必会的自动化工具-阿里云SDK支持策略(一)
    60
  • 10
    自动化AutoTalk第十期:应知必会的自动化工具-阿里云SDK
    61