在 Dev-C++中编译运行GUI 程序介绍(三)有趣示例一组

news2025/4/19 4:20:26

在 Dev-C++中编译运行GUI程序介绍(三)有趣示例一组

前期见
在 Dev-C++中编译运行GUI 程序介绍(一)基础 https://blog.csdn.net/cnds123/article/details/147019078

在 Dev-C++中编译运行GUI 程序介绍(二)示例:祝福程序 https://blog.csdn.net/cnds123/article/details/147019350

本文给出一组可以在 Dev-C++中编译运行的GUI 应用程序。

示例2、简单的猜数字游戏

下面是一个简单的猜数字游戏源码,您可以在 Dev-C++ 中编译和运行它。这个程序创建了一个基本的 GUI 界面,用户可以通过输入数字来进行猜测,程序会提示用户猜的数字是太高、太低还是猜对了。并有猜中计数和“重玩”按钮功能。

运行效果:

源码如下:

#include <windows.h>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

// 全局变量
HWND hwndInput, hwndButton, hwndOutput, hwndCountLabel;
int randomNumber;
int guessCount = 0; // 猜中计数

// 生成随机数
void generateRandomNumber() {
    randomNumber = rand() % 100 + 1; // 生成 1 到 100 之间的随机数
    guessCount = 0; // 重置猜中计数
}

// 消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_CREATE: {
        // 创建说明标签
        CreateWindow("STATIC", "请输入1到100之间的数字:", WS_CHILD | WS_VISIBLE,
                     50, 20, 200, 25, hwnd, NULL, NULL, NULL);

        // 创建输入框
        hwndInput = CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER,
                                  50, 50, 100, 25, hwnd, NULL, NULL, NULL);

        // 创建猜测按钮
        hwndButton = CreateWindow("BUTTON", "猜测", WS_CHILD | WS_VISIBLE,
                                   50, 100, 100, 30, hwnd, (HMENU)1, NULL, NULL);

        // 创建重玩按钮
        CreateWindow("BUTTON", "重玩", WS_CHILD | WS_VISIBLE,
                     160, 100, 100, 30, hwnd, (HMENU)2, NULL, NULL);

        // 创建输出框
        hwndOutput = CreateWindow("STATIC", "", WS_CHILD | WS_VISIBLE,
                                   50, 150, 200, 25, hwnd, NULL, NULL, NULL);
        
        // 创建猜中计数标签
        hwndCountLabel = CreateWindow("STATIC", "猜测次数: 0", WS_CHILD | WS_VISIBLE,
                                       50, 180, 200, 25, hwnd, NULL, NULL, NULL);

        generateRandomNumber(); // 生成第一个随机数

        // 设置光标焦点到输入框
        SetFocus(hwndInput);
        break;
    }
    case WM_COMMAND: {
        if (LOWORD(wParam) == 1) { // 按钮被点击
            char buffer[10];
            GetWindowText(hwndInput, buffer, sizeof(buffer)); // 获取输入的文本
            int guess = atoi(buffer); // 将字符串转换为整数

            // 进行猜测判断
            string message;
            guessCount++; // 增加猜测次数
            if (guess < randomNumber) {
                message = "太低了!";
            } else if (guess > randomNumber) {
                message = "太高了!";
            } else {
                message = "恭喜你,猜对了!";
                // 不重置猜测次数,直到用户选择“重玩”
            }

            // 更新输出框和猜中计数标签
            SetWindowText(hwndOutput, message.c_str());
            SetWindowText(hwndCountLabel, ("猜测次数: " + to_string(guessCount)).c_str());

            // 设置光标焦点到输入框
            SetFocus(hwndInput);
        }
        else if (LOWORD(wParam) == 2) { // 重玩按钮被点击
            generateRandomNumber(); // 生成新的随机数
            SetWindowText(hwndOutput, ""); // 清空输出框
            SetWindowText(hwndCountLabel, "猜测次数: 0"); // 重置猜中计数
            SetWindowText(hwndInput, ""); // 清空输入框
            SetFocus(hwndInput); // 设置光标焦点到输入框
        }
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    srand(static_cast<unsigned int>(time(0))); // 设置随机种子

    // 注册窗口类
    const char CLASS_NAME[] = "GuessNumberWindow";
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(0, CLASS_NAME, "猜数字游戏", WS_OVERLAPPEDWINDOW,
                               CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, NULL, NULL, hInstance, NULL);

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

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

    return 0;
}

