[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);
}
原创学习随笔心得,请勿转载!
原文地址:https://www.cnblogs.com/hanhandaren/p/10957659.html