第三篇 菜单、图标与光标的使用

来源:互联网 发布:人工智能股票龙头科大 编辑:程序博客网 时间:2024/05/29 14:47

这篇博文将会简单介绍下菜单、图标与光标在Windows窗口程序中如何使用。

 

一、菜单、图标、光标都是作为资源在资源文件中定义的。

1、菜单的定义方法:

菜单ID  MENU  [DISCARDABLE]

BEGIN

            菜单项定义

END

 

菜单项定义:

定义普通菜单项:

MENUITEM  菜单文字 ,命令ID  [,选项列表]

定义分割线:

MENUITEM  SEPARATOR

定义弹出式菜单:

POPUP  菜单文字  [,选项列表]

BEGIN

           菜单项定义

END

 

2、图标与光标的定义

图标ID  ICON  [DISCARDABLE]   图标文件名

光标ID  CURSOR  [DISCARDABLE]   光标文件名

 

3、注意

所谓的XXID都是用户自定义的一些数值,范围是0~0FFFFH

DISCARDABLE是内存选项,表示在不用时可以自动释放内存

 

4、例子

#include <resource.h>//菜单选项#defineIDM_MAIN0x1000#define IDM_ICOHEAD0x2000#defineIDM_ICOARROW0x2001#defineIDM_CURDINOSAUR0x2002#defineIDM_CURHAND0x2003//图标#defineICON_HEAD0x3000#define ICON_ARROW0x3001//光标#defineCUR_HAND0x4000ICON_ARROWicondiscardable "Arrow.ico"ICON_HEADicondiscardable "Head.ico"CUR_HANDcursordiscardable "Hand.cur"IDM_MAINmenudiscardableBEGINpopup"图标与光标选项(&C)..."BEGINmenuitem"头像图标",IDM_ICOHEADmenuitem"箭头图标",IDM_ICOARROWmenuitemseparatormenuitem"恐龙光标",IDM_CURDINOSAURmenuitem"手掌光标",IDM_CURHANDENDEND

 

二、在主窗口程序中使用菜单、图标、光标资源

1、如何建立窗口:第二篇 第一个窗口程序

 

2、使用方法

①使用菜单

首先,在获得模块句柄后将菜单(由菜单ID—IDM_MAIN指定)加载进应用程序

invokeGetModuleHandle,NULLmovhInstance,eaxinvokeLoadMenu,hInstance,IDM_MAINmovhMenu,eax

其次,在建立窗口时将菜单句柄hMenu作为参数传递进去

invokeCreateWindowEx,WS_EX_CLIENTEDGE,\offset szClassName,offset szClassName,\WS_OVERLAPPEDWINDOW,\200,200,300,200,\NULL,hMenu,hInstance,NULL


②使用光标与图标的方法

在调用CreateWindowEx建立窗口时,在函数返回前系统会向窗口程序发出WM_CREATE消息。我们可以

此时加载光标与图标资源。然后紧接着调用SendMessage函数将缺省建立的图标与光标类型发送给窗口程

序处理。

.ifeax == WM_CREATEinvokeLoadIcon,hInstance,ICON_HEADmovhIconHead,eaxinvokeLoadIcon,hInstance,ICON_ARROWmovhIconArrow,eaxinvokeLoadCursor,hInstance,CUR_HANDmovhCurHand,eaxinvokeLoadCursorFromFile,addr szCursorFilemovhCurDinosaur,eaxinvokeSendMessage,hWnd,WM_COMMAND,IDM_ICOHEAD,NULLinvokeSendMessage,hWnd,WM_COMMAND,IDM_CURHAND,NULL

 

3、例子

