有关win32应用程序中load资源资源的问题

bill_chuang 2009-08-13 04:07:26
最近在学windows程序设计,看的是Charles Petzold的那本《windows程序设计》,里面引用资源的方法大多是给资源一个字符串名字(需要加引号)的ID(如要添加一个菜单资源,它的ID可以是应用程序名称),然后将这个名字赋给wndclass.lpszMenuName,的确这么做的确要比用ID号省事多了,但是我发现这么做经常加载不了,有时候名字改一下就可以,有时候怎么改名字都没有,但是如果用ID号的话然后用MAKEINTRESOURCE宏转换就可以。
所以我就对此很纳闷,有哪位这方面的高手指教下,对于此问题有哪些要注意的地方和建议。
在此先谢过了。
下面是一个精简过的例子:(没有一点问题,执行后就是没有菜单)
#include<windows.h>
#include"resource.h"


LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
TCHAR szAppName[]="MENUDEMO";
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,INT iCmdShow)
{

HWND hwnd;
MSG msg;
WNDCLASS wndclass;

wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=szAppName;
wndclass.lpszClassName=szAppName;

if(!RegisterClass(&wndclass))
{
MessageBox(NULL,"ERROR!",szAppName,0);
return 0;
}

hwnd=CreateWindow(
szAppName,
szAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
hMenu,
hInstance,
NULL);

ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);

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

return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{

switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
...全文
177 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bill_chuang 2009-08-13
  • 打赏
  • 举报
回复
因为那本书上就是说加载菜单可以用资源名字或者ID号都可以,而且书上一直都是用的资源名字的,我是照他那么做的,这段简单的代码是我的程序无效后,就把其他的注释掉然后就留下了构建框架的代码,照道理框架应该可以构建吧,但是还是没用,其他情况很少会有用,现在我暂时先只能用ID号。
至于Ghost90提到的“因为 TCHAR szAppName[]="MENUDEMO"; 的值正好和资源ID值相等了,这种机率非常小。”,书上一直都是这么用的呀,那本书很权威的。
Ghost90 2009-08-13
  • 打赏
  • 举报
回复
wndclass.lpszMenuName 这个变量其实不是一个字符串指针,只是一个DWORD类型的变量,MAKEINTRESOURCE只是把ID的高2字节置0 因为资源ID的值只有2字节其实就是资源的ID值跟字符串没啥关系,你说的有时改改就好使了是因为 TCHAR szAppName[]="MENUDEMO"; 的值正好和资源ID值相等了,这种机率非常小。你可以做个实验
wndclass.lpszMenuName=(LPCTSTR)200; //200是资源ID
这样每次都是对的。

还有就是你说“引用资源的方法大多是给资源一个字符串名字”,这个怎么引用,我试了没成功,能把代码贴出来吗?
雪影 2009-08-13
  • 打赏
  • 举报
回复
lpszMenuName
Pointer to a null-terminated character string that specifies the resource name of the class menu, as the name appears in the resource file. If you use an integer to identify the menu, use the MAKEINTRESOURCE macro. If this member is NULL, windows belonging to this class have no default menu.
wndclass.lpszMenuName参数可能为菜单的资源名字,也可以通过MAKEINTRESOURCE,使用菜单的ID。
然后通过lpszMenuName加载菜单。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