如何动态绘制和改变应用程序的图标

如何动态绘制和改变应用程序的图标,第1张

在MFC中,使用CWinApp::LoadIcon函数可将一个图标资源调入并返回一个图标句柄。函数原型如下:

HICON LoadIcon(LPCSTR lpszResourceName)const // lpszResourceName表示图标资源的字符串名

HICON LoadIcon(UINT nIDResource)const // nIDResource表示图标资源的标识

使用系统中预定好的标准图标,这时需调用CWinApp::LoadStandardIcon函数,其原型如下:

HICON LoadStandardIcon(LPCTSTR lpszIconName)const

其中lpszIconName值可以是下列值之一:

IDI_APPLICATION 默认的应用程序图标

IDI_HAND 手形图标(用于严重警告)

IDI_QUESTION 问号图标(用于提示消息)

IDI_EXCLAMATION 警告消息图标(惊叹号)

IDI_ASTERISK 消息图标

全局函数DestroyIcon可以用来删除一个图标,并释放为图标分配的内存,其原型如下:

BOOL DestroyIcon(HICON hIcon) // hIcon指定要删除的图标句柄

图标的绘制

函数CDC::DrawIcon用来将一个图标绘制在指定的位置处,其原型如下:

BOOL DrawIcon(int x, int y, HICON hIcon)

如题,在GDI+中利用多点绘制曲线折线一般用DrawCurve(Pen, Point[])和DrawLines(Pen, Point[])之类的函数,可是这两个函数的第二个参数都要求是纯Point[]数组类型,在绘制动态曲线的时候,显然是要等到程序运行之后才能确定数据,并且数组里的个数也一直在变(第一秒钟有两个点,第二秒钟有三个点,以此类推的增加)。我的想法自然是先定义动态数组 List<Point myPoints = new List<Point()需要点的时候直接Add()就行了,但是你把泛型的myPoints传到DrawCurve(Pen, Point[])里面程序是会报错的,myPoints.ToArray()之后也一样不行。

"希望在绘图的过程中,窗口其他的部分都能点击,不受影响"

最合理的办法,是界面线程,也叫“UI线程”,将动态绘图过程放到子线程完成。不过这个有别于普通的工作线程,如果不熟悉,开发起来有一定难度。(百度 UI线程 有很多资料,不赘述)

折中办法,定时器动态绘图。实现人眼无停顿动态,一般使用50毫秒定时器,只要任务不是很复杂,结合合理的双缓冲绘图,可以实现不影响界面。

我估计,你影响界面,应该是在一个大循环里面做绘图吧,这样窗口消息受到影响,消息环无法响应,界面更新和响应会受到影响。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7889111.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存