国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

在系統(tǒng)菜單里添加菜單項(xiàng)和相應(yīng)事件

2019-11-17 05:13:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  ---- 有時(shí)候我們經(jīng)常在程序中實(shí)現(xiàn)菜單項(xiàng)的重畫,已有好多文章已經(jīng)加以介紹,在此不再贅述。但是有時(shí)我們需要加新菜單項(xiàng)到系統(tǒng)菜單中,并希望給其增加相應(yīng)的事件。筆者通過(guò)運(yùn)用WindowAPI的AppendMenu函數(shù)和C++BUIDER的相關(guān)方法、屬性,實(shí)現(xiàn)了往系統(tǒng)菜單中增加菜單項(xiàng)和事件。
---- 下面介紹具體的實(shí)現(xiàn)方法,讀者按照以下步驟操作,就可以實(shí)現(xiàn)在系統(tǒng)菜單中增加菜單項(xiàng)和事件:
---- 1 首先創(chuàng)建一個(gè)新的空工程文件,存盤為PRoject1.cpp和unit1.cpp。
---- 2 使用菜單Tools中的Image Editor,打開(kāi)資源文件project1,新建一個(gè)位圖并取名為HELP。
---- 3 在源文件頭部定義如下常量作為菜單的標(biāo)示:
      #define IDM_HELP1      1
      #define IDM_HELP2      2
      #define IDM_REMOVE     3
      #define IDM_SEPARATOR1 4
      #define IDM_SEPARATOR2 5

---- 4 為Form1創(chuàng)建OnCreate事件,添加代碼實(shí)現(xiàn)在系統(tǒng)菜單里增加菜單項(xiàng):
首先定義菜單句柄和位圖句柄:
    HMENU hMenu;
    HBITMAP  hBitmapHelp;
    然后獲得系統(tǒng)菜單的句柄:
    hMenu = GetSystemMenu (this->Handle, FALSE) ;
    往系統(tǒng)菜單中增加自己的菜單項(xiàng):
    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,"取消菜單") ;
    往菜單中添加位圖,首先裝載位圖資源,獲得其句柄,然后將它添加到系統(tǒng)菜單中:
    hBitmapHelp =LoadBitmap ((void*)HInstance, "HELP");
    AppendMenu (hMenu, MF_BITMAP,IDM_HELP2,  (char*)hBitmapHelp);

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

---- 6 在構(gòu)造函數(shù)中加入WindowProc=MyWndProc代碼,以重載WndProc方法,完成用戶自己所要求的操作。
---- 7 在源文件里面添加MyWndProc的實(shí)現(xiàn):
---- 首先獲得系統(tǒng)菜單的句柄,為動(dòng)態(tài)修改菜單項(xiàng)做預(yù)備。
HMENU hMenu;
hMenu = GetSystemMenu (this->Handle, FALSE);

---- 判定當(dāng)前消息是否為系統(tǒng)命令消息,若是,則重新實(shí)現(xiàn)它,再判定消息的WparamLo參數(shù)是否為在OnCreate事件中添加的菜單項(xiàng),若是,進(jìn)行相應(yīng)事件處理,如不是按系統(tǒng)默認(rèn)執(zhí)行;若是其他消息則執(zhí)行系統(tǒng)默認(rèn)的代碼。
  if (Message.Msg == WM_SYSCOMMAND)
  {
     switch(Message.WParamLo)
     {
        case IDM_HELP1:
            ShowMessage("這是一個(gè)測(cè)試!");
            break;
        case IDM_HELP2:
            ShowMessage("這是一個(gè)測(cè)試!");
            break;
        case IDM_REMOVE:
        {
         //刪除添加到系統(tǒng)菜單的菜單項(xiàng)
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);


---- 接下來(lái)調(diào)試運(yùn)行程序,本程序在C++builder 4.0下調(diào)試通過(guò)。
---- 下面介紹一下實(shí)現(xiàn)的技術(shù)內(nèi)幕。往系統(tǒng)菜單中增加菜單項(xiàng)的要害就是獲得系統(tǒng)菜單的句柄,在程序中使用Window API函數(shù)GetSysMenu,然后用AppendMenu增加菜單。函數(shù)的相關(guān)用法可查閱C++Builder聯(lián)機(jī)幫助。給菜單項(xiàng)添加相應(yīng)的事件,我們用到了TForm類的WindowProc屬性,把用戶自定義的方法代替系統(tǒng)自己的 WndProc方法。WindowProc屬性指向一個(gè)被送往窗體的消息的處理過(guò)程,是我們能夠在程序中重載WndProc方法。WndProc方法是窗體中第一個(gè)接收到消息的方法,調(diào)用父類的方法可完成窗體的激活、定位等與Windows同步的消息處理。重載該方法可改變窗體如何相應(yīng)Windows的消息。本文程序就是運(yùn)用兩者的配合實(shí)現(xiàn)了給系統(tǒng)菜單添加相應(yīng)事件的。
---- 附程序清單:
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("這是一個(gè)測(cè)試!");
            break;
        case IDM_HELP2:
            ShowMessage("這是一個(gè)測(cè)試!");
            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);
}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东兴市| 永州市| 拉萨市| 启东市| 疏附县| 宽甸| 云阳县| 富顺县| 泰州市| 拉萨市| 阜阳市| 辛集市| 高邮市| 余庆县| 满城县| 临泽县| 富川| 民丰县| 保亭| 南木林县| 阳高县| 岫岩| 临泉县| 安宁市| 安仁县| 云和县| 塘沽区| 东山县| 长岭县| 广宁县| 肃南| 乌鲁木齐县| 浮山县| 安丘市| 库车县| 城固县| 高安市| 泽库县| 西丰县| 罗田县| 绿春县|