7.Dev-C++窗体编程体验

7.Dev-C++窗体编程体验

1. Dev-C++窗体编程概述

Dev-C++作为轻量级C++集成开发环境,凭借其简洁的界面和Windows API支持,能够实现基础的窗体应用程序开发。相较于Visual Studio,其优势在于配置简单、体积小巧,尤其适合教学场景和轻量级项目开发。通过调用Windows API函数,开发者可以创建窗口、控件、菜单等元素,实现完整的GUI交互功能。

2. 代码示例1:创建基础窗体

目标:构建标题为"Dev-C++窗体"的空白窗口

核心代码

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {

switch (msg) {

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, msg, wp, lp);

}

return 0;

}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow) {

// 注册窗口类

WNDCLASSW wc = {0};

wc.hbrBackground = (HBRUSH)COLOR_WINDOW;

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hInstance = hInst;

wc.lpszClassName = L"MainWindow";

wc.lpfnWndProc = WndProc;

RegisterClassW(&wc);

// 创建窗口(标题设置在此处)

CreateWindowW(L"MainWindow", L"Dev-C++窗体",

WS_OVERLAPPEDWINDOW | WS_VISIBLE,

100, 100, 800, 600, NULL, NULL, hInst, NULL);

// 消息循环

MSG msg = {0};

while (GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return 0;

}

关键点​:

①使用CreateWindowW第二个参数设置窗口标题

②WS_OVERLAPPEDWINDOW包含最大化/最小化按钮等标准控件

3. 代码示例2:窗体文字显示

目标:在窗体中央显示"Dev-C++ 窗体文字显示举例"

新增代码段:

case WM_PAINT: {

PAINTSTRUCT ps;

HDC hdc = BeginPaint(hWnd, &ps);

// 设置字体和颜色

HFONT hFont = CreateFont(24,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,

DEFAULT_CHARSET,OUT_OUTLINE_PRECIS,CLIP_DEFAULT_PRECIS,

CLEARTYPE_QUALITY, VARIABLE_PITCH, L"宋体");

SelectObject(hdc, hFont);

SetTextColor(hdc, RGB(0, 0, 255));

// 计算文字居中位置

RECT rect;

GetClientRect(hWnd, &rect);

DrawText(hdc, L"Dev-C++ 窗体文字显示举例", -1, &rect,

DT_SINGLELINE | DT_CENTER | DT_VCENTER);

DeleteObject(hFont);

EndPaint(hWnd, &ps);

break;

}

实现原理

  • 在WM_PAINT消息中处理绘图操作
  • DrawText配合DT_CENTER实现自动居中

4. 代码示例3:窗体菜单系统

目标:创建包含"文件"和"帮助"的二级菜单

实现步骤

cpp代码:

// 在WinMain中添加菜单创建

HMENU hMenu = CreateMenu();

HMENU hSubMenu = CreatePopupMenu();

AppendMenu(hSubMenu, MF_STRING, 1001, L"新建");

AppendMenu(hSubMenu, MF_SEPARATOR, 0, NULL);

AppendMenu(hSubMenu, MF_STRING, 1002, L"退出");

AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"文件");

hSubMenu = CreatePopupMenu();

AppendMenu(hSubMenu, MF_STRING, 2001, L"关于");

AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"帮助");

// 修改CreateWindow调用,添加菜单句柄

CreateWindowW(..., hMenu, ...); // 第9个参数传入hMenu

// 在窗口过程中处理菜单点击

case WM_COMMAND: {

int wmId = LOWORD(wp);

if (wmId == 1002) PostQuitMessage(0);

else if (wmId == 2001) {

MessageBox(hWnd, L"菜单功能示例", L"提示", MB_OK);

}

break;

}

//添加文字显示(同示例2方法)

DrawText(hdc, L"窗体菜单练习", ...);

特性

  • 通过CreatePopupMenu创建层级菜单
  • 使用MF_SEPARATOR添加菜单分隔线
  • 菜单ID通过WM_COMMAND消息响应

5. 代码示例4:五角星绘制

目标:绘制红色五角星并显示说明文字

数学建模​:
根据极坐标公式计算五个顶点坐标:

Markdown

θ = 72°*k + 18°(k=0~4)

r = 100px

绘制代码:

case WM_PAINT: {

// ...(文字绘制代码同前)

// 设置绘图属性

HPEN hPen = CreatePen(PS_SOLID, 3, RGB(255,0,0));

SelectObject(hdc, hPen);

// 计算中心点

POINT center = {400, 300};

const int R = 100;

POINT pts[5];

// 计算顶点坐标

for (int i=0; i<5; i++) {

double angle = (72*i - 18) * 3.1416 / 180;

pts[i].x = center.x + R * cos(angle);

pts[i].y = center.y + R * sin(angle);

}

// 绘制连线

MoveToEx(hdc, pts[0].x, pts[0].y, NULL);

LineTo(hdc, pts[2].x, pts[2].y);

LineTo(hdc, pts[4].x, pts[4].y);

LineTo(hdc, pts[1].x, pts[1].y);

LineTo(hdc, pts[3].x, pts[3].y);

LineTo(hdc, pts[0].x, pts[0].y);

DeleteObject(hPen);

break;

}

技术细节

使用LineTo实现连续线段绘制

通过三角函数计算五角星顶点坐标

绘制顺序遵循0→2→4→1→3→0的连线规则

总结

通过上述案例可见,Dev-C++虽然缺少可视化设计器,但通过Windows API仍能实现完整的窗体编程功能。其优势在于:

(1)代码级控制UI元素,适合教学场景理解底层机制

(2)轻量化环境对硬件要求低

(3)通过API组合可实现复杂图形绘制

局限方面,缺乏现代IDE的拖拽控件功能,复杂界面开发效率较低。但对于学习Windows GUI编程原理,仍不失为优秀工具。

posted @ 2025-04-29 22:03  曦海客·一策书·萬江波  阅读(274)  评论(0)    收藏  举报