这个是孙鑫的c++深入详解的第一章,/////////////////////////////////////////////////
////////////////这里的消息msg没有和CALLBACK WinMeadProcess这个消息处理函数关联
///////////////////程序怎么将msg传入函数WinMeadProcess
小弟以前写过几个java程序,现在看vc,有点莫名其妙.............#include <windows.h>
#include <stdio.h>LRESULT CALLBACK WinMeadProcess(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
){
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDI_ERROR);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WinMeadProcess;
wndcls.lpszClassName="mead";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls);

HWND hwnd;
hwnd=CreateWindow("mead","Here is title, right?",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
/////////////////////////////////////////////////
////////////////这里的消息msg没有和CALLBACK WinMeadProcess这个消息处理函数关联
///////////////////程序怎么将msg传入函数WinMeadProcess
MSG msg;
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
MSG msg2;
while(GetMessage(&msg2,NULL,0,0)){
//TranslateMessage(&msg);
//DispatchMessage(&msg);
}
return msg.wParam;
}LRESULT CALLBACK WinMeadProcess(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
){
switch(uMsg){
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char,title here, right???",MB_YESNO);
break;
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse cliched","message",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"here will show the Text now, right???",strlen("here will show the Text now, right???"));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"I really wanne learn cpp hard...",strlen("I really wanne learn cpp hard..."));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
//messageBox type is: YES or No....
if(
IDYES==
MessageBox
(hwnd,"这么好的程序,你真的要关闭吗?别关闭好吗???","message,title here, right???",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}

解决方案 »

  1.   

        wndcls.lpfnWndProc=WinMeadProcess;
    这句关联了啊
      

  2.   

    msg和回调函数的交互由窗口对象来调度。窗口对象可以接收windows的各类消息,然后将消息交给注册给它的调度函数处理,这个过程是封装在窗口对象中的。
      

  3.   

    wndcls.lpfnWndProc=WinMeadProcess;
    这不就关联了吗?理解windows 消息机制!!
    当调用GetMessage这个函数的时候,会创建一个消息的线程队列,当有事件触发的时候,操作系统会把相应的消息投递到相应的线程队列里面,然后,应用程序通过GetMessage来取消息,并把消息分派给窗口过程处理!大概就是这样!
      

  4.   

    你是用的MFC吗?MFC是挂红来实现的,在工程中有3处添加了代码。
      

  5.   

    谢谢.
    请教一下大家,vc++现在还有学习的必要吗?
    现在大家都用net,还有操作系统也要变了
    Windows7都要出来了,会不会和其它工具一样要被淘汰呀?
    可能Windows7都没有MFC的框架了哦?用NET的框架了.
    vc++好像挺复杂的,有点要命....
    呵呵
      

  6.   

    我也在看这个视频
    ////////////////这里的消息msg没有和CALLBACK WinMeadProcess这个消息处理函数关联
    ///////////////////程序怎么将msg传入函数WinMeadProcess
        MSG msg;    
        while(GetMessage(&msg,NULL,0,0)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    DispatchMessage(&msg);这句会把消息传回给操作系统,操作系统会再把这个消息分发到窗体的回调函数处理,回调函数你已经通过RegisterClass注册了,所以操作系统知道这个回调函数。如果没有DispatchMessage(&msg);这句你的窗体回调函数将不会接收到任何消息,不信你把它拿掉看看。
      

  7.   

    windows消息机制采用了回调函数,您在设子窗口的时候会把回调函数的地址注册报告给操作系统,操作系统在接收到跟此窗口相关的消息时会去找先前注册的回调函数的地址,然后调用回调函数。
      

  8.   

    WNDCLASS wndcls;
        wndcls.cbClsExtra=0;
        wndcls.cbWndExtra=0;
        wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
        wndcls.hCursor=LoadCursor(NULL,IDI_ERROR);
        wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
        wndcls.hInstance=hInstance;    wndcls.lpfnWndProc=WinMeadProcess;
        wndcls.lpszClassName="mead";
        wndcls.lpszMenuName=NULL;
        wndcls.style=CS_HREDRAW | CS_VREDRAW;    RegisterClass(&wndcls);
    这段代码是让 WinMeadProcess 跟一个窗口类关联,
    RegisterClass(&wndcls); 是让这个窗口类跟系统关联,注意,是系统,就是操作系统
    然后还是操作系统去调用 WinMeadProcess ,这个跟java的确很多不一样。