用C写windows菜单的问题

vsn 2005-10-13 09:08:53
我看着Charles Petzold的windows程序设计里面的例子弄,可是每次编译完菜单都显示不出
来。用vc建立完工程后。我先写.c文件。然后插入资源文件,增加菜单选项。然后编译,可是运
行结果都无法载入菜单。
不知道用c写菜单的话具体步骤到底是怎么样的。菜单的ID属性还有子菜单的ID有什么要求
吗?还是WinMain和WndProc里面的要怎么写。
各位大大帮忙指教一下。
谢谢。
第一次提问,不知道要给几分。。
...全文
571 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
squalliskm 2005-10-16
虽然程序看不懂,但是 Hollow World 你打错了,是hello world
回复
vsn 2005-10-14
我按照snowbird的做法好像不行。。。
应该说有时候可以有时候不可以,我试着建了好几个工程试一下,用这样子命名菜单ID,就是有时候可以显示出来有时候不能显示。。。
回复
vsn 2005-10-14
还有楼上的snowbird。好像就是这样的原因啊。
谢谢你了
回复
vsn 2005-10-14
首先非常非常非常感谢楼上两位兄弟的帮助。
我现在发现我的问题出在哪里了。在包含菜单ID的代码这一行书上一直是用wc.lpszMenuName=szAppName 这种形式的。然后不知道为什么虽然我已经把菜单的ID改成和AppName一样了还是有时候可以载入菜单有时候不能载入菜单。现在改成wjwjwj的wc.lpszMenuName=(LPCSTR)IDR_MAIN_MENU这样的形式后菜单就可以显示出来了。
比如说我定义TCHAR szAppName[] = TEXT ("MENUTEST"),然后把菜单的ID定义为MENUTEST,然后令wc.lpszMenuName=szAppName ,这样子不知道为什么有时候菜单可以出来有时候不能出来。
谁能再告诉我是怎么回事吗。
谢谢。
回复
bestlife 2005-10-14
比如说我定义TCHAR szAppName[] = TEXT ("MENUTEST"),然后把菜单的ID定义为MENUTEST,然后令wc.lpszMenuName=szAppName ,这样子不知道为什么有时候菜单可以出来有时候不能出来。

你改菜单ID为MENUTEST的时候是要包括“”的。
回复
dummyfork 2005-10-14
以前做过这个
想了好久才想出来,不过现在程序找不到了,不知道在那里???
回复
wjwjwj 2005-10-14
资源ID号可以是字符串的形式或是一个常量符号,这就意味着你可以这样定义一个资源的ID,
方法1:65501
方法2:ID_TEST
方法3:"id_test"

一般情况下,方法一不用,原因不用在细说了吧。
方法二在resource.h文件中其实是一个#define语句说明的常量
如:#define ID_TEST 65501,可以看出其实是一个数值型数据
方法三是一个字符串常量

由于定义的时候可以使用任何一种方法,但是函数调用时的参数或者结构的某些域的赋值会要确定形式的数据,可能是字符串,也可能是数据,这就需要你在使用资源ID时会将其进行转换

如MAKEINTRESOURCE()宏,强制类型转化等。可以试一下。

回复
snowbirdfly 2005-10-13
我觉得楼主一定是这个原因没有显示出来~~~
就是名称起的不对~~~
我以前也是老是搞不清楚~~
明明代码没有一点问题,为什么老是没有显示???
希望你上面也是这样的问题~~~
///////////

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("ClipText") ;//起的名字是ClipText
...
wndclass.lpszMenuName = szAppName ;//定义拥有菜单,而且名称为ClipText
所以你填加菜单资源的时候,这个菜单资源的名称一定要起成这个名字:"CLIPTEXT"
而且一定要大写~~~加""~~~
这样试试看行不行~~~
回复
slzzg 2005-10-13
还有一个方法是在CreateWindow时加入

HMENU hMenu;
hMenu = LoadMenu(hInst, (LPCSTR)IDR_MAIN_MENU);
hWnd = CreateWindow(className, "Test", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, hMenu , hInstance, NULL);


回复
wjwjwj 2005-10-13
不好意思,上面的第2步不要。
回复
wjwjwj 2005-10-13
记得给分!谢谢!
开一个玩笑,分数太少了,写的太累了。
回复
wjwjwj 2005-10-13
在你的.c文件中加入#include "resource.h"

请按下面的方法再试一下:

1)创建一个空的Window32 application 工程;
2)添加一个.c文件;
3)创建一个菜单;
选择Insert->resource->Menu->New,创建的菜单设置如下(针对本例,你可以任意设置)
先输入任意一个顶层菜单的名称,如File
选择保存命令,将文件存储在你创建的工程目录下,名称可以取名为工程名.rc
关闭正在编辑的菜单,选择FileView视图,右键单击Resource Files目录,选择Add Files to Folder..., 选择刚才保存的.rc文件,右键单击Header Files目录,选择Add Files to Folder..., 选择工程目录下的resource.h文件(该文件在刚才保存的过程中自动生成)。

完成后,你会发现你有了Resource View视图。在该视图中有你未完成的菜单,选择该菜单修改成你需要的结构,本例中设置如下:
菜单ID:IDR_MAIN_MENU
在File菜单下添加两个菜单,分别为About(ID号为IDR_ABOUT),Exit(ID号为IDR_EXIT),保存。

查看你的resource.h,你会发现几个#define语句,类似下面
#define IDR_MAIN_MENU 101
#define IDR_ABOUT 40001
#define IDR_EXIT 40002
其它的不用管,这就说明你的菜单定义成功了。

4)为工程新建一个.c文件,输入如下代码
注意下面注释的地方
#include <windows.h>
//包含你的资源头文件
#include "resource.h"

#define MAX_LOADSTRING 100

HINSTANCE hInst;

ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

TCHAR className[100]=TEXT("test");

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;

MyRegisterClass(hInstance);

if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

//在这里包含你的菜单
//本例中的菜单ID已被命名为IDR_MAIN_MENU
wc.lpszMenuName = (LPCSTR)IDR_MAIN_MENU;

wc.lpszClassName = className;
wc.hIcon = LoadIcon(NULL,NULL);

return RegisterClass(&wc);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance;

hWnd = CreateWindow(className, "Test", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if(!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
//在这里处理你的菜单项操作
switch (wmId)
{
case IDR_ABOUT:
MessageBox(hWnd,"About!","About",MB_OK);
break;
case IDR_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, "Try", strlen("Try"), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

5)保存工程,编译,运行。

提示:
1)上面的是完全从头做起,你可以直接使用Win32 Application工程向导生成一个简单的"Hollow World!"应用程序,然后在该框架上进行修改
2)上面使用的IDE是Visual C++ 6.0,不是.net

回复
相关推荐
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2005-10-13 09:08
社区公告
暂无公告