目前共有4篇帖子。 内容转换:不转换▼
 
点击 回复
249 3
【代码】C++编写的最基本的Win32窗口程序
一派护法 十九级
1楼 发表于:2015-12-4 22:47
【运行结果】


【头文件 Main.h】
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
LRESULT CALLBACK WndProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

【源文件 Main.c】
#include <Windows.h>
#include "Main.h"

LPCTSTR ClsName = L"BasicApp";
LPCTSTR WndName = L"A Simple Window";

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG Msg;
    HWND hWnd;
    WNDCLASSEX WndClsEx;
   
    // Create the application window
    WndClsEx.cbSize = sizeof(WNDCLASSEX);
    WndClsEx.style = CS_HREDRAW | CS_VREDRAW;
    WndClsEx.lpfnWndProc = WndProcedure;
    WndClsEx.cbClsExtra = 0;
    WndClsEx.cbWndExtra = 0;
    WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClsEx.lpszMenuName = NULL;
    WndClsEx.lpszClassName = ClsName;
    WndClsEx.hInstance = hInstance;
    WndClsEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    // Register the application
    RegisterClassEx(&WndClsEx);

    // Create the window object
    hWnd = CreateWindow(ClsName, WndName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    // Find out if the window was created
    if (!hWnd) // If the window was not created
        return 0; // stop the application

    // Display the window to the user
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    // Decode and treat the messages
    // as long as the application is running
    while (GetMessage(&Msg, NULL, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return Msg.wParam;
}

LRESULT CALLBACK WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case WM_DESTROY:
        // If the user wants to close the application
        // then close it
        PostQuitMessage(WM_QUIT);
        break;
    default:
        // Process the left-over messages
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
    // If something was not done, let it go
    return 0;
}
一派护法 十九级
2楼 发表于:2015-12-4 22:48
一派护法 十九级
3楼 发表于:2016-1-4 14:30
整个流程简单概括如下:
第一步:创建窗口类,其中包含hInstance和ClsName
第二步:注册窗口类
第三步:用ClsName创建窗口
第四步:显示窗口并首次绘制窗口内容
然后就是消息循环,在消息循环中让系统不停地调用WndProcedure(这个函数是在窗口类中指定的)来处理Windows消息。消息循环结束后,退出程序,将Msg.wParam作为返回值返回给操作系统。

我们在调用CreateWindow创建窗口时,提供的参数是窗口类的名称字符串,而不是窗口类结构体本身。这就是为什么我们要向操作系统注册窗口类的原因。
一派护法 十九级
4楼 发表于:2016-1-4 14:40
另外,当应用程序收到WM_DESTROY消息时,窗口已经被关闭了。执行PostQuitMessage(WM_QUIT)这句话只是为了退出消息循环而已。在Visual Studio中创建的Win32程序中,这句话是这样写的:PostQuitMessage(0),括号中就是想要在程序退出时return语句返回给操作系统的值(Msg.wParam)。

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:249 回复数:3
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-1-4 14:40
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。