动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息



本月文章推荐
.改变DBGrid的颜色.
.将Wav格式压缩成Mp3.
.个简单菜单程序.
.使用C++ Buider制作自绘画列.
.用C++访问SQL Server 2000的实例.
.高质量C++/C编程指南 --&nb.
.C语言五子棋算法.
.The File System(文件系统).
.用Win32 API枚举应用程序窗.
.图片模糊、锐化、雕刻.
.C语言入门之文件(2).
..
.进制的转换.
.corba核心规范.
.C++中类的多态与虚函数的使用.
.Perform()与SendMessage()的不同.
.利用C语言实现计算机图像处理的方.
.datagridcolumnstyle重写,实现插.
.C++编写的ATM自动取款机模拟程序.
.实例讲解.

定制任务栏上的系统菜单

发表日期:2008-3-8 |


  通常,当我们在特定的场合或是在多应用的环境运行自己或其他的应用程序时, 会在多窗口之间进行频繁的切换,以实施实时的交互得到所期望的结果,对于这样的“笨”办法,我们会不厌其烦地进行好多次,甚至是无数次。
好在Win 9x 在任务栏上显示了我们所运行或期望的程序,并配备了相应的右键系统弹出菜单,使我们在使用时方便多了。问题是那些都是缺省的系统菜单(命令),对于我们来说没太大的帮助,下面我所介绍的就是利用Win9x 为我们设定的任务栏系统菜单来达到快速、简捷的获取信息(执行命令)的目的。提到系统菜单,就让我们联想到底层的 WIN32系统调用:AppendMenu、Inert- Menu、ModifyMenu。仅此三个函数,就足可以让我们对缺省的系统菜单进行定制,应用自如了。为简单起见,本文就 AppendMenu 进行一些介绍,其余的请朋友们参WIN32API 帮助文件。以下是: AppendMenu 函数原型: BOOL AppendMenu(
HMENU hMenu, // 要定制的菜单句柄
UINT uFlags, // 怎样定制菜单项
UINT uIDNewItem, // 要定制的菜单项标识或子菜单句柄
LPCTSTR lpNewItem // 要定制的菜单项(字串)
);
在 AppendMenu 函数里,lpNewItem 和 uIDNewItem 参数依靠 uFlags 的不同
标志而有所变化,让我们来看一看 uFlags 到底有那一些定义值:

MF_BITMAP 指明该菜单项是一位图,在 lpNewItem 参数代表位图句柄
MF_CHECKED 在菜单项的前面放上一个“选中”标记
MF_DISABLED 屏蔽该菜单项,但不象平常那样变成灰色
MF_ENABLED 与 MF_DISABLED 相反
MF_GRAYED 除了有 MF_DISABLED 的作用以外,还把该菜单项变灰
MF_MENUBREAK 把该菜单与现有菜单并排放在一起
MF_MENUBARBREAK 与 MF_MENUBREAK 相同,除了在中间放一条竖线外
MF_OWNERDRAW 表明该菜单项为自绘菜单项,还必须处理一切的显示、更新问题
MF_POPUP 该菜单项为一子菜单,uIDNewItem 参数代表其句柄
MF_SEPARATOR 与上一菜单项画上一分割线,系统将忽略 lpNewItem 和
uIDNewItem 参数
MF_STRING 该菜单项是一文本字串,lpNewItem 是其内容
MF_UNCHECKED 取消该菜单项前面的“选中”标记
  我们看到,除了MF_POPUP,MF_BITMAP,MF_OWNERDRAW以外,MF_STRING是最常用的菜单? 义方法,uIDNewItem在这里是命令消息的wParam参数。朋友们还记得获取普通菜单的句柄用GetMenu,那么获取系统菜单的句柄就应该用GetSyst-emMenu。这时有一个问题:程序怎么知道该获取的系统菜单是窗口上的系统菜单,还是任务栏上的系统菜单呢?这就依靠传递给GetSystemMenu的是哪一个参数。因为我们当前考虑的是任栏,因此这个参数就必须是Application.Handle。假如这时候就着手编制一个Project检验一下,朋友们就会发现...“我”定义的菜单怎么没有反应!原来该菜单项根本没有在Application里处理过。显然,我们还得过滤一下传到Application的WM_SYSCOMMAND消息。为了加深了解,我们首先追加一个简单的任务栏系统菜单: Unit AddMenuDemo;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,Menus;
type
TDemoForm = class(TForm)
procedure FormCreate(Sender: TObject);
...
private
{ Private declarations }
// 我的消息过滤器
procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
...
public
{ Public declarations }
...
end;

