码迷,mamicode.com
首页 > Windows程序 > 详细

windows编程小记

时间:2016-05-12 15:18:43      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

最近学习了windows编程,以防忘记,特意来做一下小小的总结,走起!!!
    这篇文章主要说两件事:windows消息机制概括,窗口建立过程。
  1. windows消息机制概括
    首先上图:
    技术分享
    这个图摘自读过的一篇CSDN博客,感谢作者,一会会把地址告知大家。
    在此图中:

         1,数字1箭头:  表示windows(os)将消息传递到进程的消息队列中
         2,数字2箭头:  表示进程通过消息循环在消息队列中读取消息
         3,数字3箭头:  表示进程的消息循环将读取到的消息告诉给windows(os)
         4,数字4箭头:  表示windows(os)通过进程传递的消息来调用进程绑定的回调函数(WndProc),根据回调函数,来确定是否做出响应.
    

    现在是不是明白了很多呢?

  2. 窗口建立过程
    我们先看一段程序,摘自P先生(Charles Petzold)的第一个例子(HelloWin.c)。

#include<windows.h>  

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//回调函数声明  

int WINAPI WinMain(HINSTANCE hInstance,     // 进程句柄  
    HINSTANCE hPrevInstance, // 上一个进程句柄  
    PSTR szCmdLine,          // // 命令行参数 
    int iCmdShow)            // 窗口显示状态  
{
    static  TCHAR   szAppName[] = TEXT("HelloWin"); //以‘\0‘字符结尾的字符串 , 这里是程序的名称(实际用作后面的窗口类的名字)  
    HWND            hwnd;                           //窗口句柄  
    MSG             msg;                            //消息结构体  
    WNDCLASS        wndclass;                       //窗口类  

    wndclass.style = CS_HREDRAW | CS_VREDRAW;              //窗口类的风格  
    wndclass.lpfnWndProc = WndProc;                              //窗口类绑定的回调函数(也称为窗口过程)  
    wndclass.cbClsExtra = 0;                                    //窗口类额外参数(默认为0)  
    wndclass.cbWndExtra = 0;//窗口类额外参数(默认为0)   
    wndclass.hInstance = hInstance;                            //进程句柄 
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);      //加载程序图标  
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);          //加载光标  
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  //背景刷  
    wndclass.lpszMenuName = NULL;                                 //菜单名指针  
    wndclass.lpszClassName = szAppName;                            //窗口类的名字  

    if (!RegisterClass(&wndclass))//注册窗口类  
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),
            szAppName, MB_ICONERROR);
        return 0;
    }

    //这里创建的是一段内存 , 用于存储创建窗口的信息 , 同时返回该窗口的一个句柄(窗口的标示)  
    hwnd = CreateWindow(szAppName,                  //窗口类的名字  
        TEXT("The Hello Program"),  //窗口名称(标题栏显示的内容)  
        WS_OVERLAPPEDWINDOW,        //窗口的风格  
        CW_USEDEFAULT,              //窗口x坐标  
        CW_USEDEFAULT,              //窗口y坐标  
        CW_USEDEFAULT,              //窗口宽度  
        CW_USEDEFAULT,              //窗口长度  
        NULL,                       //父窗口句柄  
        NULL,                       //菜单句柄  
        hInstance,                  //进程句柄 
        NULL);                      //窗口创建数据  

                                    /* 程序运行完CreateWindow , 还没运行ShowWindow时 ,
                                    windows向窗口的WndProc发送了第一条消息: WM_Create */
    ShowWindow(hwnd, iCmdShow); //显示窗口  
    UpdateWindow(hwnd);         //更新窗口  
                                /* 运行完UpdateWindow后 , windows向窗口的WndProc
                                发送了第二条消息: WM_PAINT . 如果ShowWindow没有调用或是调用失败 , WM_PAINT消息是不会发送的*/

                                //消息循环  
    while (GetMessage(&msg, NULL, 0, 0))//这里的NULL不能写成hwnd , 否则程序不能正常运行  
    {
        TranslateMessage(&msg);//转换键盘消息  
        DispatchMessage(&msg);//将消息传送给windows(os) , 由windows来回调  
    }
    return msg.wParam;//结束返回  
}

//窗口过程(回调函数)  
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC         hdc;    //设备句柄  
    PAINTSTRUCT ps;     //包含窗口客户区绘制的信息  是一个结构体  
    RECT        rect;   //矩形(两个点)  

                        //这里是消息处理  
    switch (message)
    {
        //窗口创建消息  
    case WM_CREATE:  
        return 0;
        //窗口客户区重绘消息  
    case WM_PAINT:  
        hdc = BeginPaint(hwnd, &ps);//获取设备句柄 , 开始重绘(WM_PAINT中专用,其他时候用GetDC())  

        GetClientRect(hwnd, &rect);//获取客户区的大小  

        DrawText(hdc, TEXT("Hello, Windows 10!"), -1, &rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER);//绘制一个字符串  
        EndPaint(hwnd, &ps);//结束重绘 (WM_PAINT中专用,其他时候用ReleaseDC())   
        return 0;
        //窗口退出消息  
    case WM_DESTROY:
        PostQuitMessage(0);//发送退出消息  
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
    //windows对于消息的默认处理  
    //(注意: 第三个和第四个参数不能传递错误!!!)  
}

想必下次再看的时候应该能较快的回忆起来了吧,嘿嘿。
参考:http://blog.csdn.net/crocodile__/article/details/9417439

windows编程小记

标签:

原文地址:http://blog.csdn.net/hzwcfy/article/details/51360333

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!