示例3、剪子、包袱、锤游戏

剪子、包袱、锤(又称石头剪刀布)游戏规则

胜负关系:

剪子 胜 包袱(剪刀剪开布)。

包袱 胜 锤(布包裹石头)。

锤 胜 剪子(石头砸坏剪刀)。

手势相同:平局,重新对决。

界面如下

源码如下:

//剪子、包袱、锤游戏
#include <windows.h>
#include <string>
#include <cstdlib>
#include <ctime>
#include <sstream>

using namespace std;

// 全局变量
HWND hwndOutput, hwndComputerChoice;
int computerChoice;

// 生成计算机的选择
void generateComputerChoice() {
    computerChoice = rand() % 3; // 0 = 剪子, 1 = 包袱, 2 = 锤
}

// 消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_CREATE: {
        // 创建剪子按钮
        CreateWindow("BUTTON", "剪子 (X)", WS_CHILD | WS_VISIBLE,
                     50, 50, 100, 30, hwnd, (HMENU)1, NULL, NULL);

        // 创建包袱按钮
        CreateWindow("BUTTON", "包袱 (Q)", WS_CHILD | WS_VISIBLE,
                     50, 100, 100, 30, hwnd, (HMENU)2, NULL, NULL);

        // 创建锤按钮
        CreateWindow("BUTTON", "锤 (P)", WS_CHILD | WS_VISIBLE,
                     50, 150, 100, 30, hwnd, (HMENU)3, NULL, NULL);

        // 创建新局按钮
        CreateWindow("BUTTON", "新局", WS_CHILD | WS_VISIBLE,
                     50, 200, 100, 30, hwnd, (HMENU)4, NULL, NULL);

        // 创建输出框
        hwndOutput = CreateWindow("STATIC", "", WS_CHILD | WS_VISIBLE,
                                   200, 50, 200, 100, hwnd, NULL, NULL, NULL);

        // 创建计算机选择显示框
        hwndComputerChoice = CreateWindow("STATIC", "", WS_CHILD | WS_VISIBLE,
                                           200, 150, 200, 25, hwnd, NULL, NULL, NULL);

        // 设置随机种子
        srand(static_cast<unsigned int>(time(0)));

        break;
    }
    case WM_COMMAND: {
        if (LOWORD(wParam) >= 1 && LOWORD(wParam) <= 3) { // 剪子、包袱或锤按钮被点击
            int userChoice = LOWORD(wParam) - 1; // 0 = 剪子, 1 = 包袱, 2 = 锤
            generateComputerChoice(); // 生成计算机选择

            // 计算机选择对应的输出来显示
            string computerChoiceStr;
            if (computerChoice == 0) computerChoiceStr = "剪子 (X)";
            else if (computerChoice == 1) computerChoiceStr = "包袱 (Q)";
            else if (computerChoice == 2) computerChoiceStr = "锤 (P)";

            // 判断输赢
            string result;
            if (userChoice == computerChoice) {
                result = "平局!";
            } else if ((userChoice == 0 && computerChoice == 1) || 
                       (userChoice == 1 && computerChoice == 2) || 
                       (userChoice == 2 && computerChoice == 0)) {
                result = "你输了!";
            } else {
                result = "你赢了!";
            }

            // 更新输出框和计算机选择框
            SetWindowText(hwndOutput, result.c_str());
            SetWindowText(hwndComputerChoice, ("计算机选择: " + computerChoiceStr).c_str());
        } else if (LOWORD(wParam) == 4) { // 新局按钮被点击
            SetWindowText(hwndOutput, ""); // 清空输出框
            SetWindowText(hwndComputerChoice, ""); // 清空计算机选择框
        }
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // 注册窗口类
    const char CLASS_NAME[] = "RockPaperScissorsWindow";
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(0, CLASS_NAME, "剪子、包袱、锤游戏", WS_OVERLAPPEDWINDOW,
                               CW_USEDEFAULT, CW_USEDEFAULT, 420, 300, NULL, NULL, hInstance, NULL);

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

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

    return 0;
}