var
DemoForm1: TDemoForm;
implementation
const
My_SimpleCMD1 = WM_USER + 1; // 定义三个用户消息,用来处理菜单项被点击
// 时相应的动作
My_SimpleCMD2 = WM_USER + 2;
My_SimpleCMD3 = WM_USER + 3;
...
procedure TDemoForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnAppMessage; //定义自己的消息处理过程
//定义了提交、反馈、处理三个菜单项
AppendMenu(GetSystemMenu(Application.Handle, FALSE),MF_STRING,
My_SimpleCMD1,提交);
AppendMenu(GetSystemMenu(Application.Handle, FALSE),MF_STRING,
My_SimpleCMD2,反馈);
AppendMenu(GetSystemMenu(Application.Handle, FALSE),MF_SEPARATOR,
0, ); // 定义一分割线
AppendMenu(GetSystemMenu(Application.Handle, FALSE),MF_STRING,
My_SimpleCMD3,处理);

end;

procedure TDemoForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
// 定制自己的消息处理过程
if (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = My_SimpleCMD1) then
begin
ShowMessage(正在提交...);
Handled := True;
...
end;
if (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = My_SimpleCMD2) then
begin
ShowMessage(正在反馈...);
Handled := True;
...
end;
if (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = My_SimpleCMD3) then
begin
ShowMessage(正在处理...);
Handled := True;
...
end;
end;
....
   当我们处理的事务比较多并且可分组,以上的做法就比较烦琐,这时就应该定义成多个 MF_POPUP ,其各个子菜单除了uIDNewItem 传递这个子菜单的句柄外,另外独特之处在于消息过滤器的 Msg.wParam 是各个菜单项的 Command。这个Command是在构建 TPopupMenu 时就定义了。无论是否是 MenuItem 或 PopupMenu,其Command的值都是顺序递增的。以下是一范例:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Menus;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem; // Caption := 范例一;
N2: TMenuItem; // Caption := 范例二;
N3: TMenuItem; // Caption := 范例三;
procedure FormCreate(Sender: TObject);
...
private
{ Private declarations }
// 我的消息过滤器
procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
...
public
{ Public declarations }
...
end;
...

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnAppMessage; //定义自己的消息处理过程
// 定义一分割线
AppendMenu(GetSystemMenu(Application.Handle, FALSE), MF_SEPARATOR, 0, );
// 定义提交子菜单
AppendMenu(GetSystemMenu(Application.Handle, FALSE), MF_POPUP,
PopupMenu1.Handle,提交);
end;

procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
// 定制自己的消息处理过程
if (Msg.message = WM_SYSCOMMAND) AND (Msg.wParam $#@60; WM_USER) then
begin
Case Msg.wParam of
// N1.Command = 1
1:ShowMessage(范例一 Command:+ IntToStr(N1.Command));
// N1.Command = 2
2:ShowMessage(范例二 Command:+ IntToStr(N2.Command));
// N1.Command = 3
3:ShowMessage(范例三 Command:+ IntToStr(N3.Command));
end;
Handled := True;
end;
...
end;
...
  可以看出,MF_STRING 与 MF_POPUP 在消息处理机制上是稍微有点不同的,另外,假如要在菜单前面加上图标的话,这在Delphi 4.x、Delphi 5.x 版本下是不成问题,假如是在 Delphi 3.x 下的话,只要定义成自绘 MenuItem即可,不过稍许复杂了一点。在应用过程中,需要提醒的是,这几组定义不能一起使用: A. MF_DISABLED, MF_ENABLED, 和 MF_GRAYED
B. MF_BITMAP, MF_STRING, 和 MF_OWNERDRAW
C. MF_MENUBARBREAK 和 MF_MENUBREAK
D. MF_CHECKED 和 MF_UNCHECKED
上一篇:C++/VC++编程的疑难问题及解答 人气:245
下一篇:Delphi开发基于DCOM的聊天室 人气:297
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-25 WikyBlog v1.7.0.1 多国语言版
2008-7-25 乐彼网上开店系统(56770 Eshop)
2008-7-25 赛特网站管理系统sitecms v3.6.0
2008-7-25 Modoer多功能点评系统 v1.0.1 Bu
2008-7-25 Shangducms Teamsuit! v1.1.0 开
2008-7-25 幻影动漫网视频系统(Ppdong) v1.
2008-7-25 acteecompany企业网站建设系统 v
2008-7-25 恒浪整合管理系统 ims v4.1 ACCE
2008-7-25 艺术图库系统 v1.0 beta
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号