#include<Windows.h>
#include<d2d1.h>
#pragma comment(lib,"d2d1.lib")
#include<dwmapi.h>
#pragma comment(lib,"dwmapi.lib")
ID2D1Factory* D2DFactory;//D2D工厂
ID2D1HwndRenderTarget* RenderTarget;//渲染目标
ID2D1SolidColorBrush* SolidBrush;//纯色画刷
void D2DCreate(HWND hWnd)
{
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &D2DFactory);//创建工厂
D2DFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(hWnd, D2D1::SizeU()), &RenderTarget);//创建渲染目标
RenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red), &SolidBrush);//创建画刷
}
void D2DPaint()
{
RenderTarget->Resize(D2D1::SizeU(100, 100));//设置窗口大小
RenderTarget->BeginDraw();//开始绘制
RenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));//清理窗口背景色
RenderTarget->EndDraw();//结束绘制
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_NCPAINT:D2DPaint(); break;//D2D绘制
//注意缺陷:窗口最大化后的大小不对,四周大了8像素宽度,请修改绘制大小,完美解决办法没有
case WM_NCCALCSIZE:if (wParam)return WVR_REDRAW; return 0;
case WM_NCHITTEST:return HTCAPTION;//鼠标位置测试,可自行扩展,如鼠标调整窗口大小
case WM_DESTROY:PostQuitMessage(0);
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int ShowCmd)
{
WNDCLASS wndclass = { 0 };
wndclass.hCursor = LoadCursor(0, IDC_ARROW);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = "win";
RegisterClass(&wndclass);
HWND hWnd = CreateWindow("win", 0, WS_OVERLAPPEDWINDOW, 183, 84, 1000, 600, 0, 0, hInstance, 0);
D2DCreate(hWnd);//D2D创建
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
MARGINS margins = { 1 };
DwmExtendFrameIntoClientArea(hWnd, &margins);//绘制阴影的关键
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
GUI-Win32-实现完全空白窗口
需积分: 0 63 浏览量
更新于2023-04-26
收藏 35.02MB ZIP 举报
在Windows操作系统中,GUI(图形用户界面)是与用户交互的主要方式。Win32 API(应用程序接口)是Microsoft提供的一套用于开发Windows桌面应用程序的函数库。本教程将深入探讨如何使用Visual Studio 2022来实现一个完全空白的Win32窗口。
一、Win32 API基础
Win32 API提供了创建窗口、处理消息、绘制图形等大量功能。它基于事件驱动模型,窗口的消息循环是其核心机制。开发者通过注册窗口类、创建窗口以及响应各种窗口消息来构建应用。
二、创建Win32项目
1. 打开Visual Studio 2022,选择“创建新项目”。
2. 在项目模板中,找到“Win32控制台应用程序”,点击“下一步”。
3. 在“配置应用程序”页面,确保“空项目”被选中,然后点击“完成”。
4. 添加源文件,例如添加一个名为"main.cpp"的文件。
三、编写代码
在"main.cpp"中,我们将实现以下步骤:
1. 包含必要的头文件:
```cpp
#include <Windows.h>
```
2. 定义窗口过程(WndProc)函数,处理窗口消息:
```cpp
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
```
3. 注册窗口类:
```cpp
WNDCLASS wc = {0};
wc.lpfnWndProc = WndProc;
wc.lpszClassName = L"MyWindowClass";
RegisterClass(&wc);
```
4. 创建窗口:
```cpp
HWND hWnd = CreateWindow(L"MyWindowClass", L"My Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
```
5. 显示和更新窗口:
```cpp
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
```
6. 运行消息循环:
```cpp
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
```
四、编译与运行
保存所有更改,然后编译并运行项目。你将在屏幕上看到一个完全空白的窗口。虽然这个窗口看起来很朴素,但它是所有Win32 GUI应用程序的基础。
五、扩展与优化
1. 自定义窗口样式:通过修改`CreateWindow`函数中的参数,可以改变窗口的大小、位置和风格。
2. 绘制图形:通过处理WM_PAINT消息,可以使用GDI(Graphics Device Interface)在窗口上绘制文本、线条、图形等。
3. 响应用户输入:添加更多的消息处理代码,如键盘、鼠标事件,以增加互动性。
六、实际应用
在实际开发中,通常会创建一个包含资源(如图标、菜单、对话框)的.rc文件,并使用资源编译器将其编译为资源脚本,这样可以使得程序更加专业且功能更丰富。
总结,通过学习和实践Win32 API,你可以创建出功能强大、自定义程度高的Windows桌面应用程序。尽管现代有如Qt、WPF等高级框架,但掌握Win32 API的基础知识对于理解底层工作原理以及解决特定问题仍然十分有价值。

QQVQQ...
- 粉丝: 2079
最新资源
- 基于计算机视觉的小车目标检测与动态跟踪技术研究 (注:共 16 字,核心动作 “检测”“跟踪” 及对象 “小车” 均保留,通过 “基于计算机视觉”“动态”“技术研究” 补充表述维度,确保原意不变且满足
- 基于船舶的目标检测技术研究项目
- MATLAB中基于YALMIP的微电网优化调度模型:含蓄电池与市场购售电约束的总费用最小化 · 微电网
- 基于船舶目标开展精准识别与检测的技术项目
- 多相流相对渗透率计算中相场与水平集方法的质量守恒策略实现
- 基于DSP28035的60KW三相光伏并网逆变器IGBT驱动电路设计与优化 开关损耗优化
- 三相PWM整流器并联仿真及零序环流抑制算法的研究与应用
- 触摸屏直接控制变频器:昆仑通泰TPC与安川V1000及其他品牌变频器的485端口通信实现 宝典
- 多供区交直流潮流模型构建与求解:基于改进IEEE39节点系统的柔性互联算法研究 实战版
- 基于 OpenCV 原生库实现目标检测与文本检测的方法
- 基于C代码的异步电机矢量控制算法仿真与双闭环解耦控制实现高精度转速调节
- 本仓库存有目标检测 YOLO 系列及改进模块代码,欢迎自取
- Matlab Simulink中基于MRAS的直流母线电压传感器容错控制方法研究:包括设置电压传感器断路与漂移故障,并利用冗余开关进行容错切换
- 基于Verilog的UART IP核心开发与FPGA移植:从编码到仿真的全流程解析
- 风光柴储混合微电网中储能电池系统的MATLAB仿真研究:实现互补能量管理
- 汇川通IT7000触摸屏标准模板程序解析:提升编程效率与稳定性的关键