5.0 - Adding a menu添加菜单
Our program should have a menu to set some options. Firstly we need to create our menu in the resource file:
我们的程序应该有一个菜单来设置一些选项。首先,我们需要在资源文件中创建我们的菜单。
5.1 - Creating a menu创建菜单
A menu is fairly easy to make in your resource file. If you take a look at the resource text below you will see it's self explaining. Popup menus are menus that have submenus, a menuitem is just a menuitem with an associated ID. These IDs will be defined and can be used in your program to find out which menu item the user clicked on. Finally, the ampersands (&) will underline the character the precede, indicating a shortkey can be used.
在你的资源文件中,很容易就可以创建一个菜单。如果你看一看下面的资源文本,你会看到它是其意自明的。Popup(弹出)菜单是有子菜单的菜单,一个菜单项仅是一个有关联ID的菜单项。这些ID将被定义而且可以被用于你的程序来找出用户点击的是哪个菜单项。最后,&号会下划线首字母,表示它可以使用快捷键。
Add this below the definitions:
添加下面的
MAINMENU MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New Game", MI_NEWGAME MENUITEM "&Open Bitmap ", MI_OPENBITMAP POPUP "&Difficulty" BEGIN MENUITEM "&Easy", MI_EASY MENUITEM "&Medium", MI_MEDIUM MENUITEM "&Hard", MI_HARD END END POPUP "&Picture" BEGIN MENUITEM "Use &standard picture", MI_USESTANDARD MENUITEM "Use &numbers", MI_USENUMBERS MENUITEM "Use &bitmap file", MI_USEFILE END POPUP "&Colors" BEGIN MENUITEM "&Blue color scheme", MI_COLORBLUE MENUITEM "&Red color scheme", MI_COLORRED MENUITEM "&Green color scheme", MI_COLORGREEN MENUITEM "&Ugly color scheme", MI_COLORUGLY END POPUP "&Help" BEGIN MENUITEM "&About", MI_ABOUT END END
Add this below the icon defines (before the code above!):
添加下面的菜单项定义(在前面的代码前!)
#define MAINMENU 301
#define MI_NEWGAME 101 #define MI_OPENBITMAP 102 #define MI_EASY 103 #define MI_MEDIUM 104 #define MI_HARD 105 #define MI_USESTANDARD 106 #define MI_USENUMBERS 107 #define MI_USEFILE 108 #define MI_COLORBLUE 109 #define MI_COLORRED 110 #define MI_COLORGREEN 111 #define MI_COLORUGLY 112 #define MI_ABOUT 113
5.2 - Defining the Ids定义ID
Now you'll have to convert the C definitions to asm equates:
现在我们必须把C定义翻译为asm:
MAINMENU equ 301
MI_NEWGAME equ 101 MI_OPENBITMAP equ 102 MI_EASY equ 103 MI_MEDIUM equ 104 MI_HARD equ 105 MI_USESTANDARD equ 106 MI_USENUMBERS equ 107 MI_USEFILE equ 108 MI_COLORBLUE equ 109 MI_COLORRED equ 110 MI_COLORGREEN equ 111 MI_COLORUGLY equ 112 MI_ABOUT equ 113
When you've converted them, place them in mosaic.inc.
在你翻译完它们后,把它们放入mosaic.inc中。
The resource file and mosaic inc should now look like this: res1.zip
资源和mosaic.inc文件应该和这个一样:res1.zip
5.3 - Adding the menu to your window把菜单加入你的窗口
[in your .data? section]
[在你的.data?部分] hMenu dd ?
[in your .code section]
[在你的.code部分] ...... invoke RegisterClassEx, addr wc ;AFTER THIS LINE! invoke LoadMenu, hInstance, MAINMENU ;load menu mov hMenu, eax ;store handle INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW-WS_MAXIMIZEBOX-WS_SIZEBOX,\ CW_USEDEFAULT, CW_USEDEFAULT,258,350,NULL,hMenu,\ ;!!!! hInst,NULL ;NOTE: notice addition of the hMenu parameter ; in the CreateWindowEx call. ......
The hMenu is added to the uninitialized data section to hold the menu handle when it's loaded. LoadMenu will load a menu resource from the instance hInstance (mosaic.exe) with a certain ID (). The handle is stored with 'mov hMenu, eax', then the handle is passed to CreateWindowEx to create a window with a menu. After you have run make.bat you should have a main window with a menu (that does nothing):
HMenu被加入未初始化data部分来在菜单载入后保存菜单句柄。LoadMenu会从实例hInstance(mosaic.exe)中用某个ID(MAINMENU)载入菜单。句柄用‘mov hMenu, eax’保存,然后句柄传递给CreateWindowEx来创建一个有菜单的窗口。在你运行了make.bat之后,你应当有了一个带菜单的主窗口(它什么也不干):

Your source file should look like this now: mosaic.asm
现在你的资源文件应该是这样:mosaic.asm 
|