绝大大部分菜单操作无响应。是函数/参数用错了吗?

caperbird 2008-08-29 05:51:23
平台:VC++6.0 SP3
WINDOWS XP Professional(BOJONE V7)
哥哥姐姐,侠哥侠姐些。拜托了。
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
static int iColorID[5]={WHITE_BRUSH,LTGRAY_BRUSH,GRAY_BRUSH,DKGRAY_BRUSH,BLACK_BRUSH}; //用于替换背景颜色
static int iSelection = IDM_WHITE; //默认背景颜色
static HINSTANCE hInstance;
HMENU hMenu;
switch(iMsg)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;//创建成功了吗?
return 0;
case WM_COMMAND:
hMenu = GetMenu(hwnd);
switch(LOWORD(wParam))
{
//...省略其他相同代码
case IDM_SAVEAS:
MessageBeep(-1); //点击响应一声
return 0;
case IDM_EXIT:
SendMessage(hwnd,WM_CLOSE,0,0L);//能够正常退出
return 0;
case IDM_DEL:
MessageBeep(-1); //点击响应一声
return 0;
//以下部分意图为更换对应选中背景颜色,但是相应菜单操作无响应,错在哪里啊?看了2天。看MSDN和百度没找到错误的原因。还是菜鸟~
case IDM_WHITE:
case IDM_LTGRAY:
case IDM_GRAY:
case IDM_DKGRAY:
case IDM_BLACK:
CheckMenuItem(hMenu,iSelection,MF_UNCHECKED);
iSelection=LOWORD(wParam);
CheckMenuItem(hMenu,iSelection,MF_CHECKED);
SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(iColorID[LOWORD(wParam)-IDM_WHITE]));
InvalidateRect(hwnd,NULL,TRUE);
return 0;
//计时器也是没反应。哭。。。
case IDM_START:
if(SetTimer(hwnd,1,1000,NULL))
{
EnableMenuItem(hMenu,IDM_START,MF_GRAYED);
EnableMenuItem(hMenu,IDM_STOP,MF_ENABLED);
}
return 0;
case IDM_STOP:
KillTimer(hwnd,1);
EnableMenuItem(hMenu,IDM_START,MF_ENABLED);
EnableMenuItem(hMenu,IDM_STOP,MF_GRAYED);
return 0;
case IDM_HELP:
MessageBox(hwnd,"Help not yet implemented.",szAppName,MB_ICONEXCLAMATION |MB_OK);
return 0;
//对话框也是弹不出来。怎么回事啊?
case IDM_ABOUT:
DialogBox(hInstance,"AboutBox",hwnd,AboutDlgProc);
return 0;
}
break;
case WM_TIMER:
MessageBeep(-1);
return 0;
case WM_DESTROY:
PostQuitMessage(-1);
return 0;

}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}

BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
switch(iMsg)
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog(hDlg,0);
return TRUE;
}
break;
}
return FALSE;
}
...全文
154 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
caperbird 2008-09-08
  • 打赏
  • 举报
回复
恩。。。这里的两个ABOUTBOX和AboutBox是不一样的。谢谢了。问题就要找到答案了。谢谢大家了
ringphone 2008-09-03
  • 打赏
  • 举报
回复
case IDM_SAVE:
//Now the DialogBox appear.What's the matter?
MessageBox(hwnd,"","",NULL);//如果注释掉这句就不能显示了。是UpdateWindow有问题?
DialogBox(hInstance,"ABOUTBOX",hwnd,AboutDlgProc);

case IDM_ABOUT:
//didn't work,why?这里加了MessageBox后还是不能显示。检查菜单和加速键表,我没能发现错误。怎么回事?
MessageBox(hwnd,"","",NULL);
DialogBox(hInstance,"AboutBox",hwnd,AboutDlgProc);
-------------------
资源标识也是大小写敏感的,
DialogBox(hInstance,"ABOUTBOX",hwnd,AboutDlgProc);
DialogBox(hInstance,"AboutBox",hwnd,AboutDlgProc);
肯定有一个出不来的。
但是MessageBox注释掉出不来是件很奇怪的事情。
caperbird 2008-09-03
  • 打赏
  • 举报
回复
偶也是菜鸟。。谢谢
赵民勇 2008-09-03
  • 打赏
  • 举报
回复
菜鸟发个言----你调用下showwindow()之类的显示窗口的函数试试
caperbird 2008-09-03
  • 打赏
  • 举报
