GetMessage(&msg,0,0,0)的问题?

lixang000 2007-10-04 12:06:35
LRESULT CALLBACK myProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CHAR: char chArr[20];
sprintf(chArr,"char is%d",wParam);
MessageBox(hWnd,chArr,"FristPrograme",0);
break;
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShow)
{
//1设计窗口
WNDCLASS wc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor=LoadCursor(0,IDC_CROSS);
wc.hIcon=LoadIcon(0,IDI_ERROR);
wc.hInstance=hInstance;
wc.lpfnWndProc=myProc;
wc.lpszClassName="FristPrograme";
wc.lpszMenuName=0;
wc.style=CS_HREDRAW|CS_VREDRAW;
//2注册窗口
RegisterClass(&wc);
//3制造窗口
HWND hWnd;
hWnd=CreateWindow("FristPrograme","no",WS_OVERLAPPEDWINDOW,
0,0,400,600,0,0,hInstance,0);
//4显示窗口:
ShowWindow(hWnd,SW_SHOWNORMAL);
//5更新窗口:
UpdateWindow(hWnd);
//6消息循环:
MSG msg;//msg为空

while(GetMessage(&msg,0,0,0))
{
//问题: //GetMessage从那里获取消息?我想应该从hWnd(刚才创建的窗口中获取消息)
//所以我想应该写为GetMessage(&msg,hWnd,0,0),然他并不响应!
//可是GetMessage(&msg,0,0,0)从0位置而非hWnd位置获得的消息,居然能相应!
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

GetMessage(&msg,0,0,0)与GetMessage(&msg,hWnd,0,0)区别?为何与我想的不一样呢?
...全文
244 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunlin7 2007-10-04
  • 打赏
  • 举报
回复
GetMessage(&msg,0,0,0)取得整个线程的消息,之后可以根据msg.hWnd来判断消息来自哪个窗口(或者是线程消息).
GetMessage(&msg,hWnd,0,0)取得hWnd窗口的消息
wltg2001 2007-10-04
  • 打赏
  • 举报
回复
贴MSDN中对LoadIcon中的hInstance的说明:
hInstance
[in] Handle to an instance of the module whose executable file contains the icon to be loaded. This parameter must be NULL when a standard icon is being loaded.
wltg2001 2007-10-04
  • 打赏
  • 举报
回复
看MSDN吧,系统中内置一些光标和图标,你上面例子中的IDI_ERROR就是其中一个,当用这些内置的光标和图标时,将hInstiance设为NULL,如果图标是你自己做的,或是一个资源DLL中的,那么hInstance就一定要设置了。
lixang000 2007-10-04
  • 打赏
  • 举报
回复

问题:??

按照我的想法IDI_ERRO应当加在一个实例上,上面由WinMain创建的实例应当是hInstance
;所以我想应当这样写成________A形式!
wc.hIcon=LoadIcon(hInstance,IDI_ERROR);//_______A形式
然而下面________B形式!
竟然将IDI_ERRO加载到了0实例上
wc.hIcon=LoadIcon(0,IDI_ERROR); //________A形式!
却是正确的!
困惑!希望指点?
wltg2001 2007-10-04
  • 打赏
  • 举报
回复
第一个问题:GetMessage(&msg,hWnd,0,0),
消息是对线程而言的,并不是对窗口而言的,如果写成GetMessage(&msg,hWnd,0,0)的话有些消息收不到,比如:WM_QUIT消息,所以这样最明显的一个问题,你的进程无法退出。
第二个问题对myProc的调用一般是由系统来处理,参数也由系统自己传入,一个是在消息队列中有消息或是调用了SendMessage的时候。
lixang000 2007-10-04
  • 打赏
  • 举报
回复
谢谢:

那系统是如何调用的呢?
龙凤呈祥焱 2007-10-04
  • 打赏
  • 举报
回复
系统负责调用,不是你自己调用.
lixang000 2007-10-04
  • 打赏
  • 举报
回复
谢谢:我明白了一些!

wc.lpfnWndProc=myProc; //我知道了这里只是静态的记住了myProc;
请问什么时候真正调用了myProc呢?

LRESULT CALLBACK myProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
) ;里面可有四个参数:

调用应该是这样的
返回值 函数名称( ...,hWnd, uMsg, wParam,lParam...)
{ 。。。。。
myProc(hWnd, uMsg, wParam,lParam);
// 或者wc.lpfnWndProc(hWnd, uMsg, wParam,lParam);
。。。。。
}
但是并没有显示这样的代码?

还希望大家帮助!

16,548

社区成员

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

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

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