登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: [win32/windows/sdk/菜单]sdk 创建菜单     [回主站]     [分站链接]
标题
[win32/windows/sdk/菜单]sdk 创建菜单
clq
浏览(1) + 2009-10-23 16:53:23 发表 编辑

关键字:

[win32/windows/sdk/菜单]sdk 创建菜单

--------------------------------------------------
http://blog.csdn.net/csenior/archive/2005/11/13/528420.aspx

SDK第二天—菜单



接着上一天的内容,添加一个菜单,并加入各项,用记事本打开resource.rc,可以找到如下内容

IDR_MENU1 MENU DISCARDABLE //这里定义菜单名

BEGIN

MENUITEM "Exit", IDM_EXIT //添加菜单项EXIT

POPUP "Edit" //添加弹出菜单

BEGIN

MENUITEM "Copy(&C)\tCtrl+C", IDM_COPY

MENUITEM "Paste", IDM_PASTE

MENUITEM SEPARATOR

MENUITEM "SeleceAll", IDM_SELECTALL

END

MENUITEM "About", IDM_ABOUT

END



同时在resource.h中可以找到IDM_EXIT等的定义

#define IDM_EXIT 40001

#define IDM_COPY 40002

#define IDM_PASTE 40003

#define IDM_SELECTALL 40004

#define IDM_ABOUT 40005

#define IDM_ALIGNLEFT 40006

#define IDM_ALIGNRIGHT 40007

这样就把菜单资源和我们的主程序关联起来了。



接着就要把菜单在窗口中显示出来,我们可以在初始化窗口时指定菜单

wndclass.lpszMenuName=(LPCSTR)IDR_MENU1;

这样编译,运行就可以看到菜单出现在主窗口上部了



菜单项的消息响应:

菜单消息归类于WM_COMMAND,而对于特定的菜单项,有相应的消息值跟他对应,所以只要对WM_COMMAND消息进行进一步的分流,就可以添加各个菜单的消息响应。具体代码如下:

case WM_COMMAND:

wparam=LOWORD(wParam);

switch(wparam)

{

case IDM_EXIT:

PostQuitMessage(0);

return 0;

case IDM_COPY:

MessageBox(hwnd,"Copy Content","Menu",MB_OK);

return 0;

case IDM_PASTE:

MessageBox(hwnd,"Paste Content","Menu",MB_OK);

return 0;

case IDM_SELECTALL:

MessageBox(hwnd,"Select All Content","Menu",MB_OK);

return 0;

case IDM_ABOUT:

MessageBox(hwnd,"About: Designed by csenior","Menu",MB_OK);

return 0;



}

Break;



另外还有一种创建菜单的方式:利用CreateMenu,CreatePopupMenu,GetMenu,InsertMenu,AppendMenu函数,我们试着在WM_CREATE消息中添加如下代码:

case WM_CREATE:

HMENU hMainMenu;

HMENU hAddMenu;

hMainMenu=GetMenu(hwnd);

hAddMenu=CreatePopupMenu();

InsertMenu(hMainMenu,2,MF_BYPOSITION | MF_STRING | MF_POPUP,(UINT)hAddMenu,"格式");

AppendMenu(hAddMenu,MF_STRING,IDM_ALIGNLEFT,"Left Align");

AppendMenu(hAddMenu,MF_STRING,IDM_ALIGNRIGHT,"Right Align");

编译运行,可以看到多了个菜单条。

这里GetMenu(hwnd)获得hwnd窗口的菜单。然后通过InsertMenu把之前创建的hAddMenu连接到hMainMenu上去。最后添加各子菜单项



之前在CreateWindow创建窗口时,倒数第三个参数就是HMENU结构,试着在这里给他赋一个值:

HMENU hMenu,hCMenu1,hCMenu2,hCMenu3;

hMenu=CreateMenu();

hCMenu1=CreatePopupMenu();

hCMenu2=CreatePopupMenu();

hCMenu3=CreatePopupMenu();

InsertMenu(hMenu,0,MF_BYPOSITION | MF_STRING | MF_POPUP,(UINT)hCMenu1,"File");

InsertMenu(hMenu,1,MF_BYPOSITION | MF_STRING | MF_POPUP,(UINT)hCMenu2,"View");

InsertMenu(hMenu,2,MF_BYPOSITION | MF_STRING | MF_POPUP,(UINT)hCMenu3,"Edit");

AppendMenu(hMenu,MF_STRING,(UINT)41001,"About");

AppendMenu(hCMenu1,MF_STRING,(UINT)41002,"Open");

AppendMenu(hCMenu1,MF_STRING,(UINT)41003,"Close");

AppendMenu(hCMenu2,MF_STRING,(UINT)41004,"Big");

AppendMenu(hCMenu2,MF_STRING,(UINT)41005,"Small");

AppendMenu(hCMenu3,MF_STRING,(UINT)41006,"Copy");

AppendMenu(hCMenu3,MF_STRING,(UINT)41007,"Paste");

hWnd=CreateWindow("HelloWin",wintitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,hMenu,hInstance,NULL);

运行,我们可以看到菜单变了,因此在此处也可以添加修改程序的菜单,但是这里不能用GetMenu,因为hWnd窗口句柄还没被实例化





关于菜单命令的消息参数说明下:

基本参数说明:

wNotifyCode=HIWORD(wParam)1

WID=LOWORD(wParam);

hWndCtl=(HWND)1Param”;

当WM_CoMMAND命令是由选择菜单命令产生时WNotifycode参数为0,wID参数

为菜单项的标识导,hwndctl参数为NULL。

当WM_COMMAND命今是来自于快捷键时WNotifycode参数为1 WID是快捷键标

识号,hWndCtl参数为NULL。

如果是因为控件向父窗口发出通知消息面产生WM—COMMAND消息时。

WNotifycode参数为通知代码,wID为控件标识号,hwndctl参数为控件句柄。



通过EnabaleMenuItem,EnableMenuRadioItem,可以设置菜单项的状态为有效,无效,灰色三种,同时可以调用CheckMenuItem,CheckMenuRadioItem来改变菜单项的选种状态具体如下代码:

EnableMenuItem(hMainMenu,IDM_EXIT,MF_BYCOMMAND | MF_GRAYED);

EnableMenuItem(hAddMenu,1,MF_BYPOSITION | MF_GRAYED);

CheckMenuItem(hMainMenu,IDM_COPY,MF_BYCOMMAND |MF_CHECKED); CheckMenuRadioItem(hAddMenu,IDM_ALIGNLEFT,IDM_ALIGNRIGHT,IDM_ALIGNLEFT,MF_BYCOMMAND);


clq
2009-10-23 16:53:54 发表 编辑

//创建一个窗体
//void Create(HWND parent, Window * pForm)
void Create(HWND parent)
{
//pCreateForm = pForm;

HMENU hMainMenu;

HMENU hAddMenu;

hMainMenu = ::CreateMenu();//::GetMenu(parent);

hAddMenu = ::CreatePopupMenu();

::InsertMenu(hMainMenu,2,MF_BYPOSITION | MF_STRING | MF_POPUP,(UINT)hAddMenu,"格式");

//IDM_ALIGNLEFT 是菜单的 id
//::AppendMenu(hAddMenu,MF_STRING,IDM_ALIGNLEFT,"Left Align");
//::AppendMenu(hAddMenu,MF_STRING,IDM_ALIGNRIGHT,"Right Align");
::AppendMenu(hAddMenu,MF_STRING, 101, "Left Align");

::SetMenu(parent, hMainMenu);


总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1