回复
//这个是今天下午改的。。能够显示部分DialogBox了,但是更加迷糊了。
#include <windows.h>
#include "menudemo.h"

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK AboutDlgProc(HWND,UINT,WPARAM,LPARAM);

char szAppName[]="MenuDemo";
HWND hWndModeless = NULL;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PSTR szCmdLine,int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASSEX secwndclass;
HACCEL Accel;
secwndclass.cbSize = sizeof(secwndclass);
secwndclass.style = CS_HREDRAW|CS_VREDRAW;
secwndclass.lpfnWndProc=WndProc;
secwndclass.cbClsExtra = 0;
secwndclass.cbWndExtra = 0;
secwndclass.hInstance = hInstance;
secwndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
secwndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
secwndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
secwndclass.lpszMenuName = szAppName;
secwndclass.lpszClassName = szAppName;
secwndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);

//Register the windowclass
RegisterClassEx(&secwndclass);
hwnd = CreateWindow(szAppName,"菜单示例",WS_OVERLAPPED,0,0,800,600,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);

Accel = LoadAccelerators(hInstance,"Accelerator");
while(GetMessage(&msg,NULL,0,0))
{
if(!TranslateAccelerator(hwnd,Accel,&msg)||!IsDialogMessage(NULL,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
static int iColorID[5]={WHITE_BRUSH,LTGRAY_BRUSH,GRAY_BRUSH,DKGRAY_BRUSH,BLACK_BRUSH};
static int iSelection = IDM_WHITE;
static HINSTANCE hInstance;
HMENU hMenu;
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(iMsg)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
return 0;
case WM_COMMAND:
hMenu = GetMenu(hwnd);
switch(LOWORD(wParam))
{
case IDM_NEW:
hdc=GetDC(hwnd);
TextOut(hdc,10,10,"试一哈哈",8);
ReleaseDC(hwnd,hdc);
return 0;
case IDM_OPEN:
MessageBox(hwnd,"Test 2",TEXT("打开"),MB_ICONEXCLAMATION|MB_OK);
return 0;
case IDM_SAVE:
//Now the DialogBox appear.What's the matter?
MessageBox(hwnd,"","",NULL);//如果注释掉这句就不能显示了。是UpdateWindow有问题?
DialogBox(hInstance,"ABOUTBOX",hwnd,AboutDlgProc);
case IDM_SAVEAS:
MessageBeep(-1);
return 0;
case IDM_EXIT:
SendMessage(hwnd,WM_CLOSE,0,0L);
return 0;
case IDM_UNDO:
case IDM_CUT:
case IDM_COPY:
case IDM_PASTE:
case IDM_DEL:
MessageBeep(-1);
return 0;
break;
case IDM_WHITE:
case IDM_LTGRAY:
case IDM_GRAY:
case IDM_DKGRAY:
case IDM_BLACK:

CheckMenuItem(hMenu,iSelection,MF_UNCHECKED);
iSelection=LOWORD(wParam);
CheckMenuItem(hMenu,iSelection,MF_CHECKED);
SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(iColorID[LOWORD(wParam)-IDM_WHITE]));
InvalidateRect(hwnd,NULL,TRUE);
return 0;
case IDM_START:
if(SetTimer(hwnd,1,1000,NULL))
{
EnableMenuItem(hMenu,IDM_START,MF_GRAYED);
EnableMenuItem(hMenu,IDM_STOP,MF_ENABLED);
}
return 0;
case IDM_STOP:
KillTimer(hwnd,1);
EnableMenuItem(hMenu,IDM_START,MF_ENABLED);
EnableMenuItem(hMenu,IDM_STOP,MF_GRAYED);
return 0;
case IDM_HELP:
MessageBox(hwnd,"Help not yet implemented.",szAppName,MB_ICONEXCLAMATION|MB_OK);
return 0;
case IDM_ABOUT:
//didn't work,why?这里加了MessageBox后还是不能显示。检查菜单和加速键表,我没能发现错误。怎么回事?
MessageBox(hwnd,"","",NULL);
DialogBox(hInstance,"AboutBox",hwnd,AboutDlgProc);
return 0;
}
break;
case WM_TIMER:
MessageBeep(-1);
return 0;
case WM_DESTROY:
PostQuitMessage(-1);
return 0;
//WM_PAINT haven't been dispose
/* case WM_PAINT:
BeginPaint(hwnd,&ps);
//GetClientRect(hwnd,&rect);
EndPaint(hwnd,&ps);
return 0;*/
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}

BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
switch(iMsg)
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog(hDlg,0);
return TRUE;
}
break;
}
return FALSE;
}
菜牛 2008-09-03
  • 打赏
  • 举报