.386.model flat,stdcalloption casemap:noneincludewindows.incincludeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.lib;下面的equ定义千万不要写成0x...;菜单ID的定义IDM_MAINequ1000hIDM_ICOHEADequ2000hIDM_ICOARROWequ2001hIDM_CURDINOSAURequ2002hIDM_CURHANDequ2003h;图标ID的定义ICON_HEADequ3000hICON_ARROWequ3001h;静态光标文件的定义CUR_HANDequ4000h;句柄定义.data?hInstancedd?hMenudd?hWinMaindd?hCurDinosaurdd?hCurHanddd?hIconHeaddd?hIconArrowdd?.constszCursorFiledb'Dinosaur.ani',0     ;存储于磁盘上的动态光标文件        szClassNamedb'Icon and Cursor!',0.code_QuitprocinvokeDestroyWindow,hWinMaininvokePostQuitMessage,NULLret_Quitendp_WinMainProcprocuses ebx edi esi hWnd,uMsg,wParam,lParammoveax,uMsg.ifeax == WM_CREATEinvokeLoadIcon,hInstance,ICON_HEADmovhIconHead,eaxinvokeLoadIcon,hInstance,ICON_ARROWmovhIconArrow,eaxinvokeLoadCursor,hInstance,CUR_HANDmovhCurHand,eaxinvokeLoadCursorFromFile,addr szCursorFilemovhCurDinosaur,eaxinvokeSendMessage,hWnd,WM_COMMAND,IDM_ICOHEAD,NULLinvokeSendMessage,hWnd,WM_COMMAND,IDM_CURHAND,NULL.elseifeax == WM_COMMANDmoveax,wParammovzxeax,ax.ifeax == IDM_ICOHEAD;ICON_BIG是WM_SETICON中预定义的invokeSendMessage,hWnd,WM_SETICON,ICON_BIG,hIconHead     invokeCheckMenuRadioItem,hMenu,IDM_ICOHEAD,IDM_ICOARROW,\IDM_ICOHEAD,MF_BYCOMMAND.elseifeax == IDM_ICOARROW;ICON_SMALL是WM_SETICON中预定义的invokeSendMessage,hWnd,WM_SETICON,ICON_SMALL,hIconArrow    invokeCheckMenuRadioItem,hMenu,IDM_ICOHEAD,IDM_ICOARROW,\IDM_ICOARROW,MF_BYCOMMAND.elseifeax == IDM_CURDINOSAURinvokeSetClassLong,hWnd,GCL_HCURSOR,hCurDinosaurinvokeCheckMenuRadioItem,hMenu,IDM_CURDINOSAUR,IDM_CURHAND,\IDM_CURDINOSAUR,MF_BYCOMMAND.elseifeax == IDM_CURHANDinvokeSetClassLong,hWnd,GCL_HCURSOR,hCurHandinvokeCheckMenuRadioItem,hMenu,IDM_CURDINOSAUR,IDM_CURHAND,\IDM_CURHAND,MF_BYCOMMAND.endif.elseifeax == WM_CLOSEinvoke_Quit.elseinvokeDefWindowProc,hWnd,uMsg,wParam,lParamret.endifmoveax,0ret_WinMainProcendp_WinMainproclocal@stWndClass:WNDCLASSEXlocal@stMsg:MSGinvokeGetModuleHandle,NULLmovhInstance,eaxinvokeLoadMenu,hInstance,IDM_MAINmovhMenu,eaxinvokeRtlZeroMemory,addr @stWndClass,sizeof @stWndClasspushhInstancepop@stWndClass.hInstancemov@stWndClass.cbSize,sizeof @stWndClassmov@stWndClass.style,CS_HREDRAW or CS_VREDRAWmov@stWndClass.lpfnWndProc,offset _WinMainProcmov@stWndClass.hbrBackground,COLOR_WINDOW + 1mov@stWndClass.lpszClassName,offset szClassNameinvokeRegisterClassEx,addr @stWndClassinvokeCreateWindowEx,WS_EX_CLIENTEDGE,\offset szClassName,offset szClassName,\WS_OVERLAPPEDWINDOW,\200,200,300,200,\NULL,hMenu,hInstance,NULLmovhWinMain,eaxinvokeShowWindow,hWinMain,SW_SHOWNORMALinvokeUpdateWindow,hWinMain.whileTRUEinvokeGetMessage,addr @stMsg,NULL,0,0.break.ifeax == 0invokeTranslateMessage,addr @stMsginvokeDispatchMessage,addr @stMsg.endwret_WinMainendpstart:invoke_WinMaininvokeExitProcess,NULLendstart

三、代码中图标与光标文件下载

图标与光标文件

 

四、关于本篇博文的例子

程序运行起来后,选择菜单中的项目可以看到图标与光标的改变。

 

 

原创粉丝点击