我想在空白窗口加入菜单,按照书上讲的去做,可是还是没实现:(,是不是我太笨了啊,555555.
我按书上定义的3个函数是Menu.h,Menu.cpp,Menu.rc,放在同一个工作区,分别如下:
Menu.h:
-------------------------
# define IDM_NEW 10
# define IDM_OPEN 11
# define IDM_CLOSE 12
# define IDM_SAVE 13
# define IDM_SAVES 14
# define IDM_ADDPRINTMENU 15
# define IDM_DELPRINTMENU 16
# define IDM_EXIT 17
# define IDM_CUT 18
# define IDM_COPY 19
# define IDM_PASTE 20
# define IDM_DELETE 21
# define IDM_HELP 22
# define IDM_LINE 23
# define IDM_RECT 24
# define IDM_RRECT 25
# define IDM_ELLIP 26
-----------------------------------------
Menu.cpp:
---------------------------
#include<windows.h>
#include "Menu.h"
HMENU hmenu,hprintmenu;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//--------------初始化窗口类------------------
int WINAPI WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInst,
LPSTR   lpszCmdLine,
int       nCmdShow)
{
HWND hwnd;
MSG Msg;
HACCEL hAccel;
WNDCLASS wndclass;
char lpszClassName[]="窗口";
char lpszTitle[]="My_windows";
char lpszMenuName[]="菜单";
wndclass.style=0;
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=(WNDPROC)WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=lpszMenuName;
wndclass.lpszClassName=lpszClassName;
//-----------------以下进行窗口类的注册--------------
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
hwnd=CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
//加载加速键资源
hAccel=LoadAccelerators(hInstance,lpszMenuName);
while(GetMessage(&Msg,NULL,0,0))
{
if(! TranslateAccelerator(hwnd,hAccel,&Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd,
 UINT message,
 WPARAM wParam,
 LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_NEW:
break;
case IDM_OPEN:
break;
case IDM_SAVE:
break;
case IDM_SAVES:
break;
case IDM_CLOSE:
break;
case IDM_ADDPRINTMENU:
//获取主菜单句柄
hmenu=GetMenu(hwnd);
hprintmenu=CreateMenu();
AppendMenu(hprintmenu,MF_ENABLED,IDM_LINE,"求和");
AppendMenu(hprintmenu,MF_ENABLED,IDM_RECT,"方差");
AppendMenu(hprintmenu,MF_ENABLED,IDM_RRECT,"平均值");
AppendMenu(hprintmenu,MF_ENABLED,IDM_ELLIP,"均方根");
InsertMenu(hmenu,2,MF_POPUP|MF_BYPOSITION,(UINT)hprintmenu,"统计计算(&C)");
EnableMenuItem(hmenu,IDM_ADDPRINTMENU,MF_GRAYED);
EnableMenuItem(hmenu,IDM_DELPRINTMENU,MF_ENABLED);
DrawMenuBar(hwnd);
break;
case IDM_DELPRINTMENU:
DeleteMenu(hmenu,2,MF_BYPOSITION);
EnableMenuItem(hmenu,IDM_ADDPRINTMENU,MF_ENABLED);
EnableMenuItem(hmenu,IDM_DELPRINTMENU,MF_GRAYED);
DrawMenuBar(hwnd);
break;
case IDM_EXIT:
SendMessage(hwnd,WM_DESTROY,0,0);
break;
case IDM_CUT:
break;
case IDM_COPY:
break;
case IDM_PASTE:
break;
case IDM_DELETE:
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return(0);
}
---------------------------------
Menu.rc
-----------------------------------
#include<windows.h>
#include "Menu.h"
Menu MENU DISCARDABLE
{
POPUP "文件(&F)"
{
MENUITEM "新建(&N) \t Ctrl+N", IDM_NEW
MENUITEM "打开(&O) \t,Ctrl+O", IDM_OPEN
MENUITEM "关闭(&C)", IDM_CLOSE
MENUITEM SEPARATOR
MENUITEM "保存(&S) \t Ctrl+S", IDM_SAVE
MENUITEM "另存为(&A)", IDM_SAVES
MENUITEM SEPARATOR
MENUITEM "创建统计计算菜单项(&P) \t Ctrl+P",IDM_ADDPRINTMENU
MENUITEM "删除统计计算菜单项(&D) \t Ctrl+D",IDM_DELPRINTMENU,GRAYED
MENUITEM SEPARATOR
MENUITEM "退出(&X)", IDM_EXIT
}
POPUP "编辑(&E)"
{
MENUITEM "剪切(&T) \t Ctrl+X", IDM_CUT
MENUITEM "复制(&C) \t Ctrl+C", IDM_COPY
MENUITEM "粘贴(&P) \t Ctrl+V", IDM_PASTE
MENUITEM "删除(&D) \t Del", IDM_DELETE
}
   MENUITEM "帮助(&H)", IDM_HELP
}
MENU ACCELERATORS MOVEABLE PURE
{
"^N", IDM_NEW, ASCII
"^O", IDM_OPEN, ASCII
"^S", IDM_SAVE, ASCII
"^P", IDM_ADDPRINTMENU,ASCII
"^D", IDM_DELPRINTMENU,ASCII
"^X", IDM_CUT, ASCII
"^C", IDM_COPY, ASCII
"^V", IDM_PASTE, ASCII
VK_DELETE,IDM_DELETE,VIRTKEY
}
----------------------
就这样了,编译没有错误,但运行Menu.cpp时为什么出现的窗口没有菜单呢?郁闷ing~~~~~~~~~~~~~~~~~

解决方案 »

  1.   

    DrawMenuBar(hwnd);
    SetMenu(hprintmenu) 加上这行
    break;
      

  2.   

    int WINAPI WinMain( HINSTANCE hInstance,
        HINSTANCE hPrevInst,
    LPSTR   lpszCmdLine,
    int       nCmdShow)
    {
    HWND hwnd;
    MSG Msg;
    HACCEL hAccel;
    WNDCLASS wndclass;
    char lpszMenuName[]="窗口";   
    //这里应该改成 char lpszClassName[]="menu";你在menu.rc中的有Menu MENU DISCARDABLE,第一个menu就表示资源名,lpszMenuName必须与这里定义的资名一致。
    char lpszTitle[]="My_windows";
      

  3.   

    sorroy,打错字了。应该把char lpszMenuName[]="菜单"改成
    char lpszMenuName[]="menu"
      

  4.   

    我按你的方法加上去,反回值为如下:
    D:\c++练习\munu\Menu.cpp(91) : error C2660: 'SetMenu' : function does not take 1 parameters
    该怎么处理呢?
      

  5.   

    不过我能再问一下吗?
    就是我把char lpszMenuName[]="菜单"改成
    char lpszMenuName[]="menu"
    和char lpszMenuName[]="菜单"改成
    char lpszMenuName[]="Menu"
    效果是一样的,难道不区分大小写吗?我在Menu.rc里面定义的是Menu大写的“M”啊.