zoukankan      html  css  js  c++  java
  • Windows 编程[15] 菜单消息: WM_COMMAND

    本例效果图:



    点击任一个菜单项, 都会发出一个 WM_COMMAND 消息, 消息的 wParam 参数的低两位就是标识菜单项的那个整数!

    本例使用的资源文件(TestRes.rc):
    #define IDM_New   101
    #define IDM_Open  102
    #define IDM_Save  103
    #define IDM_Exit  104
    #define IDM_Cut   201
    #define IDM_Copy  202
    #define IDM_Paste 203
    #define IDM_About 301
    
    MyMenu1 MENUEX DISCARDABLE
    BEGIN
      POPUP "&File"        ,65535
      BEGIN
        MENUITEM "&New"    ,IDM_New
        MENUITEM "&Open"   ,IDM_Open
        MENUITEM "&Save"   ,IDM_Save
        MENUITEM SEPARATOR
        MENUITEM "E&xit"   ,IDM_Exit
      END
      POPUP "&Edit"        ,65535
      BEGIN
        MENUITEM "Cu&t"    ,IDM_Cut
        MENUITEM "&Copy"   ,IDM_Copy
        MENUITEM "&Paste"  ,IDM_Paste
      END
      POPUP "&Help"        ,65535
      BEGIN
        MENUITEM "&About"  ,IDM_About
      END
    END
    
    本例代码文件:
    program Project1;
    
    {$R 'TestRes.res' 'TestRes.rc'}
    
    uses
      Windows, Messages;
    
    {供 WM_COMMAND 消息调用的自定义过程}
    procedure OnCommand(wParam: Integer);
    begin
      case LoWord(wParam) of
        101: MessageBox(0, 'is New',  '', 0);
        102: MessageBox(0, 'is Open', '', 0);
        103: MessageBox(0, 'is Save', '', 0);
        104: MessageBox(0, 'is Exit', '', 0);
      end;
    end;
    
    function WndProc(wnd: HWND; msg: UINT; wParam,lParam: Integer): Integer; stdcall;
    begin
      Result := 0;
      case msg of
        WM_COMMAND : OnCommand(wParam);  {收到 WM_COMMAND 消息后调用 OnCommand 过程}
        WM_DESTROY : PostQuitMessage(0);
      else
        Result := DefWindowProc(wnd, msg, wParam, lParam);
      end;
    end;
    
    function RegMyWndClass: Boolean;
    var
      cls: TWndClass;
    begin
      cls.style         := CS_HREDRAW or CS_VREDRAW;
      cls.lpfnWndProc   := @WndProc;
      cls.cbClsExtra    := 0;
      cls.cbWndExtra    := 0;
      cls.hInstance     := HInstance;
      cls.hIcon         := 0;
      cls.hCursor       := LoadCursor(0, IDC_ARROW);
      cls.hbrBackground := HBRUSH(COLOR_WINDOW + 1);
      cls.lpszMenuName  := 'MyMenu1';
      cls.lpszClassName := 'MyWnd';
      Result := RegisterClass(cls) <> 0;
    end;
    
    {程序入口}
    const
      tit = 'New Form';
      ws = WS_OVERLAPPEDWINDOW;
      x = 100; y = 100; w = 300; h = 180;
    var
      hWnd: THandle;
      Msg : TMsg;
    begin
      RegMyWndClass;
      hWnd := CreateWindow('MyWnd', tit, ws, x, y, w, h, 0, 0, HInstance, nil);
      ShowWindow(hWnd, SW_SHOWNORMAL);
      UpdateWindow(hWnd);
    
      while(GetMessage(Msg, 0, 0, 0)) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end.
    
  • 相关阅读:
    c# – 通过反射获取命名空间中的所有类型
    宝塔任务计划通道设置
    DRF项目框架基础设计
    Redis-数据特征和应用场景
    Redis-持久化详解
    Dockerfile文件详解
    ntp同步阿里服务器时间(centos)
    NUC8/11更新EC Firmware
    ambarella H2 kernel调试记录
    MobaXterm 执行make menuconfig不能删除字符
  • 原文地址:https://www.cnblogs.com/del/p/1165460.html
Copyright © 2011-2022 走看看