信息门户网站制作费用/佛山百度推广电话

信息门户网站制作费用,佛山百度推广电话,广告创意设计案例,可以做直播的游戏视频网站极速导航 Direct2D 简介创建新项目:001-DrawGraphics弄一个白窗口在窗口上画图 Direct2D 简介 大家在学 WINAPI 的时候的时候有没有想过,怎么在一副窗口上画图呢?大家知道 Windows 系统是 GUI 图形用户界面 系统,以 Graphics 图形…

极速导航

    • Direct2D 简介
    • 创建新项目:001-DrawGraphics
    • 弄一个白窗口
    • 在窗口上画图


Direct2D 简介


在这里插入图片描述

在这里插入图片描述


大家在学 WINAPI 的时候的时候有没有想过,怎么在一副窗口上画图呢?大家知道 Windows 系统是 GUI 图形用户界面 系统,以 Graphics 图形 为卖点嘛,肯定需要一个东西 (子系统) 来画图,于是我们熟知的 GDI (Graphics Device Interface,图形设备接口) 应运而生。GDI 是图形显示与硬件的桥梁,有了它我们就能画图了:


在这里插入图片描述

这是实打实用 GDI 实现的软件光栅化画 3D 模型,太恐怖了!

原文地址:用 windows GDI 实现软光栅化渲染器–gdi3d(开源)

然而 GDI 可是用纯 C 语言写出来的 API!GDI 编程时时刻刻都要依赖设备上下文 (就是 HDC)设备句柄!纯 C-style 的代码写起来可费力不少,而且 GDI 的缺陷也逐渐显露出来,例如说什么绘制精度不高啊,支持颜色不够啊,只支持 BMP 位图啊,容易出现锯齿啊等等。

于是在 Windows 2000 的时候,微软又推出了 GDI+ ,这个 API 是基于 C++ 写的 GDI 加强版,写代码方便了不少,而且解决了上述 GDI 中出现的问题:


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

用 GDI+ 画圆,边缘锯齿感明显减轻了很多

GDI+ 换来了好的表现效果,那么代价呢?绘制效率降低,所以 GDI+ 画图速度是明显慢于 GDI 的,一般只有 10 fps 左右。

怎么才能画的又快又好呢?GDI 和 GDI+ 都是 软件渲染 (CPU 渲染) 的,软件不行,可以用 硬件 (GPU) 啊!


在这里插入图片描述


其实在 Windows 95 的时候,微软就发布了第一代 DirectX 套件 ,里面就已经有初步支持硬件加速的 DirectShow 和 DirectDraw 了 (注意因为那时候 GPU 发展尚未成型,所以说是初步支持硬件加速,渲染的大头还落在 CPU 上),后面 GPU 逐步发展到能和 CPU 平起平坐的阶段,别的厂家已经推出相关支持的渲染 API,微软坐不住了啊!之前设计的太乱,设计的不好,我就重新整合!把 DirectShow 和 DirectDraw 统统重新整合到一个新的 API 里!

在 Windows 7 发布的时候 (2009),微软给开发者们一个大大的惊喜:Direct2D,硬件加速下的 2D 图形渲染时代正式拉开帷幕:


在这里插入图片描述
在这里插入图片描述


创建新项目:001-DrawGraphics


  • 打开 VS2022,新建空项目

在这里插入图片描述
在这里插入图片描述


  • 解决方案名为 “D2D”,项目名称为 “001-DrawGraphics”,位置选桌面,然后按"创建"

在这里插入图片描述


  • 右键项目 -> “链接器” -> “系统” -> “子系统” -> 选择"窗口" -> 按"确定"

在这里插入图片描述
在这里插入图片描述


  • 右键项目新建源文件,命名为 “main.cpp”

在这里插入图片描述


弄一个白窗口


废话少说,我们直接开始:

#include<Windows.h>
#include<wrl.h>
#include<d2d1.h>#pragma comment(lib, "d2d1.lib")LRESULT CALLBACK callBackFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HINSTANCE hins, HINSTANCE hPrev, LPSTR lpstr, int cmdShow)
{WNDCLASS wc = {};wc.hInstance = hins;wc.lpszClassName = L"D2D";wc.lpfnWndProc = callBackFunc;RegisterClass(&wc);HWND hwnd = CreateWindow(wc.lpszClassName, L"你好!Direct 2D", WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hins, NULL);MSG msg = {};while (GetMessage(&msg, NULL, 0, 0) > 0){TranslateMessage(&msg);DispatchMessage(&msg);}
}LRESULT CALLBACK callBackFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_DESTROY: {PostQuitMessage(0);} break;default: return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}

在这里插入图片描述


在窗口上画图


