问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

如何用C语言制作窗口小程序

创作时间:
作者:
@小白创作中心

如何用C语言制作窗口小程序

引用
1
来源
1.
https://docs.pingcode.com/baike/1294030

本文将详细介绍如何使用C语言制作Windows窗口小程序。通过学习创建窗口类、注册窗口类、创建窗口和消息循环等基本步骤,你将能够掌握使用Windows API开发图形用户界面(GUI)应用程序的核心技能。

一、创建窗口类

在Windows编程中,窗口类用于定义窗口的属性和行为。我们需要定义一个WNDCLASS结构体并填写其成员,然后调用RegisterClass函数来注册这个窗口类。

#include <windows.h>

// 窗口过程函数的声明
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // 1. 定义并设置窗口类
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance;    // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名称

    // 2. 注册窗口类
    if (!RegisterClass(&wc)) {
        return -1;
    }

    // 3. 创建窗口
    HWND hwnd = CreateWindowEx(
        0,
        "MyWindowClass",       // 窗口类名称
        "My Window",           // 窗口标题
        WS_OVERLAPPEDWINDOW,   // 窗口样式
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL
    );
    if (hwnd == NULL) {
        return -1;
    }
    ShowWindow(hwnd, nCmdShow);

    // 4. 消息循环
    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

// 窗口过程函数的实现
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

二、注册窗口类

注册窗口类是制作窗口小程序的第二步。通过调用RegisterClass函数,我们告诉Windows操作系统如何创建和管理我们的窗口类。

1、窗口过程函数

窗口过程函数是处理窗口消息的核心函数。每当窗口接收到消息时,系统都会调用这个函数。窗口过程函数的原型如下:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

在我们的示例代码中,WindowProc函数处理了WM_DESTROY消息,这个消息在窗口被销毁时发送。当我们接收到WM_DESTROY消息时,调用PostQuitMessage(0)函数来退出消息循环。

三、创建窗口

创建窗口是制作窗口小程序的第三步。通过调用CreateWindowEx函数,我们可以创建一个窗口实例。

HWND hwnd = CreateWindowEx(
    0,
    "MyWindowClass",       // 窗口类名称
    "My Window",           // 窗口标题
    WS_OVERLAPPEDWINDOW,   // 窗口样式
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL
);

CreateWindowEx函数的参数定义了窗口的属性,包括窗口类名称、窗口标题、窗口样式、初始位置和大小等。如果窗口创建失败,函数会返回NULL

四、消息循环

消息循环是制作窗口小程序的最后一步。通过调用GetMessageTranslateMessageDispatchMessage函数,我们可以处理来自操作系统的消息。

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

GetMessage函数从消息队列中检索消息,TranslateMessage函数将虚拟键消息转换为字符消息,DispatchMessage函数将消息分发到窗口过程函数进行处理。

五、深入了解Windows API

Windows API包含大量函数和结构体,可以帮助我们实现更复杂的窗口小程序。以下是一些常用的Windows API函数和结构体:

1、窗口样式

窗口样式定义了窗口的外观和行为。常用的窗口样式包括:

  • WS_OVERLAPPEDWINDOW:创建一个重叠窗口,具有标题栏、边框、系统菜单、最小化按钮和最大化按钮。
  • WS_POPUP:创建一个弹出窗口。
  • WS_CHILD:创建一个子窗口。

2、窗口消息

窗口消息是Windows操作系统与应用程序之间的通信机制。常用的窗口消息包括:

  • WM_CREATE:窗口创建消息。
  • WM_PAINT:窗口重绘消息。
  • WM_CLOSE:窗口关闭消息。
  • WM_DESTROY:窗口销毁消息。

3、GDI(图形设备接口)

GDI是Windows操作系统的图形子系统,用于绘制图形和文本。常用的GDI函数包括:

  • BeginPaint:开始绘制。
  • EndPaint:结束绘制。
  • TextOut:绘制文本。
  • Rectangle:绘制矩形。

六、示例:绘制简单的图形

下面的示例代码展示了如何在窗口中绘制简单的图形。

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = "MyWindowClass";
    if (!RegisterClass(&wc)) {
        return -1;
    }

    HWND hwnd = CreateWindowEx(
        0,
        "MyWindowClass",
        "My Window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL
    );
    if (hwnd == NULL) {
        return -1;
    }
    ShowWindow(hwnd, nCmdShow);

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

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_PAINT: {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            // 绘制矩形
            Rectangle(hdc, 50, 50, 200, 200);
            // 绘制文本
            TextOut(hdc, 60, 60, "Hello, World!", 13);
            EndPaint(hwnd, &ps);
            return 0;
        }
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

在这个示例中,我们在WM_PAINT消息的处理过程中使用BeginPaintEndPaint函数来绘制图形。Rectangle函数用于绘制矩形,TextOut函数用于绘制文本。

七、总结

本文详细介绍了如何使用C语言制作窗口小程序,包括创建窗口类、注册窗口类、创建窗口和消息循环等步骤。通过示例代码,我们展示了如何绘制简单的图形和文本。使用Windows API可以实现更复杂的窗口小程序,同时建议使用项目管理系统来提高开发效率和项目管理水平。

希望本文能为您提供有价值的参考,帮助您更好地掌握C语言窗口小程序的开发技巧。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号