返回

剖析 Windows Hello World:纵览 Windows 的编程史

前端

Windows 编程的演化:从 Win32 API 到 Project Reunion

Windows 编程之路:你好世界程序

在 Windows 编程的浩瀚世界里,"你好世界"程序就像是一场入门之旅,引导着程序员们探索这门博大精深的语言艺术。从最初的 Win32 API 到如今的 Project Reunion,"你好世界"程序一直扮演着见证者和参与者的双重角色,记录着 Windows 编程的跌宕起伏。

Win32 API:底层世界的敲门砖

Win32 API,如同 Windows 编程的基石,提供了通往系统底层的通道。在 Win32 API 的世界里,"你好世界"程序需要一步步建立窗口、处理消息、绘制图形,用最原始的方式与 Windows 系统对话。

.NET:面向对象的进化

.NET 的出现,为 Windows 编程带来了面向对象的革命。它提供了一个丰富的类库和更高层次的编程语言,让开发者们能够以更便捷的方式构建 Windows 程序,不再需要陷入底层的繁复操作之中。

WPF:图形界面大师

WPF(Windows Presentation Foundation)是一个图形编程框架,它赋予了开发者创造美观而富有表现力的用户界面的能力。WPF 建立在 .NET 之上,让开发者们能够专注于应用程序的业务逻辑,而无需为复杂的图形渲染而烦恼。

Modern Apps:跨设备的桥梁

Modern Apps,诞生于 Windows 8 时代,开辟了跨设备编程的全新领域。Modern Apps 应用程序可以在 PC、平板电脑和手机等多种设备上无缝运行,让开发者们能够触达更广阔的用户群体。

UWP:统一 Windows 体验

UWP(通用 Windows 平台)是 Windows 10 中的明星,它为应用程序提供了在所有 Windows 10 设备上运行的统一基础。UWP 应用程序可以轻松适应不同设备的屏幕尺寸和输入方式,带来无缝的跨平台体验。

Project Reunion:融合与统一

Project Reunion,是 Microsoft 最新推出的应用程序平台,它将 Win32 API、.NET、WPF、Modern Apps 和 UWP 等技术融为一体。Project Reunion 为开发者们提供了相同的代码库,让他们能够轻松构建适用于 Windows 10 和 Windows 11 的应用程序。

代码示例:Hello World 演变

// Win32 API
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (msg == WM_PAINT) {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        TextOut(hdc, 100, 100, "Hello, World!", 12);
        EndPaint(hwnd, &ps);
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "WindowClass";
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&wc))
        return 0;

    HWND hwnd = CreateWindowEx(0, "WindowClass", "Hello, World!", WS_OVERLAPPEDWINDOW,
                                CW_USEDEFAULT, CW_USEDEFAULT, 256, 192, NULL, NULL, hInstance, NULL);

    if (hwnd == NULL)
        return 0;

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

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

    return msg.wParam;
}
// .NET
using System.Windows;

namespace HelloWorld
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}
<!-- WPF -->
<Window x:Class="HelloWorld.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Hello, World!" Height="350" Width="525">
    <TextBlock Text="Hello, World!" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="36" />
</Window>
// Modern Apps
#include <wrl.h>
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.Window.h>

using namespace winrt;

int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    init_apartment();

    auto window = Window();
    auto textBlock = TextBlock();
    textBlock.Text(L"Hello, World!");
    window.Content(textBlock);
    window.Activate();

    MessageQueue::Run();

    return 0;
}
// UWP
#include <wrl.h>
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.Window.h>
#include <winrt/Windows.Foundation.h>

using namespace winrt;

int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    init_apartment();

    auto window = Window();
    auto textBlock = TextBlock();
    textBlock.Text(L"Hello, World!");
    window.Content(textBlock);
    window.Activate();

    CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    auto dispatcherQueue = DispatcherQueue();
    while (DispatcherQueue::GetForCurrentThread() == nullptr)
        dispatcherQueue.Create();
    CoUninitialize();

    MessageQueue::Run(dispatcherQueue);

    return 0;
}

结论

"你好世界"程序,作为 Windows 编程的起点,见证了从底层到高层、从单一平台到跨平台的演进。它不仅是一段简单的代码,更是一扇通往 Windows 编程广阔世界的门扉,引导着开发者们不断探索和创新。

常见问题解答

  1. Windows 编程的未来是什么?
    答:Project Reunion 的出现预示着 Windows 编程的未来是更加统一和集成的,开发者们将能够使用相同的代码库构建适用于所有 Windows 平台的应用程序。

  2. UWP 是否已过时?
    答:虽然 Project Reunion 将 Win32 API、.NET、WPF、Modern Apps 和 UWP 等技术融为一体,但 UWP 仍然是适用于跨平台开发的强大平台,特别是在需要访问 Windows 独有特性和 API 的情况下。

  3. 哪种 Windows 编程技术最适合我?
    答:选择最适合您的 Windows 编程技术取决于您的具体需求和目标平台。如果您需要访问 Windows 系统底层,那么 Win32 API 是最佳选择;如果您更喜欢面向对象的编程,那么 .NET 是一个不错的选择;如果您需要创建跨设备的应用程序,那么 Modern Apps 和 UWP 是理想的平台。

  4. Project Reunion 是否支持所有现有的 Windows 应用程序?
    答:Project Reunion 旨在支持所有现有的 Windows 应用程序,并提供一个无缝的迁移路径,允许开发者将旧应用程序移植到新的平台。

  5. Windows 编程是否困难?
    答:Windows 编程可以具有挑战性,但它也是一种有益和令人着迷的体验。通过学习不同的技术和框架,并利用丰富的社区支持和资源,任何人都可以掌握 Windows 编程的艺术。