Windows程序内部运行机制

第一次写技术博客,看完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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值