动态网站制作指南 [  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++教程 ]的信息



本月文章推荐
.C/C++:如何在程序中加载JPG图片?.
.什么是迭代跟递归算法?二者有什.
.字母的几种排法.
.BCB及Delphi工程文件扩展名一览.
.C++箴言:理解隐式接口和编译期多.
.switch语句的“不准遍历”.
.Windows Sockets:背景知识.
.栈的表示与实现及栈的应用.
.用Delphi程序获取拨号连接的动态.
.错误解析.
.C++编程易范的错误.
.在16色模式下显示256色及全彩色.
.理解C++面向对象程序设计中的抽象.
.实战JBOSS――教你写第一个EJB.
..
.不同的CPU下最佳编译参数.
.Asp组件高级入门与精通系列之二.
.C语言编程常见问题解答之标准库函.
.C / C++的和Java的异常机制.
.用C++制作有HTML风格的动态按钮.

在系统菜单里添加菜单项和相应事件

发表日期:2008-3-8 |



  ---- 有时候我们经常在程序中实现菜单项的重画,已有好多文章已经加以介绍,在此不再赘述。但是有时我们需要加新菜单项到系统菜单中,并希望给其增加相应的事件。笔者通过运用WindowAPI的AppendMenu函数和C++BUIDER的相关方法、属性,实现了往系统菜单中增加菜单项和事件。
---- 下面介绍具体的实现方法,读者按照以下步骤操作,就可以实现在系统菜单中增加菜单项和事件:
---- 1 首先创建一个新的空工程文件,存盘为project1.cpp和unit1.cpp。
---- 2 使用菜单Tools中的Image Editor,打开资源文件project1,新建一个位图并取名为HELP。
---- 3 在源文件头部定义如下常量作为菜单的标示:
      #define IDM_HELP1      1
      #define IDM_HELP2      2
      #define IDM_REMOVE     3
      #define IDM_SEPARATOR1 4
      #define IDM_SEPARATOR2 5

---- 4 为Form1创建OnCreate事件,添加代码实现在系统菜单里增加菜单项:
首先定义菜单句柄和位图句柄:
    HMENU hMenu;
    HBITMAP  hBitmapHelp;
    然后获得系统菜单的句柄:
    hMenu = GetSystemMenu (this->Handle, FALSE) ;
    往系统菜单中增加自己的菜单项:
    AppendMenu (hMenu, MF_SEPARATOR,IDM_SEPARATOR1,  NULL) ;
    AppendMenu (hMenu, MF_STRING,IDM_HELP1,"帮助") ;
    AppendMenu (hMenu, MF_SEPARATOR,IDM_SEPARATOR2,  NULL) ;
    AppendMenu (hMenu, MF_STRING,IDM_REMOVE,"取消菜单") ;
    往菜单中添加位图,首先装载位图资源,获得其句柄,然后将它添加到系统菜单中:
    hBitmapHelp =LoadBitmap ((void*)HInstance, "HELP");
    AppendMenu (hMenu, MF_BITMAP,IDM_HELP2,  (char*)hBitmapHelp);

---- 5 在头文件的public下面添加方法MyWndProc的定义:
void __fastcall MyWndProc(Messages::TMessage &Message);

---- 6 在构造函数中加入WindowProc=MyWndProc代码,以重载WndProc方法,完成用户自己所要求的操作。
---- 7 在源文件里面添加MyWndProc的实现:
---- 首先获得系统菜单的句柄,为动态修改菜单项做预备。
HMENU hMenu;
hMenu = GetSystemMenu (this->Handle, FALSE);

---- 判定当前消息是否为系统命令消息,若是,则重新实现它,再判定消息的WparamLo参数是否为在OnCreate事件中添加的菜单项,若是,进行相应事件处理,如不是按系统默认执行;若是其他消息则执行系统默认的代码。
  if (Message.Msg == WM_SYSCOMMAND)
  {
     switch(Message.WParamLo)
     {
        case IDM_HELP1:
            ShowMessage("这是一个测试!");
            break;
        case IDM_HELP2:
            ShowMessage("这是一个测试!");
            break;
        case IDM_REMOVE:
        {
         //删除添加到系统菜单的菜单项
DeleteMenu(hMenu,IDM_HELP1,MF_BYCOMMAND);
DeleteMenu(hMenu,IDM_HELP2,MF_BYCOMMAND);
DeleteMenu(hMenu,IDM_REMOVE,MF_BYCOMMAND);
DeleteMenu(hMenu,IDM_SEPARATOR1,MF_BYCOMMAND);
DeleteMenu(hMenu,IDM_SEPARATOR2,MF_BYCOMMAND);
        }
        default:
           WndProc(Message);
   }
}

