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编程原理,仍不失为优秀工具。
元·刘因《村居杂诗》
芳芬皆可籍,缓步即吾车[jū];
乘兴三杯酒,随行一策书[xū]。
曦海吞孤客,云途接太虚。
不悲残照晚,独向曙星初。
浪卷千秋雪,舟横万古淤。
暮天同曦渡,烟霞话瀛居。
千里客远去,万山影重疏。
江河驰昼夜,波浪自沉浮。
——羲海客·一策书(湘岳阳万江波)。
蒲公《咏史》
良马非不骏,盐坂徒悲鸣。
美玉非不贵,抱璞为世轻。
高士卧隆中,畴乃知其名?
从容起南阳,谈笑魏吴惊。
男儿事蚕桑,后世有何称?
——羲海客·一策书(湘岳阳万江波)

浙公网安备 33010602011771号