回复
WM_PAINT消息中必须要有BeginPaint()/EndPaint()调用以消除无效矩形,否则消息队列中就会一直有WM_PAINT消息存在,所以我才有此一问。而WM_PAINT中绝不能调用InvalidateRect什么的刷新函数。建议好好学学Windows编程。
caperbird 2008-09-03
  • 打赏
  • 举报
回复
还是没找出毛病在哪里。继续努力。。同时求达人帮助
bitxinhai 2008-09-01
  • 打赏
  • 举报
回复
看看你的菜单消息是否映射到你的处理函数里面去???
masa_sts 2008-09-01
  • 打赏
  • 举报
回复
中间switch
为啥return的都是0阿,
至少要return DefWindowProc(hwnd,iMsg,wParam,lParam) 把
还有每个case 应该要个break跳出吧
caperbird 2008-09-01
  • 打赏
  • 举报
回复
还是没弄好。请高手们不吝赐教啊
caperbird 2008-09-01
  • 打赏
  • 举报
回复
lPrama这个参数好像没有用到。我也不太清楚。我去看看。谢谢你。
queshangxintou 2008-09-01
  • 打赏
  • 举报
回复
&msg 0x0012ff10 {msg=0x00000113 wp=0x00000001 lp=0x00000000}
我认为可能是 SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(iColorID[LOWORD(wParam)-IDM_WHITE]));
这里出错了 lp=0x00000000这个应该不是0
caperbird 2008-09-01
  • 打赏
  • 举报
回复
case IDM_BLACK:
CheckMenuItem(hMenu,iSelection,MF_UNCHECKED);
iSelection=LOWORD(wParam);
CheckMenuItem(hMenu,iSelection,MF_CHECKED);
SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(iColorID[LOWORD(wParam)-IDM_WHITE]));
InvalidateRect(hwnd,NULL,TRUE); //这里会调用?发出 WM_PAINT消息。我在这里的处理是无用的吗?
//需要在WP_PAINT里再次处理重绘?还是?谢谢大家了啊。小弟真没招了。才学
caperbird 2008-09-01
  • 打赏
  • 举报
回复
case IDM_BLACK:
CheckMenuItem(hMenu,iSelection,MF_UNCHECKED);
iSelection=LOWORD(wParam);
CheckMenuItem(hMenu,iSelection,MF_CHECKED);
SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(iColorID[LOWORD(wParam)-IDM_WHITE]));
InvalidateRect(hwnd,NULL,TRUE); //这里会调用?发出 WM_PAINT消息。我在这里的处理是无用的吗?
//需要在WP_PAINT里再次处理重绘?还是?谢谢大家了啊。小弟真没招了。才学
caperbird 2008-09-01
  • 打赏
  • 举报
回复
case WM_PAINT:
InvalidateRect(hwnd,NULL,TRUE); //这样是错误的吗?我想更新背景颜色。这样不行的话应该怎么写啊?请指点指点。
return 0;
菜牛 2008-08-30
  • 打赏
  • 举报
回复
你没有处理WM_PAINT消息吗?加上!
caperbird 2008-08-29
  • 打赏
  • 举报
回复
跟踪到第三轮的时候死掉的。。
while(GetMessage(&msg,NULL,0,0))
{
if(!TranslateAccelerator(hwnd,Accel,&msg))//定在这
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
caperbird 2008-08-29
  • 打赏
  • 举报
回复
- Accel 0x0266077d
unused CXX0030: Error: expression cannot be evaluated
- hInstance 0x00400000
unused 9460301
- &msg 0x0012ff10 {msg=0x00000113 wp=0x00000001 lp=0x00000000}
+ hwnd 0x00190282
message 275
wParam 1
lParam 0
time 22743493
+ pt {x=532 y=534}
跟踪到这步就死掉了。。看不明白额
caperbird 2008-08-29
  • 打赏
  • 举报
回复
这里的IDM_是资源 菜单的消息
liumeiqinyang 2008-08-29
  • 打赏
  • 举报
回复
IDM_不是ie的消息嘛?
加载更多回复(1)

16,471

社区成员

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

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

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