else
    WndProc(Message);


---- 接下来调试运行程序,本程序在C++builder 4.0下调试通过。
---- 下面介绍一下实现的技术内幕。往系统菜单中增加菜单项的要害就是获得系统菜单的句柄,在程序中使用Window API函数GetSysMenu,然后用AppendMenu增加菜单。函数的相关用法可查阅C++Builder联机帮助。给菜单项添加相应的事件,我们用到了TForm类的WindowProc属性,把用户自定义的方法代替系统自己的 WndProc方法。WindowProc属性指向一个被送往窗体的消息的处理过程,是我们能够在程序中重载WndProc方法。WndProc方法是窗体中第一个接收到消息的方法,调用父类的方法可完成窗体的激活、定位等与Windows同步的消息处理。重载该方法可改变窗体如何相应Windows的消息。本文程序就是运用两者的配合实现了给系统菜单添加相应事件的。
---- 附程序清单:
1 unit1.h
/---------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//--------------------------------------------------------
#include < Classes.hpp >
#include < Controls.hpp >
#include < StdCtrls.hpp >
#include < Forms.hpp >
#include < Db.hpp >
#include < DBGrids.hpp >
#include < DBTables.hpp >
#include < Grids.hpp >
//----------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
        void __fastcall FormCreate(TObject *Sender);
// User declarations

public: // User declarations
         __fastcall TForm1(TComponent* Owner);
         void __fastcall MyWndProc(Messages::TMessage &Message);

protected:

};
//--------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------
#endif
2 unit1.cpp
//---------------------------------------------------------------
#include < vcl.h >
#pragma hdrstop

#include "Unit1.h"
//-----------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define IDM_HELP1   1
#define IDM_HELP2   2
#define IDM_REMOVE  3
#define IDM_SEPARATOR1 4
#define IDM_SEPARATOR2 5
TForm1 *Form1;
//---------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  WindowProc=MyWndProc;
}
//--------------------------------------------------------------


void __fastcall TForm1::FormCreate(TObject *Sender)
{
   HMENU hMenu;
   HBITMAP  hBitmapHelp;
   hMenu = GetSystemMenu (this->Handle, FALSE) ;
   AppendMenu (hMenu, MF_SEPARATOR,IDM_SEPARATOR1,  NULL) ;
   AppendMenu (hMenu, MF_STRING,IDM_HELP1,"帮助") ;
   hBitmapHelp =LoadBitmap ((void*)HInstance, "HELP");
   AppendMenu (hMenu, MF_BITMAP,IDM_HELP2,  (char*)hBitmapHelp);
   AppendMenu (hMenu, MF_SEPARATOR,IDM_SEPARATOR2,  NULL) ;
   AppendMenu (hMenu, MF_STRING,IDM_REMOVE,"取消菜单") ;

}
//---------------------------------------------------------
void __fastcall TForm1::MyWndProc
(Messages::TMessage &Message)
{
  HMENU hMenu;
  hMenu = GetSystemMenu (this->Handle, FALSE);
  if (Message.Msg == WM_SYSCOMMAND)
  {
     switch(Message.WParamLo)
     {
        case IDM_HELP1:
            ShowMessage("这是一个测试!");
            break;
        case IDM_HELP2:
            ShowMessage("这是一个测试!");
            break;
        case IDM_REMOVE:
        {
          DeleteMenu(hMenu,IDM_HELP1,MF_BYCOMMAND);
          DeleteMenu(hMenu,IDM_HELP2,MF_BYCOMMAND);
          DeleteMenu(hMenu,IDM_REMOVE,MF_BYCOMMAND);
          DeleteMenu(hMenu,IDM_SEPARATOR1,MF_BYCOMMAND);
          DeleteMenu(hMenu,IDM_SEPARATOR2,MF_BYCOMMAND);
        }
        default:
           WndProc(Message);
   }
}

else
    WndProc(Message);
}

上一篇:C++ BUILDER 动态建立菜单及菜单事件 人气:243
下一篇:C++箴言:理解 new-handler的行为 人气:240
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
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号