示例4、简单计算器

可以在 Dev-C++ 中编译和运行简单计算器(通过计算机键盘输入数)。

界面如下:

代码如下:

#include <windows.h>
#include <string>
#include <sstream>

using namespace std;

// 全局变量
HWND hwndInput1, hwndInput2, hwndOutput, hwndButtonAdd, hwndButtonSub, hwndButtonMul, hwndButtonDiv;

// 计算结果并显示
void Calculate(char operation) {
    char buffer1[100], buffer2[100];
    GetWindowText(hwndInput1, buffer1, sizeof(buffer1)); // 获取第一个输入框的文本
    GetWindowText(hwndInput2, buffer2, sizeof(buffer2)); // 获取第二个输入框的文本

    double num1 = atof(buffer1); // 转换为 double
    double num2 = atof(buffer2); // 转换为 double
    double result = 0.0;

    // 根据操作符进行计算
    switch (operation) {
        case '+': result = num1 + num2; break;
        case '-': result = num1 - num2; break;
        case '*': result = num1 * num2; break;
        case '/':
            if (num2 != 0) {
                result = num1 / num2;
            } else {
                SetWindowText(hwndOutput, "错误:除以零");
                return;
            }
            break;
    }

    // 显示结果
    stringstream ss;
    ss << result;
    SetWindowText(hwndOutput, ss.str().c_str());
}

// 消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_CREATE: {
            // 创建输入框1
            hwndInput1 = CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER,
                                       50, 20, 100, 30, hwnd, NULL, NULL, NULL);
            // 创建输入框2
            hwndInput2 = CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER,
                                       50, 60, 100, 30, hwnd, NULL, NULL, NULL);
            // 创建输出框
            hwndOutput = CreateWindow("STATIC", "", WS_CHILD | WS_VISIBLE,
                                       50, 100, 200, 30, hwnd, NULL, NULL, NULL);

            // 创建加法按钮
            hwndButtonAdd = CreateWindow("BUTTON", "+", WS_CHILD | WS_VISIBLE,
                                          200, 20, 30, 30, hwnd, (HMENU)1, NULL, NULL);
            // 创建减法按钮
            hwndButtonSub = CreateWindow("BUTTON", "-", WS_CHILD | WS_VISIBLE,
                                          200, 60, 30, 30, hwnd, (HMENU)2, NULL, NULL);
            // 创建乘法按钮
            hwndButtonMul = CreateWindow("BUTTON", "*", WS_CHILD | WS_VISIBLE,
                                          250, 20, 30, 30, hwnd, (HMENU)3, NULL, NULL);
            // 创建除法按钮
            hwndButtonDiv = CreateWindow("BUTTON", "/", WS_CHILD | WS_VISIBLE,
                                          250, 60, 30, 30, hwnd, (HMENU)4, NULL, NULL);
            break;
        }
        case WM_COMMAND: {
            if (LOWORD(wParam) == 1) { // 加法按钮被点击
                Calculate('+');
            } else if (LOWORD(wParam) == 2) { // 减法按钮被点击
                Calculate('-');
            } else if (LOWORD(wParam) == 3) { // 乘法按钮被点击
                Calculate('*');
            } else if (LOWORD(wParam) == 4) { // 除法按钮被点击
                Calculate('/');
            }
            break;
        }
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // 注册窗口类
    const char CLASS_NAME[] = "SimpleCalculator";
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(0, CLASS_NAME, "简单计算器", WS_OVERLAPPEDWINDOW,
                               CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, NULL, NULL, hInstance, NULL);

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

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

    return 0;
}

