《笔记》孙鑫老师MFC第一讲(windows程序内部运行原理)

《笔记》孙鑫老师MFC第一讲(windows程序内部运行原理) 收藏
《笔记》孙鑫老师MFC第一讲(windows程序内部运行原理)



      学习孙鑫老师的VC++视频终于到一半了,其中有很多东西没有真正的掌握,所以从新再来一遍,正好写上笔记记录下自己的掌握程度。



      Windows程序是一种事件驱动的程序设计方法,主要是基于消息的运行。每个事件触发的消息存在与消息队列中,每次windows程序从消息队列中GetMessge(一条),然后TranslateMessge,然后DispatchMessage,在设计窗口的时候会为该窗口指定一个消息处理的函数WindowProc()用于对Get的消息进行处理,当程序得到一个WM_QUIT消息的时候结束程序的循环。

      Windows程序的运行机制是,首先需要在WinMain函数中设计窗口(这里指定消息处理的函数),然后对设计的窗口进行Register,接着需要创建这个已经完成注册的窗口,并且需要用一个HWND的句柄来记录这个创建的窗口,接着ShowWindow,UpdateWindow,然后进入消息队列的循环,GetMessage,TranslateMessag,DispatchMessage,直到接受到一个WM_QUIT的消息,程序则推出,在消息处理函数中还必须在默认的消息处理中调用DefWindowProc来为应用程序没有处理的消息提供缺省的处理。





WM_QUIT,WM_DESTROY,WM_CLOSE的区别。



WM_DESTORY和WM_CLOSE都是程序员可以处理的消息,而WM_QUIT是不能被捕获的。

先说WM_CLOSE

WM_CLOSE是当用户点击"X"或者在系统菜单里选择了关闭。都会传递WM_CLOSE的消息,默认的是调用DestroyWindow函数进行处理,如果选择自己捕获该消息并且处理,应该当用户确定要关闭窗口的时候调用DestroyWindow函数,DestroyWindow函数给消息循环发送WM_Destory消息,DefWindowProc函数不会响应DestoryWindow消息,需要程序员调用PostQuitMessage来对资源进行释放。



再说WM_Destory

WM_Destroy消息不会被DefWindowProc处理,只能让程序员自己对该部分资源进行释放,如果你没有对该部分资源处理(调用PostQuitMessage(0))则销毁了窗口,但是并没有真正的结束程序,该程序的进程仍然存在。



最后WM_QUIT

WM_QUIT是由PostQuitMessage发送的,GetMessage返回FALSE,直接结束消息循环,故该消息不会被程序员捕获。



刚开始学习,错误的地方还请纠正。

COPY上这节课的例子。



view plaincopy to clipboardprint?
#include <windows.h>  
#include <stdio.h>  
LRESULT CALLBACK myWindowProc(  
                            HWND hwnd,      // handle to window  
                            UINT uMsg,      // message identifier  
                            WPARAM wParam,  // first message parameter  
                            LPARAM lParam   // second message parameter  
);  
int WINAPI WinMain(  
                   HINSTANCE hInstance,      // handle to current instance  
                   HINSTANCE hPrevInstance,  // handle to previous instance  
                   LPSTR lpCmdLine,          // command line  
                   int nCmdShow              // show state  
)  
{  
    HMENU hMenu;  
    hMenu=LoadMenu(hInstance,(LPCSTR)"testMenu");  
    WNDCLASS myWnd;  
    myWnd.cbClsExtra=0;  
    myWnd.cbWndExtra=0;  
    myWnd.hbrBackground=(HBRUSH)GetStockObject(DKGRAY_BRUSH);  
    myWnd.hCursor=LoadCursor(NULL,IDC_ARROW);  
    myWnd.hIcon=LoadIcon(NULL,IDI_APPLICATION);  
    myWnd.hInstance=hInstance;  
    myWnd.lpfnWndProc=myWindowProc;  
    myWnd.lpszClassName="Maturn";  
    myWnd.lpszMenuName="testMenu";  
    myWnd.style=CS_HREDRAW | CS_VREDRAW;  
      
    RegisterClass(&myWnd);  
      
    HWND hWnd;  
      
    hWnd = CreateWindow("Maturn","Maturn's window",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,600,400,NULL,hMenu,hInstance,NULL);  
    ShowWindow(hWnd,SW_NORMAL);  
    //UpdateWindow(hWnd);  
    MSG msg;  
    while(GetMessage(&msg,NULL,0,0))  
    {  
        TranslateMessage(&msg);  
        DispatchMessage(&msg);  
    }  
    return 0;  
}  
LRESULT CALLBACK myWindowProc(  
                            HWND hwnd,      // handle to window  
                            UINT uMsg,      // message identifier  
                            WPARAM wParam,  // first message parameter  
                            LPARAM lParam   // second message parameter  
)  
{  
    HDC hdc;  
    PAINTSTRUCT ps;  
    switch(uMsg)  
    {  
    case WM_PAINT:  
        hdc=BeginPaint(hwnd,&ps);  
        TextOut(hdc,0,0,"Software College of Hebei Normal Universty.",strlen("Software College of Hebei Normal Universty."));  
        TextOut(hdc,260,193,"Hello World",strlen("Hello World"));  
        EndPaint(hwnd,&ps);  
        break;  
    case WM_LBUTTONDOWN:  
        MessageBox(hwnd,"Mouse clicked","Maturn",MB_OK);  
        break;  
    case WM_CHAR:  
        char c_size[10];  
        //sprintf(c_size,"char is %d",lParam);  
        sprintf(c_size,"char is %d",wParam);  
        MessageBox(hwnd,c_size,"Maturn",MB_OK);  
        break;  
    case WM_CLOSE:  
        //if(IDNO==MessageBox(hwnd,"Do You Want to Quit?(y/n)","Maturn",MB_YESNO))  
        if(IDYES==MessageBox(hwnd,"Do You Want to Quit?(Y/N)","Maturn",MB_YESNO))  
        {  
            DestroyWindow(hwnd);  
        }  
        break;  
    case WM_DESTROY:  
        PostQuitMessage(0);  
        break;  
    default:  
        return DefWindowProc(hwnd,uMsg,wParam,lParam);  
    }  
    return 0;  




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/maturn/archive/2010/02/10/5305655.aspx

猜你喜欢

转载自vvsongsunny.iteye.com/blog/830404
今日推荐