• [2]窗口程序的创建


    一,创建一个新的Win32项目,将自带的代码去除,只留下一个入口函数

     1 #include "stdafx.h"
     2 #include "Win32Project1.h"

    13 int APIENTRY wWinMain(_In_ HINSTANCE hInstance, //实例句柄 14 _In_opt_ HINSTANCE hPrevInstance,//NULL 15 _In_ LPWSTR lpCmdLine,//命令行 启动参数   16 _In_ int nCmdShow)//显示方式 17 { 18 19 return (int) 0; 20 }                     
     1 WNDCLASS MyMnd = { 0 };
     2     MyMnd.lpszClassName = TEXT("MyMnd");
     3     MyMnd.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
     4     MyMnd.lpfnWndProc = WindowProc;
     5     MyMnd.hInstance = hInstance;  //     calsswnd     分三类 系统类、全局窗口类、局部窗口类,区别每块相同名字的DLL 就是看他的实例句柄
     6                                                                         
     7     RegisterClass(&MyMnd); //注册窗口信息到系统
     8 
     9     HWND hwindow =  CreateWindow(TEXT("MyMnd"), TEXT("Han"), WS_OVERLAPPEDWINDOW,0,0,500,100,NULL,NULL, hInstance,NULL);
    10     ShowWindow(hwindow, nCmdShow);
    11     UpdateWindow(hwindow);//立刻更新窗口
    12 
    13     MSG msg = { 0 };
    14     while (GetMessage(&msg,0,0,0))
    15     {
    16         TranslateMessage(&msg);
    17         DispatchMessage(&msg);
    18     }
    19 
    20     return (int) 0;

    WindowProc()函数
    Windows程序最主要的两个函数除了WinMain()函数外还有一个叫消息处理函数即
    WindowProc()函数 ,它的作用是等候事件发生的消息,具体说就是:什么键按下了?
    或定时器的消息是否发生了?然后再决定去执行哪个程序块。 

                 WindowProc()函数
    WindowProc()函数的基本形式(即原型prototype)是:

    LRESULT CALLBACK WindowProc ( HWND hWnd, UINT message,
                                    WPARAM wParam, LParam);

    返回类型是LRESULT,是由Windows所定义的数据类型,通常相当于 long 型。
    因为此函数被Windows调用是通过指针进行的(你在WinMain()中的WNDCLASSEX结构设定
    的指针),你必须证实函数为CALLBACK. 这是另一个由Windows所定义的说明符,它决定
    了函数的参数如何处理。4个参数的传递提供了引起函数被调用的具体消息的情况。每个
    参数的意义如下:
    HWND hWnd : 事件引起消息发生的那个窗口。
    UINT message: 消息的ID,它是32位值,指明了消息类型。
    WPARAM wParam : 32位值,包含附加信息,决定于消息的种类。例如键盘的哪个键代码。
    LPARAM lParam: 32位值,同上。例如,前16位=重复数
                                          接着8位:扫描码(决定于厂家)
                                          第24位:为1时表示扩展键。
                                          第25到28位:保留区
                                          第29位为1时=alt按下,否则为0。
                                          第30位为1时=消息前按下,否则为0。
                                          第31位为1时=正在被释放,否则为0。

    当用户按下一个键时。那是什么键,由这最后两个变量来说明。
    消息的符号常数以WM_开头,例如WM_PAINT,相应于要求窗口的用户区部分重绘。又如
    WM_LBUTTONDOWN表示鼠标左键被按下。可参考MSDN Library.
    除了上述函数原型之外,还有Windows消息解码用的switch语句,其中又有case语句,
    绘制窗口消息的响应及其结束,关闭应用程序等处理过程。这样才构成完整的WindowProc()
    函数。


    注意 窗口基本完成后需要用到注册项将窗口信息进行注册。

    RegisterClass(&MyMnd);


    如果发生退出子程序,获取窗口队列不退出程序的情况:

    while (GetMessage(&msg,hwnd,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    在获取窗口消息的时候,退出调用了PostQuitMessage(0);//退出子程序窗口

    就会出现获取消息循环结束不了,返回不了为0 的情况。

    这样我们可以把GetMessage(&msg,hwnd,0,0)第二个参数置为0;

    GetMessage(&msg,0,0,0)


    如果需要创建全局窗口类,那么只需要在局部窗口类中加一个风格定义即可:

    MyMnd.style = CS_GLOBALCLASS;

    创建窗口先查找局部窗口类,如果没找到则找全局窗口类,如果还没找到则找系统表,如果三个都没找到则返回创建失败!

    加入UpdateWindow(hwindow);//立刻更新窗口 主要目的是提高消息处理的优先级;

    下面是本课的全部代码

    // Win32Project1.cpp : 定义应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "Win32Project1.h"
    
    LRESULT CALLBACK WindowProc(
        _In_ HWND   hwnd,
        _In_ UINT   uMsg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam
    );
    
    
    
    
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                         _In_opt_ HINSTANCE hPrevInstance,
                         _In_ LPWSTR    lpCmdLine,
                         _In_ int       nCmdShow)
    {
        WNDCLASS MyMnd = { 0 };
        MyMnd.lpszClassName = TEXT("MyMnd");
        MyMnd.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
        MyMnd.lpfnWndProc = WindowProc;
        MyMnd.hInstance = hInstance;  //     calsswnd     分三类 系统类、全局窗口类、局部窗口类,区别每块相同名字的DLL 就是看他的实例句柄
                                                                            
        RegisterClass(&MyMnd); //注册窗口信息到系统
    
        HWND hwindow =  CreateWindow(TEXT("MyMnd"), TEXT("Han"), WS_OVERLAPPEDWINDOW,0,0,500,100,NULL,NULL, hInstance,NULL);
        ShowWindow(hwindow, nCmdShow);
        UpdateWindow(hwindow);//立刻更新窗口
    
        MSG msg = { 0 };
        while (GetMessage(&msg,0,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return (int) 0;
    }
    
    
    
    LRESULT CALLBACK WindowProc(
        _In_ HWND   hwnd,
        _In_ UINT   uMsg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam
    )
    {
        switch (uMsg)
        {
        case WM_CLOSE:
            PostQuitMessage(0);//退出子程序窗口
            break;
        case WM_CREATE:
            break;
    
        }
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    原创学习随笔心得,请勿转载!
  • 相关阅读:
    VC++ 调用C# dll 回调函数,实现MQTT协议客户端通信
    如何正确获取ADO连接MySql的连接字符串(转载)
    SQL 操作
    MFC如何添加背景图片(转载)
    MFC CFont 要释放的资源总结
    MFC控件 Edit,控制只能输入数字和小数点
    VC MFC 获取 IP地址和MAC地址程序
    MFC CString 转 CTime
    vc mfc 写excel文件,包括数据和图表
    ADO方式操作access数据库
  • 原文地址:https://www.cnblogs.com/hanhandaren/p/10957659.html
Copyright © 2020-2023  润新知