示例5、改进版的简单计算器

下面是一个改进版的简单计算器,界面上包含数字按键(0-9)和基本的运算按键(加、减、乘、除)。用户可以通过点击数字按键和运算符按键来输入数字和运算,然后按下“=”按钮来计算结果。

界面如下:

代码如下:

#include <windows.h>
#include <string>
#include <cstdlib>
#include <sstream>

using namespace std;

// 全局变量
HWND hwndDisplay;
string currentInput = ""; // 当前输入

// 更新显示框
void UpdateDisplay() {
    SetWindowText(hwndDisplay, currentInput.c_str());
}

// 处理数字和操作符的按钮点击
void ButtonClick(char value) {
    currentInput += value; // 追加输入
    UpdateDisplay();
}

// 计算结果并显示
void Calculate() {
    double num1 = 0.0, num2 = 0.0;
    char operation = '+';
    size_t pos = 0;

    // 解析输入
    for (char c : currentInput) {
        if (c == '+' || c == '-' || c == '*' || c == '/') {
            num1 = atof(currentInput.substr(0, pos).c_str());
            operation = c;
            pos++;
            break;
        }
        pos++;
    }

    if (pos < currentInput.length()) {
        num2 = atof(currentInput.substr(pos).c_str());
    } else {
        return; // 没有足够的输入进行计算
    }

    double result = 0.0;

    // 根据操作符进行计算
    switch (operation) {
        case '+': result = num1 + num2; break;
        case '-': result = num1 - num2; break;
        case '*': result = num1 * num2; break;
        case '/':
            if (num2 != 0) {
                result = num1 / num2;
            } else {
                currentInput = "错误:除以零";
                UpdateDisplay();
                return;
            }
            break;
    }

    // 显示结果
    stringstream ss;
    ss << result;
    currentInput = ss.str(); // 更新为结果
    UpdateDisplay();
}

// 消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_CREATE: {
            // 创建显示框
            hwndDisplay = CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | ES_RIGHT | ES_READONLY,
                                       10, 10, 280, 30, hwnd, NULL, NULL, NULL);

            // 创建按钮
            const char* buttons[] = {"7", "8", "9", "+",
                                     "4", "5", "6", "-",
                                     "1", "2", "3", "*",
                                     "0", ".", "=", "/"};

            int x = 10, y = 50;
            for (int i = 0; i < 16; ++i) {
                CreateWindow("BUTTON", buttons[i], WS_CHILD | WS_VISIBLE,
                             x, y, 65, 40, hwnd, (HMENU)(INT_PTR)(i + 1), NULL, NULL);
                x += 70;
                if ((i + 1) % 4 == 0) {
                    x = 10;
                    y += 45;
                }
            }

            // 创建"清空"按钮
            CreateWindow("BUTTON", "清空", WS_CHILD | WS_VISIBLE,
                         10, 230, 280, 30, hwnd, (HMENU)17, NULL, NULL);

            break;
        }

        case WM_COMMAND: {
            int id = LOWORD(wParam);
            if (id >= 1 && id <= 16) {
                const char* buttonValues[] = {"7", "8", "9", "+",
                                              "4", "5", "6", "-",
                                              "1", "2", "3", "*",
                                              "0", ".", "=", "/"};
                if (buttonValues[id - 1][0] == '=') {
                    Calculate();
                } else {
                    ButtonClick(buttonValues[id - 1][0]);
                }
            } else if (id == 17) { // 清空按钮
                currentInput = "";
                UpdateDisplay();
            }
            break;
        }
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // 注册窗口类
    const char CLASS_NAME[] = "SimpleCalculator";
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(0, CLASS_NAME, "手持计算器", WS_OVERLAPPEDWINDOW,
                               CW_USEDEFAULT, CW_USEDEFAULT, 315, 310, 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 0;
}

示例6、绘制直线、圆和三角形

