目前共有4篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:不轉換▼
 
點擊 回復
360 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)
 

本帖信息

點擊數:360 回複數:3
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-1-4 14:40
 
©2010-2025 Purasbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。