#include<Windows.h>
#include<wrl.h>
#include<d2d1.h>#pragma comment(lib, "d2d1.lib")using namespace Microsoft::WRL;LRESULT CALLBACK callBackFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);ComPtr<ID2D1Factory> m_D2DFactory;				// D2D 工厂
ComPtr<ID2D1HwndRenderTarget> m_RenderTarget;	// 窗口渲染目标
ComPtr<ID2D1SolidColorBrush> m_Brush;			// 纯色画刷int WINAPI WinMain(HINSTANCE hins, HINSTANCE hPrev, LPSTR lpstr, int cmdShow)
{WNDCLASS wc = {};wc.hInstance = hins;wc.lpszClassName = L"D2D";wc.lpfnWndProc = callBackFunc;RegisterClass(&wc);HWND hwnd = CreateWindow(wc.lpszClassName, L"你好!Direct 2D", WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hins, NULL);MSG msg = {};while (GetMessage(&msg, NULL, 0, 0) > 0){TranslateMessage(&msg);DispatchMessage(&msg);}
}LRESULT CALLBACK callBackFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_CREATE: {	// 在这里创建 D2D 设备// 创建 D2D 工厂D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, m_D2DFactory.GetAddressOf());D2D1_RENDER_TARGET_PROPERTIES properties = {};properties.dpiX = 0;properties.dpiY = 0;properties.type = D2D1_RENDER_TARGET_TYPE_HARDWARE;					// 硬件渲染properties.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;	// 开启 alpha 混合properties.pixelFormat.format = DXGI_FORMAT_R8G8B8A8_UNORM;D2D1_HWND_RENDER_TARGET_PROPERTIES Hwndproperties = {};Hwndproperties.hwnd = hwnd;											// 窗口句柄Hwndproperties.pixelSize.width = 640;								// 渲染目标宽度Hwndproperties.pixelSize.height = 480;								// 渲染目标高度Hwndproperties.presentOptions = D2D1_PRESENT_OPTIONS_NONE;			// 自动选择呈现模式// 创建窗口渲染目标m_D2DFactory->CreateHwndRenderTarget(properties, Hwndproperties, &m_RenderTarget);// 创建纯色画刷m_RenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Blue), &m_Brush);} break;case WM_PAINT: {	// 在这里进行绘制操作m_RenderTarget->BeginDraw();m_RenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::LightSteelBlue));	// 清空窗口const UINT square_length = 40;		// 正方形边长const UINT begin_pos_x = 100;		// 正方形起始位置 (x轴)const UINT begin_pos_y = 20;		// 正方形起始位置 (y轴)bool is_black = true;D2D1_RECT_F rect = {};for (int i = 0; i < 11; i++){for (int j = 0; j < 11; j++){rect.left = begin_pos_x + j * square_length;rect.right = rect.left + square_length;rect.top = begin_pos_y + i * square_length;rect.bottom = rect.top + square_length;// 设置画刷颜色if (is_black) m_Brush->SetColor(D2D1::ColorF(D2D1::ColorF::Black));else m_Brush->SetColor(D2D1::ColorF(D2D1::ColorF::White));m_RenderTarget->FillRectangle(rect, m_Brush.Get());		// 绘制矩形is_black = !is_black;}}m_RenderTarget->EndDraw();} break;case WM_DESTROY: {PostQuitMessage(0);} break;default: return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}

在这里插入图片描述



下一篇教程,我们要用 Direct2D 画一个淳平。

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

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

相关文章

Linux之详谈——权限管理

目录 小 峰 编 程 ​编辑 一、权限概述 1、什么是权限 2、为什么要设置权限 3、Linux中的权限类别- 4、Linux中文件所有者 1&#xff09;所有者分类&#xff08;谁&#xff09; 2&#xff09;所有者的表示方法 ① u(the user who owns it)&#xff08;属主权限&…

基于金融新闻的大型语言模型强化学习在投资组合管理中的应用

“Financial News-Driven LLM Reinforcement Learning for Portfolio Management” 论文地址&#xff1a;https://arxiv.org/pdf/2411.11059 摘要 本研究探索了如何通过将大语言模型&#xff08;LLM&#xff09;支持的情感分析融入强化学习&#xff08;RL&#xff09;中&#…

K8s运维管理平台 - KubeSphere 3.x 和4.x 使用分析:功能较强,UI美观

目录标题 Lic使用感受优点&#xff1a;优化点&#xff1a; 实操首页项目 | 应用负载 | 配置 | 定制资源定义存储监控告警集群设置 **KubeSphere 3.x** 和 **4.x**1. **架构变化**&#xff1a;2. **多集群管理**&#xff1a;3. **增强的 DevOps 功能**&#xff1a;4. **监控与日…

当AI学会“顿悟”:DeepSeek-R1如何用强化学习突破推理边界?

开篇&#xff1a;一场AI的“青春期叛逆” 你有没有想过&#xff0c;AI模型在学会“推理”之前&#xff0c;可能也经历过一段“中二时期”&#xff1f;比如&#xff0c;解题时乱写一通、语言混搭、答案藏在火星文里……最近&#xff0c;一支名为DeepSeek-AI的团队&#xff0c;就…

Ollama+DeepSeek本地大模型部署

1、Ollama 官网&#xff1a;https://ollama.com/ Ollama可以干什么&#xff1f; 可以快速在本地部署和管理各种大语言模型&#xff0c;操作命令和dokcer类似。 mac安装ollama&#xff1a; # 安装ollama brew install ollama# 启动ollama服务&#xff08;默认11434端口&#xf…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)

Understanding Diffusion Models: A Unified Perspective&#xff08;三&#xff09; 文章概括 文章概括 引用&#xff1a; article{luo2022understanding,title{Understanding diffusion models: A unified perspective},author{Luo, Calvin},journal{arXiv preprint arXiv:…

mybatis(104/134)

动态sql标签&#xff0c;用于选择查询 if标签 where标签 &#xff1a;自动生成where&#xff0c;取决于后面有没有条件&#xff0c;会自动去除条件前面的and和or&#xff0c;不会去除语句后面的 trim标签&#xff1a;自动生成where&#xff0c;在语句后自动去除后缀and和or for…

【数据结构】动态内存管理函数

动态内存管理 为什么存在动态内存管理动态内存函数的介绍&#x1f38a;malloc补充&#xff1a;perror函数&#x1f38a;free&#x1f38a;calloc&#x1f38a;realloc 常见动态内存错误对空指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一…

文档智能扫描,提升无纸化办公效率

随着无纸化办公的推广和移动设备的普及&#xff0c;用户迫切需要将纸质文档快速、准确地转换成电子格式&#xff0c;以提高工作效率和信息管理的便捷性。同时&#xff0c;用户将文档扫描成电子版后&#xff0c;可以自行通过加密和访问控制提高电子文档的安全性&#xff0c;以满…

汇编的使用总结

一、汇编的组成 1、汇编指令&#xff08;指令集&#xff09; 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令&#xff0c;但是可以起到指令的作用&#xff0c;伪…

python实现dbscan

python实现dbscan 原理 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。它将簇定义为密度相连的点的最大集合&#xff0c;能够把具有足够高密度的区域划分为簇&#xff0c;并可在噪声的空间数据库中发现任意形…

gesp(C++六级)(4)洛谷:B3874:[GESP202309 六级] 小杨的握手问题

gesp(C六级)&#xff08;4&#xff09;洛谷&#xff1a;B3874&#xff1a;[GESP202309 六级] 小杨的握手问题 题目描述 小杨的班级里共有 N N N 名同学&#xff0c;学号从 0 0 0 至 N − 1 N-1 N−1。 某节课上&#xff0c;老师安排全班同学进行一次握手游戏&#xff0c;具…

【自然语言处理(NLP)】机器翻译之数据处理(数据收集、数据清洗、数据分词、数据标注、数据划分)

文章目录 介绍机器翻译之数据处理数据收集数据清洗数据分词数据标注数据划分代码实现导包数据查看处理函数数据预处理词元化统计每句话的长度的分布情况截断或者填充文本序列将机器翻译的文本序列转换成小批量tensor加载数据试用一下 个人主页&#xff1a;道友老李 欢迎加入社区…

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR、流水线及伪指令

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…

单链表算法实战:解锁数据结构核心谜题——链表的回文结构

题目如下&#xff1a; 解题过程如下&#xff1a; 回文结构举例&#xff1a; 回文数字&#xff1a;12521、12321、1221…… 回文字符串&#xff1a;“abcba”、“abba”…… 并不是所有的循环嵌套的时间复杂度都是O(n^2) 可以用C写C程序&#xff1a; C里可以直接使用ListNode…

计算机网络 (58)无线局域网WLAN

前言 无线局域网WLAN&#xff08;Wireless Local Area Network&#xff09;是一种利用无线通信技术将计算机设备互联起来&#xff0c;构成可以互相通信和实现资源共享的网络体系。 一、定义与特点 定义&#xff1a; WLAN通过无线信道代替有线传输介质连接两个或多个设备形成一个…

10 款《医学数据库和期刊》查阅网站

在毕业设计过程中,需要查阅到关于医学的相关文献和图片作为参考,发现下面10款非常的好用,作为分享。 1. PubMed: PubMed 搜索关键词如“lung cancer CT images”或“lung cancer CT scan”。 Radiopaedia: https://radiopaedia.org/ 这是一个放射学专业网站,有大量肺癌的CT…

OpenCV:形态学梯度

目录 简述 1. 用图像运算和腐蚀实现形态学梯度 1.1 代码示例 1.2 运行结果 2. 形态学梯度接口 2.1 参数解释 2.2 代码示例 2.3 运行结果 3. 形态学梯度与边缘检测 4. 形态学梯度的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 简述…

Java 大视界 -- Java 大数据在生物信息学中的应用与挑战(67)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

字符设备驱动模版-中断

字符设备驱动模版-中断 思维导图在线高清查看&#xff1a;https://www.helloimg.com/i/2025/01/27/679791b5257c0.png 修改设备树 1添加pinctrl节点 1创建对应的节点 在 iomuxc 节点的 imx6ul-evk 子节点下 2添加“fsl,pins”属性 3在“fsl,pins”属性中添加PIN配置信息 …