Windows API中的GDI(Graphics Device Interface,图形设备接口)是一个用于处理图形和图像输出的子系统。它允许程序与各种输出设备(如显示器、打印机等设备无关性)进行交互,绘制图形、文本和图像。

GDI的作用

  1. 绘制图形:GDI提供了一系列函数,用于绘制基本形状(如线条、矩形、圆形、多边形等)。程序员可以使用这些函数在窗口上绘制想要的图形。
  2. 文本处理:GDI也可以用于绘制文本。它支持多种字体和文本格式,程序员可以选择字体、大小和颜色来显示文本。
  3. 图像处理:GDI能够加载并显示位图(BMP)、图标等图像格式。程序员可以将图像绘制到窗口或打印机上。
  4. 设备无关性:GDI使得程序可以不依赖于特定的硬件设备。无论是在显示器上绘制,还是在打印机上输出,GDI提供的接口都是一致的。这意味着,程序可以在不同的输出设备上运行,而不需要进行太多修改。
  5. 设备上下文(DC:在GDI中,设备上下文是一种数据结构,表示绘图设备的状态。程序在绘图时需要获取设备上下文,以便使用它来进行绘图操作。

GDI的基本操作

  1. 创建窗口:在窗口上绘制图形的第一步是创建一个窗口。这可以通过Windows API中的函数来实现。
  2. 获取设备上下文:在绘制之前,程序需要获取窗口的设备上下文(HDC),这样才能在窗口上进行绘制。
  3. 绘制操作
    • 使用GDI函数绘制图形(如MoveToEx和LineTo绘制直线)。
    • 使用TextOut函数绘制文本。
    • 使用BitBlt函数复制图像。
  4. 释放资源:绘制完成后,程序需要释放获取的设备上下文,以避免资源泄露。

先看效果图:

源码如下:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_PAINT: {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            // 设置颜色
            HPEN hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 255)); // 蓝色
            SelectObject(hdc, hPen);

            // 画直线
            MoveToEx(hdc, 50, 50, NULL); // 起点
            LineTo(hdc, 200, 50); // 终点

            // 画圆
            Ellipse(hdc, 50, 70, 150, 170); // x1, y1, x2, y2

            // 画三角形
            POINT vertices[] = { {200, 70}, {250, 170}, {150, 170} };
            Polygon(hdc, vertices, 3);

            // 释放资源
            DeleteObject(hPen);
            EndPaint(hwnd, &ps);
            break;
        }
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "SampleWindowClass";
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc; // 设置窗口过程
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(0, CLASS_NAME, "绘图示例", WS_OVERLAPPEDWINDOW,
                               CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, 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 0;
}

示例7、绘制红五角星

使用Windows API中的GDI (图形设备接口)。

先看效果图:

源码如下:

#include <windows.h>
#include <math.h>

#define M_PI 3.14159265358979323846 // 定义π(如未定义)

// 计算五角星顶点的函数
void DrawStar(HDC hdc, int centerX, int centerY, int size) {
    POINT points[10];
    double angle;
    int i;

    // 计算五角星的顶点
    for (i = 0; i < 10; i++) {
        angle = (i * 36.0) * (M_PI / 180.0); // 角度转换为弧度
        // 外部顶点
        if (i % 2 == 0) {
            points[i].x = centerX + (int)(size * cos(angle));
            points[i].y = centerY - (int)(size * sin(angle));
        }
        // 内部顶点
        else {
            points[i].x = centerX + (int)(size * 0.5 * cos(angle));
            points[i].y = centerY - (int)(size * 0.5 * sin(angle));
        }
    }

    // 绘制五角星
    HPEN hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); // 红色
    SelectObject(hdc, hPen);
    SelectObject(hdc, GetStockObject(NULL_BRUSH)); // 无填充
    Polygon(hdc, points, 10); // 绘制五角星

    // 释放资源
    DeleteObject(hPen);
}

