zoukankan      html  css  js  c++  java
  • Windows 编程[17] 更换菜单: LoadMenu、DestroyMenu、SetMenu

    本例效果图:



    本例在资源文件中备有两组菜单, 程序实现运行时切换.

    本例使用的资源文件(TestRes.rc):
    MyMenu1 MENUEX
    BEGIN
      MENUITEM "Open"    ,101
      MENUITEM "Edit"    ,102
      MENUITEM "Help"    ,103
      MENUITEM "Chinese" ,104 ,MFT_RIGHTJUSTIFY
    END
    
    MyMenu2 MENUEX
    BEGIN
      MENUITEM "打开"    ,201
      MENUITEM "编辑"    ,202
      MENUITEM "帮助"    ,203
      MENUITEM "English" ,204 ,MFT_RIGHTJUSTIFY
    END
    
    本例代码文件:
    program Project1;
    
    {$R 'TestRes.res' 'TestRes.rc'}
    
    uses
      Windows, Messages;
    
    {收到 WM_COMMAND 消息时需要做的工作}
    procedure OnCommand(h: HWND; wParam: Integer);
    var
      hm : HMENU;
    begin
      case wParam of
        104,204: begin   {104 和 204 是在资源文件中指定的菜单标识}
          if LoWord(wParam) = 104 then
            hm := LoadMenu(HInstance, 'MyMenu2')
          else
            hm := LoadMenu(HInstance, 'MyMenu1');
          DestroyMenu(GetMenu(h));
          SetMenu(h, hm);
          DrawMenuBar(h);
        end;
      end;
    end;
    
    function WndProc(wnd: HWND; msg: UINT; wParam: Integer; lParam: Integer): Integer; stdcall;
    begin
      Result := 0;
      case msg of
        WM_COMMAND : OnCommand(wnd, 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.
    
  • 相关阅读:
    module 和 component 的区别
    API、SDK、DLL有什么用?
    app基本控件
    PaaS是什么?
    js回调函数(callback)(转载)
    多语言 SEO
    axure rp 8.0
    整天看用户埋点数据,知道数据是咋来的吗?
    发现恶意ip大量访问 可使用命令进行封禁
    阿里云服务器迁移更改IP,导致网站挂掉
  • 原文地址:https://www.cnblogs.com/del/p/1166385.html
Copyright © 2011-2022 走看看