Windows程序内部运行机制

来源:互联网 发布:数据配线架价格 编辑:程序博客网 时间:2024/05/09 09:15

第一次写技术博客,看完C++ Primer Plus,认识不足,没能把自己的所获所感写出来,想想,其实,现在对于我这个刚学的菜鸟来说,也不晚。

买的书没到,看了《深入学习c++》前两章,照书中动手敲了一个Windows程序。

创建一个Win32应用程序的步骤:
1,、编写WinMain函数。
2、设计窗口类(WNDCLASS)。
3、注册窗口类。
4、创建窗口。
5、显示并更新窗口。
6、编写消息循环。
7、编写窗口过程函数。

 

#include <windows.h>             //(1)#include <stdio.h>LRESULT CALLBACK WinSunProc(    HWND hwnd,    UINT uMsg,    WPARAM wParam,    LPARAM lParam);                         int WINAPI WinMain(    HINSTANCE hInstance,    HINSTANCE hPrevInstance,    LPSTR lpCmdLine,    int nCmdShow)                         //(2){    //“设计一个窗口”    WNDCLASS wndcls;          //WNDCLASS结构体,定义窗口特征(有以下十个参数)    wndcls.cbClsExtra=0;      //一般设为0    wndcls.cbWndExtra=0;        //一般设为0    wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);      //窗口类的背景画刷句柄    wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);      //窗口类的光标句柄    wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);          //窗口类的图标句柄    wndcls.hInstance=hInstance;           //指定包含窗口过程的程序的实例句柄    wndcls.lpfnWndProc=WinSunProc;           //函数指针,指向窗口过程函数    wndcls.lpszClassName="sunxin2006";         //窗口类的名字    wndcls.lpszMenuName=NULL;          //指定菜单资源名字    wndcls.style=CS_HREDRAW | CS_VREDRAW;             //(3)    RegisterClass(&wndcls);               //注册窗口类        //“创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄”    HWND hwnd;    hwnd=CreateWindow("sunxin2006","http://www.sunxin.org",            WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);      //(4)        //“显示及刷新窗口”    ShowWindow(hwnd,SW_SHOWNORMAL);                  //(5)    UpdateWindow(hwnd);                           //调用UpdateWindows来刷新窗口        //“定义消息结构体,开始消息循环”                      MSG msg;    while(GetMessage(&msg,NULL,0,0))             //(6)    {        TranslateMessage(&msg);                //将虚拟键消息转换为字符消息        DispatchMessage(&msg);                 //将消息回传给操作系统    }    return msg.wParam;}     //“编写窗口过程函数”LRESULT CALLBACK WinSunProc(    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",0);           //弹出一个消息框        break;    case WM_LBUTTONDOWN:        MessageBox(hwnd,"mouse clicked","message",0);        HDC hdc;        hdc=GetDC(hwnd);       //不能响应VM_PALNT消息时调用        TextOut(hdc,0,50,"程序员之家",strlen("程序员之家"));        //ReleaseDC(hwnd,hdc);        break;    case WM_PAINT:        HDC hDC;        PAINTSTRUCT ps;        hDC=BeginPaint(hwnd,&ps);     //BeginPaint 只能在响应WM_PAINT消息时调用        TextOut(hDC,0,0,"http://www.sunxin.org",strlen("http://www.sunxin.org"));        EndPaint(hwnd,&ps);        break;    case WM_CLOSE:        if(IDYES==MessageBox(hwnd,"是否真的结束?","message",MB_YESNO))        {            DestroyWindow(hwnd);        }        break;    case WM_DESTROY:        PostQuitMessage(0);        break;    default:        return DefWindowProc(hwnd,uMsg,wParam,lParam);    //调用默认的窗口过程    }    return 0;}

解析:

(1)http://baike.baidu.com/view/1586331.htm?fr=aladdin

(2)Windows程序的入口点函数,与DOS程序的入口点函数main的作用相同。WinMain函数接收4个参数:

hInstance表示该程序当前运行实例的句柄。那么,什么是句柄呢?句柄就是Windows程序中资源的标识号,这些资源主要是窗口、图标、光标等,简单来说就是这些资源的标记符,例如,窗口是通过窗口句柄(HWND)来标识的。hInstance是一个数值,运行实例后分配得到的值就是通过该参数传递给WinMain函数的。

hPrevInstance表示当前实例的前一个实例的句柄。在Win32环境下,该参数总是NILL。

lpCmdLine指定传递给应用程序的命令行参数。他是一个一空终止的字符串。

nCmdShow指定程序的窗口应如何显示。

(3)指定窗口的样式。常用的样式有:

CS_HREDRAW功能~当窗口水平方向的宽度发生变化时,将重新绘制整个窗口。

CS_VREDRAW功能~当窗口垂直方向的高度发生变化时,将重新绘制整个窗口。

CS_NOCLOSE功能~禁用系统菜单的Close命令,这将导致窗口没有关闭按钮。

CS_DBLCLKS当用户在窗口中双击鼠标时,向窗口过程发送鼠标双击信息。

(4)创建窗口函数。

HWND CreateWindow(
LPCTSTR lpClassName,            //指定窗口类的名称
LPCTSTR lpWindowName,        //指定窗口的名字
DWORD dwStyle,                //指定创建的窗口样式。其中WS_OVERLAPPEDWINDOW十多种窗口类型的组合
int x,              //窗口左上角的x坐标
int y,              //窗口左上角的y坐标
int nWidth,            //窗口宽度
int nHeight,           //窗口高度
HWND hWndParent,            //指定被创建窗口的父窗口句柄
HMENU hMenu,               //指定窗口菜单的句柄
HANDLE hlnstance,             //指定窗口所属的应用程序实例的句柄
LPVOID lpParam);           //作为VM_CREATE消息的附加参数lParam传入的数据指针,一般设为NULL
 
(5)BOOL ShowWindow(HWND hWnd, int nCmdShow);
第一个参数hWnd就是在上一步骤中成功创建窗口后返回的窗口句柄。
第二个参数nCmdShow指定了窗口显示的状态,常用有:
SW_HIDE~隐藏窗口并激活其他窗口。
SW_SHOW~在窗口原来的位置以原来的尺寸激活和显示窗口。
SW_SHOWMAXIMIZED~激活窗口并将其最大化显示。
SW_SHOWMINNIZED~激活窗口并将其最小化显示。
SW_SHOWNORMAL~激活并显示窗口。

(6)BOOL GetMessage(
LPMSG lpMsg, HWND hWnd, UNIT wMsgFilterMin, UNIT wMsgFilterMax);
lpMsg指向一个消息(MSG)的结构体。
hWnd指定接收属于哪一个窗口的消息。
wMsgFilterMin指定要获得的消息的最小值。通常设为0。
wMsgFilterMax指定要获取消息的最大值。如果wMsgFilterMin与wMsgFilterMax都为0,则表示接收所有消息。
 
结果很简单,就是一个简单的窗口。
 
其实可以举个生动的比喻。操作系统就好比汽车用户,应用程序就是比汽车厂家,窗口就是汽车,回调函数就是修理站,窗口收到消息就是表示出现了故障,等等。



 

 

 

 

 

0 0