// 消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_PAINT: {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            // 设置背景颜色
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));

            // 绘制红五角星
            DrawStar(hdc, 200, 150, 100);

            EndPaint(hwnd, &ps);
            break;
        }
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "StarDrawingWindow";
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc; // 设置窗口过程
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(0, CLASS_NAME, "绘制红五角星", WS_OVERLAPPEDWINDOW,
                               CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, 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 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Compose 适配 - 响应式排版 自适应布局

一、概念 基于可用空间而非设备类型来设计自适应布局&#xff0c;实现设备无关性和动态适配性&#xff0c;避免硬编码&#xff0c;以不同形态布局更好的展示内容。 二、区分可用空间 WindowSizeClasses 传统根据屏幕大小和方向做适配的方式已不再适用&#xff0c;APP的显示方式…

光储充智能协调控制系统的设计与应用研究

摘要 随着化石能源枯竭与环境污染问题加剧&#xff0c;构建高效、稳定的新能源系统成为能源转型的关键。本文针对光伏发电间歇性、储能系统充放电效率及充电桩动态负荷分配等技术挑战&#xff0c;提出一种基于智能协调管理的光储充一体化解决方案。通过多源数据融合与优化控制算…

UE4 踩坑记录

1、Using git status to determine working set for adaptive non-unity build 我删除了一个没用的资源&#xff0c;结果就报这个错&#xff0c;原因就是这条命令导致的&#xff0c; 如果这个项目是git项目&#xff0c; ue编译时会优先通过 git status检查哪些文件被修改&#…

C语言超详细指针知识(一)

通过前面一段学习C语言的学习&#xff0c;我们了解了数组&#xff0c;函数&#xff0c;操作符等相关知识&#xff0c;今天我们将要进行指针学习&#xff0c;这是C语言中较难的一个部分&#xff0c;我将带你由浅入深慢慢学习。 1.内存与地址 在正式学习指针前&#xff0c;我们首…

《算法笔记》3.3小节——入门模拟->图形输出

1036 跟奥巴马一起编程 #include <iostream> #include <cmath> using namespace std;int main() {int n,m;char c;cin>>n>>c;for (int i 0; i < n; i) {cout<<c;}cout<<endl;m round(1.0*n/2)-2;//round里面不能直接写n/2&#xff0c;…

【深入浅出 Git】:从入门到精通

这篇文章介绍下版本控制器。 【深入浅出 Git】&#xff1a;从入门到精通 Git是什么Git的安装Git的基本操作建立本地仓库配置本地仓库认识工作区、暂存区、版本库的概念添加文件添加文件到暂存区提交文件到版本库提交文件演示 理解.git目录中的文件HEAD指针与暂存区objects对象 …

在gitee上创建仓库——拉取到本地---添加文件---提交

2025/04/11/yrx0203 1-创建仓库 2-填写信息 3-创建完成后把仓库地址复制下来 4-在电脑上创建1个空的文件夹&#xff0c;进入这个文件夹&#xff0c;鼠标右击打开git bash 5-粘贴刚才复制的仓库的地址&#xff0c;回车 这样仓库就被拉取完成了 6-把本地的这个文件夹初始化…

小刚说C语言刷题——第21讲 一维数组

在日常生活中&#xff0c;我们经常输入一组数据。例如输入一个班30名学生的语文成绩&#xff0c;或者输入一组商品的价格。这个时候&#xff0c;我们如何输入一组类型相同的数据呢&#xff1f;这里我们就要用到数组。 1.数组的概念 所谓数组就是一组相同类型数据的集合。数组中…

芯片同时具备Wi-Fi、蓝牙、Zigbee,MAC地址会打架吗?

目录 【MAC 地址简介】 【MAC、Wi-Fi MAC、Bluetooth MAC的关系】 【以乐鑫ESP32-C6为例分析MAC】 【MAC 地址简介】 MAC&#xff08;Media Access Control&#xff09;地址是设备的物理地址&#xff0c;在全球范围内唯一标识每个网络接口。它是一个 48 比特&#xff08;6 字…

基于风力水力和蓄电池的低频率差联合发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 风力发电 4.2 风力发电 4.3 蓄电池原理 4.4 蓄电池对系统稳定性分析 5.完整工程文件 1.课题概述 基于风力水力和蓄电池的低频率差联合发电系统simulink建模与仿真。模型包括风力发电模块&#xf…

Harmony实战之简易计算器

前言 臭宝们&#xff0c;在学会上一节的基础知识之后&#xff0c;我们来实战一下。 预备知识 我们需要用到的知识点有&#xff1a; Column组件Row组件Link装饰器button组件TextInput组件State装饰器 最终效果图 代码实现 index页面(首页) /** * program: * * descriptio…

Spring MVC 国际化机制详解(MessageSource 接口体系)

Spring MVC 国际化机制详解&#xff08;MessageSource 接口体系&#xff09; 1. 核心接口与实现类详解 接口/类名描述功能特性适用场景MessageSource核心接口&#xff0c;定义消息解析能力支持参数化消息&#xff08;如{0}占位符&#xff09;所有国际化场景的基础接口Resource…

文件IO5(JPEG图像原理与应用)

JPEG图像原理与应用 ⦁ 基本概念 JPEG&#xff08;Joint Photographic Experts Group&#xff09;指的是联合图像专家组&#xff0c;是国际标准化组织ISO制订并于1992年发布的一种面向连续色调静止图像的压缩编码标准&#xff0c;所以也被称为JPEG标准。 同样&#xff0c;JP…

P8682 [蓝桥杯 2019 省 B] 等差数列

题目描述 思路 让求包含这n个整数的最短等差数列&#xff0c;既让包含这几个数&#xff0c;项数最少&#xff0c;若项数最少&#xff0c;肯定不能添加小于最小的和大于最大的&#xff0c;而且让项数最小&#xff0c;公差得大 等差数列的公差aj - ai / j - i; 这又是一个等差数…

批量给文件编排序号,支持数字序号及时间日期序号编排文件

当我们需要对文件进行编号的时候&#xff0c;我们可以通过这个工具来帮我们完成&#xff0c;它可以支持从 001 到 100 甚至更多的数字序号编号。也可以支持按照日期、时间等方式对文件进行编号操作。这是一种操作简单&#xff0c;处理起来也非常的高效文件编排序号的方法。 工作…

Dynamics365 ExportPdfTemplateExportWordTemplate两个Action调用的body构造

这两天在用ExportPdfTemplate做pdf导出功能时&#xff0c;遇到了如下问题InnerException : Microsoft.OData.ODataException: An unexpected StartArray node was found when reading from the JSON reader. A PrimitiveValue node was expected. 我的场景是使用power automate…

国际物流怎么找客户?选择适合自己的企业拓客平台

在国际物流行业&#xff0c;获客一直是企业发展的核心难题。无论是跨境电商、传统外贸&#xff0c;还是国际货代&#xff0c;找到精准的客户资源并高效转化&#xff0c;是决定企业能否抢占市场蓝海的关键。今天&#xff0c;我们就来聊聊如何选择一个真正适合的国际物流拓客平台…

高效查询Redis中大数据的实践与优化指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务) &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1;个人微信&a…

操作系统 4.2-键盘

键盘中断初始化和处理 提取的代码如下&#xff1a; // con_init 函数&#xff0c;初始化控制台&#xff08;包括键盘&#xff09;的中断 void con_init(void) {set_trap_gate(0x21, &keyboard_interrupt); } ​ // 键盘中断处理函数 .globl _keyboard_interrupt _keyboard…

STM32+EC600E 4G模块 与华为云平台通信

前言 由于在STM32巡回研讨会上淘了一块EC600E4G模块以及刚办完电信卡多了两张副卡&#xff0c;副卡有流量刚好可以用一下&#xff0c;试想着以后画一块ESP32板子搭配这个4G模块做个随身WIFI&#xff0c;目前先用这个模块搭配STM32玩一下云平顺便记录一下。 实验目的 实现STM…