ATL/WTL界面开发
文章平均质量分 74
WTL 是一个基于模板的程序库.它扩展了ATL并提供了一些类用来实现应用程序的用户界面,组件和控件.它提供 了各种类来支持各种各样的用户界面元素:顶级窗口,MDI,标准控件和通用控件,通用的对话框、属性表以及属性页,GDI 对象,UI 更新, 可卷动的窗口,分割窗口,命令条等等
Peter(阿斯拉达)
关注系统界面开发技术,安全,语言特性,网络,图形,AI,硬件,并发,研发流程管理.
展开
-
[WTL/Win32]_[初级]_[如何设置ListView的列宽不出现水平滚动条]
1. 开发`WTL/Win32`的程序时,经常会用到表格控件`CListViewCtrl`。这个控件需要设置列的宽度,当用完`100%`的宽度来平均分配给列宽时,一加载数据多,就会出现垂直滚动条后,水平滚动条也会同时出现的问题。怎么设置才能让水平滚动条不出现?原创 2024-03-26 17:58:58 · 657 阅读 · 0 评论 -
[Windows]_[初级]_[GetVersionEx获取系统版本错误的原因]
1. 开发`WTL/ATL/Win32`程序时, 有时候需要获取系统版本号,以便判断用户在使用软件时的系统。在某一天突然发现获取的系统版本号是错的, 一直是版本号`6.2.x`,什么情况?原创 2024-08-05 21:10:51 · 397 阅读 · 0 评论 -
[WTL/Win32]_[中级]_[MVP架构在实际项目中的应用]
1. 在开发`Windows`和`macOS`的界面软件时,`Windows`用的是`WTL/Win32`技术,而`macOS`用的是`Cocoa`技术。而两种技术的本地语言一个主打是`C++`,另一个却是`Object-c`。界面软件的源码随着项目功能增多而增多,这就会给同步`Windows`和`macOS`的功能造成很大负担。 有大部分的调用底层逻辑,界面数据搜索等代码逻辑会重复写两遍,用`C++`和`Object-C`写。初步估计这部分代码至少占界面代码的`50%`。这无疑会影响产品发布速度,影响软件原创 2024-06-17 10:53:06 · 1182 阅读 · 0 评论 -
[C/C++11]_[WTL/ATL]_[多线程如何无锁更新进度条界面上的描述字符串]
1. 开发界面程序`WTL/Win32`时,经常会使用进度条来实时显示百分比和描述文字。这些文字一般都用一个成员变量`wstring`来存储,而文字的更新可能比较频繁,比如下载复制文件时,显示正在复制的文件名。可能`500ms`就需要更新一次文字。 绘制是在主线程操作,那么更新和读取得常见做法是工作线程发送消息到需要更新的文本到主线程,之后主线程取出消息并更新文本。这么做的缺陷就是需要发送的消息太多了。有没有更好的办法?原创 2024-03-06 16:30:18 · 132 阅读 · 0 评论 -
[ATL/WTL]_[初级]_[如何获取ListView点击的单元格区域]
# 场景1. 在做`Win32/WTL`开发时,`CListViewCtrl`控件是常用的表格控件。有时候自绘`listview`时,需要在单元格上绘制小图标,并且小图标能响应鼠标点击的操作。 那么如何实现判断是否点击了小图标呢?原创 2023-06-08 14:05:55 · 772 阅读 · 0 评论 -
[WTL/ATL]_[初级]_[TreeView控件如何显示ToolTip]
1. 在开发界面程序时,`CTreeViewCtrl`(它实际内部封装的就是`Win32`的`TreeView`控件)一般会用来作为选择某些类型的树形菜单,点击某项的时候,右边能显示某些对应的数据。当这个控件的宽度固定时,有时候每行的文本项可能由于过长从而穿透了整个控件的水平位置, 从而显示效果来看是不好的。这时候希望可以用省略号的样式来省略后边多出的文本,之后鼠标移动到这个文本项时能显示完整的文字,那么这个文本提示,或者说`tooltip`如何实现?原创 2023-02-13 15:59:33 · 445 阅读 · 0 评论 -
[ATL/WTL]_[初级]_[解决自定义按钮禁用时没有绘制自定义样式-显示黑色矩形框的问题]
1. 在使用`WTL`的自定义按钮[1]时, 按钮在禁用后,接着弹出一个进度条。这时候按钮的禁用按钮并没有被绘制。显示的还是黑色矩形,怎么回事?原创 2022-11-05 15:49:01 · 383 阅读 · 0 评论 -
[WTL/ATL]_[初级]_[如何设置CEdit的文本框背景色和文字颜色]
场景在开发WTL或MFC界面程序时,经常会使用CEdit文本框,但是有时候为了和父窗口的颜色对应上,文本框里的背景色也需要和父窗口一样。CEdit或者说Edit的Win32控件[4]并没有相应的方法或者消息WM_XX来设置背景色的值,怎么办?说明看Edit控件的官方说明, 当不是禁用或者只读时使用WM_CTLCOLOREDIT消息来改变控件的文本和背景色(当禁用和只读时使用WM_CTLCOLORSTATIC消息来处理)。父窗口通过指定设备的上下文句柄HDC来改变颜色。An edit cont原创 2022-04-15 15:30:35 · 1020 阅读 · 0 评论 -
[WTL/ATL]_[Gdiplus]_[绘制虚线并设置破折号空格的宽度]
场景WTL界面开发时,有些情况下需要绘制虚线,比如圆角矩形的虚线,默认的破折号和点之间的空格特别小,看着比较密集,那么如何增加点线之间的空格,或者增加破折号的长度?说明使用Gdiplus绘制圆角矩形是比Gdi简单,因为它提供了路径GraphicsPath和抗锯齿模式SmoothingModeAntiAlias. 在之前的文章[2]也说过如何绘制圆角矩形。使用GraphicsPath也得使用Pen对象,它设置了画线的画笔。之后设置虚线使用以下的方法:pen.SetDashStyle(原创 2022-03-31 20:04:44 · 570 阅读 · 0 评论 -
[WTL/ATL]_[初级]_[微调控件CUpDownCtrl的使用]
场景开发WTL/ATL应用时,有时候需要对某些值进行微调,比如0-100的百分比的微调,或者字号的微调,通过键盘操作微调控件,能实时查看某些界面呈现的效果。而WTL提供了CUpDownCtrl控件,这是对Win32 Up-Down控件[1]的封装. 那么这个类如何用?图1说明创建CUpDownCtrl,需要传递某些样式. 注意,它的朋友窗口CEdit需要在upDown之前创建。除此之外,CUpDownCtrl也不需要指定区域大小,因为他会根据CEidt进行适配,你无法通过CRect修改它的原创 2022-03-31 15:53:15 · 538 阅读 · 0 评论 -
[WTL/ATL]_[中级]_[自定义TrackBar]
场景开发WTL/ATL界面程序时, 有时候会需要微调控件进行缓慢增减数值.但是微调控件在大数值调整上往往比较麻烦,需要点击很多次。这时就需要使用TrackBar控件[1]进行大数值的快速变化.标准滑块控件很明显很难看,那么如何进行定制它的channel(通道,水平的选中和未选中的部分)和thumb(滑块)呢?比如如何定义圆形的滑块?说明WTL使用在atlctrls.h声明的CTrackBarCtrl类来使用Win32的Trackbar控件. 这个标准控件本身并没有方法设置thum原创 2022-03-30 17:03:19 · 662 阅读 · 0 评论 -
[WTL/ATL]_[初级]_[关于窗口子类析构时崩溃的原因]
场景在开发WTL程序时,会常用到非模式对话框用来作为进度条窗口,配合Tab窗口可以做到进度条窗口只影响某个特定的父窗口,因此可能会创建多个对话框,并在进度结束后进行析构销毁。那么在自定义的对话框里析构时发生以下<atlwin.h>的崩溃错误怎么回事?注意: 当前的atl版本是Microsoft Visual Studio 10.0\VC\atlmfc\include.virtual ~CWindowImplRoot() {#ifdef _DEBUG原创 2022-02-18 16:05:12 · 660 阅读 · 0 评论 -
[WTL/ATL]_[C/C++]_[如何给动态创建的按钮绑定处理函数]
场景我们在做 WTL 或 MFC 开发的时候, 是通过消息映射宏来绑定消息处理函数的.如果是窗口里的子窗口需要绑定消息, 那么基本上就是通过子窗口的 ID和类成员方法绑定某个消息处理宏,但是如何才可以绑定动态创建的由系统自动分配ID的窗口(按钮,菜单)呢?动态创建的按钮,我们可能并不知道需要创建多少个,也由于某种原因无法分配指定的窗口ID, 而消息映射宏只能在编译试确定绑定的窗口ID,怎么办?BEGIN_MSG_MAP(CMainFrame) COMMAND_ID_HANDLER(ID_原创 2020-05-09 13:44:43 · 1231 阅读 · 0 评论 -
[ATL/WTL]_[初级]_[自定义多列TreeView]
场景在开发 Win32,WTL,MFC 程序时,经常会用到 ListView 这个表格控件,ListView 的数据是按照行来显示的,行与行之间没有并没有什么关系。但是如果行之间有父子关系,比如像树形控件 TreeView 可以收起展开呢,如何实现?图1说明这种具有列名的 TreeView 可以称为多列 TreeView(ColumnTreeView), 也可以称为 TreeListView. 这种控件它的特点就是 TreeView 有一个表头,拖动表头的分割线可以同步拖动 TreeVie原创 2021-05-16 19:05:21 · 997 阅读 · 15 评论 -
[ATL/WTL]_[初级]_[自定义菜单项字体]
场景在开发WTL程序时,菜单基本都是标配,比如菜单栏菜单,右键上下文菜单,按钮菜单等等。但是如何设置菜单的字体,大小,颜色,或者说自绘菜单?说明我们看WTL提供的CMenu类,并不是一个窗口类,它只是封装了一个HMENU菜单句柄,并不是我们所熟悉的窗口句柄HWND。所以它不会接收到WM_PAINT消息。template <bool t_bManaged>class CMenuT{public:// Data members HMENU m_hMenu;// Cons原创 2020-06-14 10:47:40 · 639 阅读 · 0 评论 -
[WTL/ATL]_[中级]_[自定义按钮2]
场景在自定义按钮1里我们通过处理WM_PAINT消息来达到绘制按钮的目的, 并通过BCN_HOTITEMCHANGE通知来处理鼠标进入和离开状态. 按钮控件有没有其他方式来绘制呢?不需要通过WM_PAINT事件, 并且在绘制前就能知道按钮当前的状态?说明当创建按钮的样式增加BS_OWNERDRAW时, 按钮会接收到WM_DRAWITEM事件. 这时候我们可以通过处理WM_DRAWITE...原创 2019-06-04 15:19:35 · 608 阅读 · 0 评论 -
[WTL/ATL]_[初级]_[使用虚拟列表视图来解决新增大量数据卡顿问题]
场景在使用WTL/ATL开发界面程序时,CListViewCtrl是我们常用的表格控件。但是这个控件有个缺点,就是在连续插入大批量数据,比如10000条数据时,界面基本上是卡死的,而且内容使用量也很可观,怎么解决?说明我们知道WTL的CListViewCtrl实际是对Win32的ListView控件的薄封装,因此ListView的样式对CListViewCtrl也有效. ListView有一个样式是LVS_OWNERDATA, 它用于创建virtual listview,即虚拟列表.这种样式使原创 2021-06-22 14:20:32 · 522 阅读 · 0 评论 -
[ATL/WTL]_[Gdiplus]_[Windows窗口如何显示GIF动画]
场景在使用 WTL 和 Gdiplus 开发界面程序时,我们需要在界面显示 GIF的动画,可惜 WTL 和 Gdiplus并没有执行显示 GIF动画的API. 那我们如何做?说明GIF文件关键的2个参数, 图片的帧数,每帧的时间间隔. 如果能获取到这2个参数,那么我们就可以让帧索引递增,并逐帧绘制图片。获取图片的帧数,可以通过以下方法,我们需要做的是构造方法的参数. 在Imag...原创 2020-05-05 19:01:13 · 747 阅读 · 2 评论 -
[WTL/ATL]_[中级]_[自定义ListView]
场景表格是我们常用的管理数据控件之一, Win32的标准表格控件默认只显示文本数据,如何在单元格里显示图片? 如何显示复选框,可以够选整行?表格是的特点是带分割线,以列和行显示数据的控件,我们是否可以通过响应WM_PAINT消息来全部绘制?为什么说响应WM_PAINT消息绘制表格不容易实现?表格的表头能加上一个复选框的按钮吗? 这样可以实现全选的功能.说明WTL封装...原创 2019-06-16 22:41:12 · 1203 阅读 · 2 评论 -
[ATL/WTL]_[初级]_[在ListView指定的单元格显示ToolTip]
场景WTL里CListViewCtrl是常用的显示表格数据的类. 有时候我们需要在表格的某个单元格显示一个按钮,并且鼠标移动上去时按钮有状态变化;或者显示这个按钮的一个ToolTip提示。如何做?说明要在表格的指定Cell或者某个鼠标位置发生消息响应。最后选的方案就是子类化CListViewCtrl,并响应WM_MOUSEMOVE消息,之后就是在这个消息里通过得到的坐标点计算得出nItem行和nSubItem列. 再来处理现实显示单元格内的按钮或ToolTip问题。但是这种方案需要在CList原创 2020-11-26 13:55:55 · 713 阅读 · 0 评论 -
[WTL/ATL]_[中级]_[自定义按钮1]
场景在开发软件界面时,往往美工设计的界面按钮都不会是标准按钮,因为标准按钮是固定的样式风格和对齐方式,如果用标准的按钮就会和软件的设计风格,颜色不搭. 所以在开发软件是界面时,自定义按钮往往是最常用到的功能. 可是如何实现?按钮有最常见的响应按钮事件,有正常显示时的状态,鼠标移动上去时颜色会改变,鼠标点击时也有按下去的效果. 还有按钮上左边居中有特定的图标,或者按钮按下去之后保留按下去...原创 2019-06-04 11:48:13 · 655 阅读 · 0 评论 -
[ATL/WTL]_[初级]_[关于单行CEdit的响应回车和多行CEdit响应按键全选的问题]
场景在开发WTL或Win32程序时,经常会用到文本框CEdit控件,而这个控件的单行样式并不支持回车事件. 比如需要回车来响应查询,怎么办?在使用CEdit的多行样式ES_MULTILINE时,它默认也是不支持快捷键CTRL+A的全选操作,怎么搞?说明一般在开发搜索查询界面时,输入查询关键字并回车是通用的做法了,要对CEdit添加回车事件,需要监听WM_KEYDOWN消息并针对回车按键进行消息转发。我们可以设置一个C++11 function[1]对象来进行操作。因为这个对象很容易封原创 2021-04-28 15:50:02 · 491 阅读 · 0 评论 -
[ATL/WTL/Win32]_[初级]_[获取指定目录的大小]
场景在开发Win32或WTL程序时,我们需要获取某个目录的磁盘空间占用量显示出来,以便用户根据占用量进行对下一步的业务进行处理?那么Win32或WTL有没有统计目录的占用空间大小?说明Win32和WTL的函数里没有统计这方面的函数,所以得自己去写。而计算目录的大小一般就是枚举目录并且对子文件的大小进行累加(目录名不占空间)。关键函数就是3个目录枚举函数,它们只枚举当前目录,不会枚举子目录. 如果需要枚举子目录,那么还需要进行递归回调。FindFirstFileFindNextFileFi原创 2021-03-03 23:07:44 · 282 阅读 · 1 评论 -
[ATL/WTL]_[初级]_[关于不要使用ListView的SetItemData原因]
场景在开发WTL程序时, 我们会用到CListViewCtrl[1]这类列表控件。它的其中一种样式LVS_REPORT和我们常见的表格是一样的,有表头和行数据。问题是,有时候数据太长并不适合显示在每行的单元格里。比如路径,地址,描述等,需要时可以单击每行再显示一个详细页,就像编辑手机通讯录时一样。那么不显示在行内的数据可以通过函数SetItemData关联到每一行吗? 点击的时候再通过GetItemData取回.listview_.SetItemData(i,(DWORD_PTR)photo);原创 2021-02-25 14:25:16 · 462 阅读 · 0 评论 -
[ATL/WTL]_[初级]_[关于自定义容器窗口和调用CreateWindowEx创建窗口的区别]
场景在开发WTL程序时,有时候会需要一些简单的容器窗口来存放子控件(窗口),有了容器窗口,可以通过管理容器窗口的大小,显示隐藏等来统一管理它的所有子窗口,那么WTL有提供容器窗口吗?能否不新建一个子类通过组合的方式来管理子控件?说明目前WTL没有发现可以直接使用的容器窗口,但是可以通过CreateWindowEx或CWindow::Create来创建容器窗口。// 通过CreateWindowEx或者是CWindow::Create创建 const wchar_t CLASS_NAME[]原创 2021-02-24 18:20:42 · 505 阅读 · 0 评论 -
[ATL/WTL]_[中级]_[如何导出自定义的WTL的模板窗口类和实用的自定义按钮]
场景开发WTL程序时,因为WTL的类是基于模板的,在实现自定义控件时往往需要继承CWindowImpl, 这时如果把自定义的类导出为Dll接口,那么就会出现大量的警告,如果类还有基于STL的成员属性(如string),那么也会出现C4251[1]的警告。怎么解决?说明导出类继承了模板类时,在Windows上出现的错误和警告会比较多,在macOS上没问题。解决办法也是使用在Windows上导出C++类的动态库的方案,使用一个包裹类来封装需要的方法(public修饰的), 之后实现文件通过代理转发实原创 2021-02-24 10:56:28 · 384 阅读 · 0 评论 -
[ATL/WTL]_[Gdiplus]_[关于混用GDI和GDI+(GDIPlus)导致显示不正常的解决方案]
场景有一次开发WTL窗口时,使用GDI的CMemoryDC来绘制中文文字显示不出来,但是文字改为英文就绘制出来的,确认字符集,字体,坐标都没问题,那是什么情况?说明在开发WTL程序时, 我们有时候会容易混合使用GDI和GDI+,比如使用GDI的CDC的方法RoundRect绘制圆角矩形,而GDI+没有类似的方法。同样,使用GDI+轻松绘制png图片,而GDI绘制需要繁琐的转换。但是,实际上,微软MSDN文档说明GDI和GDI+是不能混用的,上边的绘制不出来中文就是混用导致的结果之一。微软原创 2020-07-31 11:11:17 · 1539 阅读 · 0 评论 -
[ATL/WTL]_[初级]_[自定义的窗口为什么调用SetFont后无效-GetFont为NULL]
场景在WTL开发时,我们开发自定义的窗口类,继承自CWindowImpl,而这个类自带有SetFont和GetFont方法. 问题是调用了这个SetFont方法,之后在调用GetFont方法返回的HFONT是NULL, 怎么回事?说明在CWindowImpl类里,SetFont方法实际上就是发送了WM_SETFONT消息. 而WM_SETFONT的API并没有说明提示设置字体不生效的情况。事实上,查阅网上的资料,对于自定义的控件(即内部是自定义WNDCLASS),不是系统自带的默认控件,系统不原创 2020-06-21 21:00:01 · 851 阅读 · 0 评论 -
[WTL/ATL]_[C/C++]_[DispatchAsync使用lambda表达式来简化发送数据到界面线程]
场景在进行 Win32 界面编程时,更新界面内容只能通过主线程进行更新. 那么如果是在工作线程执行完逻辑后如何通过把数据传递给界面线程更新数据?在 Windows 上开发界面我是使用轻量级 Win32框架, MFC 的精简版 WTL 进行开发,那么在 WTL 开发时如何把数据传递给界面?说明我在这篇博客里《Win32实现Cocoa的dispatch_async到主线程的异步...原创 2020-04-21 11:02:51 · 640 阅读 · 0 评论 -
[WTL/ATL]_[初级]_[关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS样式的说明]
场景1.在Win32窗口开发或基于Win32的WTL库开发时,我们经常创建新窗口或新控件都会使用WS_CLIPSIBLINGS | WS_CLIPCHILDREN两个属性, 那么这两个属性有什么用呢?好像不加也没问题.2.有时候我们刷新或拉伸父窗口时,它的子控件移动后会显示透明,看起来像是没绘制一样.什么原因?说明WS_CLIPCHILDREN: 这个样式如果设置了,父窗口刷新指定区域时,...原创 2019-12-29 17:10:50 · 824 阅读 · 0 评论 -
[WTL/ATL]_[初级]_[关于CCombobox的下拉列表背景色是黑色的问题]
场景1.在使用WTL的CComboBox类时,我们创建时还是需要传递样式的,这样导致用的时候颇为麻烦,只能通过查找MSDN获取样式.当我们使用样式为CBS_DROPDOWN的时候,添加完数据后发现下拉列表的背景色是黑色的,感觉是不是Win32有缺陷啊.先不管是不是Win32的系统Combobox是否有缺陷,这个问题怎么解决?图示1:说明1.WTL的项目基于消息映射原理我们已经讲过,如果需...原创 2019-12-29 15:23:31 · 1290 阅读 · 1 评论 -
[WTL/ATL]_[初级]_[计算CLinkCtrl的合适大小]
场景1.Win32的SysLink不会自动根据设置的文本设置超链接的大小,这点很低级. 一般我们用CLinkCtrl时还需要自己设置超链接的坐标和大小,很不方便。但是我们如何知道一个SysLink的最小宽度到底是多少呢?要不停的运行修改到合适吗?说明1.在Winxp里需要自己根据显示的字符串计算字符串的长度,之后根据这个字符串的长度来设置SysLink的长度,当然这个长度是排除了HTML的标...原创 2019-12-29 14:06:13 · 632 阅读 · 0 评论 -
[WTL/ATL]_[初级]_[设置超链接字体颜色]
场景1.在开发WTL(Win32)程序时,超链接控件是很常见的,比如需要跳转网页或者打开本地文件夹等,都需要用到。Win32本身就有提供系统自带的WC_LINK控件,而我们用WTL有相应的封装类CLinkCtrl<atlctrls.h>.2.有时需要根据界面的颜色主题需要修改超链接的颜色以适配界面。但是CLinkCtrl并没有提供修改字体颜色的方法, 而微软的MSDN里对Link也...原创 2019-12-29 11:13:06 · 896 阅读 · 0 评论 -
[WTL/ATL]_[初级]_[无边框窗口拉伸]
场景在开发无边框的窗口时,没有了系统自带的边框后,也需要我们自己对界面进行编码拉伸. 如何实现?如果想保留系统自带的边框,不想自己编码实现界面拉伸如何做?说明如果需要自带系统的边框,那么在创建窗口时加上WS_SIZEBOXif(wndMain.CreateEx(NULL,NULL,WS_SIZEBOX|WS_CLIPCHILDREN | WS_CLIPSIBLINGS|W...原创 2019-06-14 11:44:28 · 1108 阅读 · 6 评论 -
[WTL/ATL]_[Gdi/Gdiplus]_[实现双缓冲]
场景使用Gdi绘制文本,线条或图片(Gdiplus)时,如果HDC调用的次数过多,就会出现闪烁的现象, 怎么解决?如果我用Gdiplus::Graphics进行绘制文本,线条或图片时, 不使用HDC的相关DrawText方式时, 又如何解决闪烁问题?说明WTL提供了CDC类对HDC进行封装处理, 比如常用到的CMemoryDC,CClientDC,CPaintDC等. CM...原创 2019-06-04 16:20:45 · 1184 阅读 · 1 评论 -
[WTL/ATL]_[初级]_[选择文件或文件夹]
场景之前在文章选择目录对话框里介绍了打开对话框选择文件夹的方法. 但是这两种方式总也有些小问题. 不建议使用了。如果选择文件和文件夹都需要那么麻烦的话, WTL界面库按道理来说应该会集成了这类工具类.说明在WTL库里其实就有两个类来选择文件或文件夹CFileDialog和CFolderDialog, 在MFC里有CFileDialog和CFolderPickerDialog...原创 2019-05-31 14:51:17 · 929 阅读 · 0 评论 -
[ATL/WTL]_[Gdiplus]_[实现按钮的阴影效果]
场景在WTL开发时, 由于界面需要, 很多按钮都是奇形怪状的. 比如卡片形状, 圆角矩形等等. 只要是点击能响应一个事件的, 我们都可以看做是一个异形按钮. 其中让按钮呈现立体效果, 动画效果等一直是实现自定义按钮的难点.系统按钮一般是带3D效果的按钮. 我们这里实现自带阴影效果的按钮一样具备很好的特效, 阴影按钮特别适合在面积比较大的卡片按钮上.说明Gdiplus窗口实现...原创 2018-10-29 10:05:31 · 1006 阅读 · 0 评论 -
[ATL/WTL]_[Gdiplus]_[关于使用Gdiplus来绘制反锯齿的圆角矩形]
场景在使用WTL或MFC开发自定义按钮时, 往往美工设计的按钮都时圆角矩形的. 用GDI的函数RoundRect函数可以简便的绘制圆角矩形, 但是如果椭圆(ellipse)的宽高比较大的时候, 按钮比较大. 这时候按钮的圆角矩形看起来就是有锯齿的(aliasing).在GDI的函数里, 没有比较好的函数来实现抗锯齿(antialias), 如果不想自己去解决锯齿效果, 只能使用Gdip...原创 2018-10-27 23:21:59 · 1872 阅读 · 0 评论 -
[ATL/WTL]_[Gdiplus]_[关于使用Graphics::DrawString替换DrawText的说明]
场景在开发WTL或MFC程序时, 绘制文本往往会使用标准的CDC::DrawText函数, 其实也就是调用了GDI的DrawText函数, 但是这个函数绘制出来的文字显示出来的效果会比记事本显示的效果差?什么原因呢.GDI在绘制文本, 线条时总是感觉比较粗糙, 边缘总是有锯齿, 不够平滑.说明因为GDI绘制图形时并没有消除锯齿的效果, 绘制出来的文本线条边缘是不平滑的, 这...原创 2018-10-19 15:44:33 · 1317 阅读 · 0 评论 -
[ATL/WTL]_[初级]_[Win32实现Cocoa的dispatch_async到主线程的异步消息处理]
场景1.写界面程序时, 大多是底层部分需要至少一个工作线程来处理逻辑, 避免使用主线程导致界面卡顿, 当底层线程处理数据完毕后, 需要转发到主线程绘制数据. 因为非绘图线程绘制数据会导致不可预料的问题, 一般情况下会导致程序莫名其妙崩溃,多线程同时调用绘制函数会导致资源冲突,而且冲突可能会在特定情况下才发生,不易察觉.2.工作线程发送数据到主线程,Win32消息处理一般有几种方式 PostMessa原创 2017-10-27 10:10:14 · 2614 阅读 · 0 评论