社区
ATL
帖子详情
为什么我写的Activex控件,切换窗口后画的图就没有了
小崔爱读书
2010-02-04 12:08:36
各位,我用ATL做了一个Activex控件,用于在web页面上接受用户的手写签批输入,我可以做出这个Activex控件,也可以在上面用鼠标模拟画图签字,但只要我一切换窗口,或者这个ActiveX控件被其他窗口遮盖住,所有的背景、我画的图就都没了,我不知道是不重绘还是什么意思。或者是我取的DC错了?我使用的getDC(m_hWnd)取的DC,应该也没问题吧。希望谁给点儿知道意见。谢谢。
...全文
365
25
打赏
收藏
为什么我写的Activex控件,切换窗口后画的图就没有了
各位,我用ATL做了一个Activex控件,用于在web页面上接受用户的手写签批输入,我可以做出这个Activex控件,也可以在上面用鼠标模拟画图签字,但只要我一切换窗口,或者这个ActiveX控件被其他窗口遮盖住,所有的背景、我画的图就都没了,我不知道是不重绘还是什么意思。或者是我取的DC错了?我使用的getDC(m_hWnd)取的DC,应该也没问题吧。希望谁给点儿知道意见。谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sjdev
2010-02-04
打赏
举报
回复
没有。
你说的方法,除非是窗口一直在最上,不然一重绘就没了。
小崔爱读书
2010-02-04
打赏
举报
回复
这个有点儿不合适吧?我知道你这样说的可以实现,但不应该这么处理的。Windows窗口岂会没有自己的一块儿内存来保持它上面绘制的东西啊?还需要我手动来处理这个吗?并且如果我做的是一个普通windows应用,在上面手动画图,绝对不需要我组织一个链表的。
有没有更符合windows原理的一些方法?我觉得应该是某些项或参数我没有设置对,或者我没有继承和实现某些接口,谁能给点儿指导?
sjdev
2010-02-04
打赏
举报
回复
你如果StartPoint和EndPoint不记录下来,那当然没法显示了。
sjdev
2010-02-04
打赏
举报
回复
你得定义一个point的链表,每次操作时,把相应点放到链表中。
OnDraw函数中,不考虑操作。
只考虑把这些点显示出来。
当然了,最好把数据做一下封装。
譬如线,可以封装它的点。
譬如圆,可以封装它的圆心和半径。
小崔爱读书
2010-02-04
打赏
举报
回复
我试了一下,不行的,假设我先得处理背景吧,我应该在OnDraw中FillRect吧?如果我只是写FillRect这是可以的,因为每次切换或有窗口遮盖其上的时候,就不停的调用OnDraw,自然背景就总是正确的,但如果我是相应鼠标事件来绘图在上面的话,那么我把开始的Point和最终的Point发送给OnDraw,然后LineTo一下画出线,随着我的鼠标移动StartPoint和EndPoint都是不断变化的,一旦切换窗口或遮盖其上的时候,鼠标画出的东西是根本不会显示出来的。
小崔爱读书
2010-02-04
打赏
举报
回复
哦,你的意思是要把数据传递给onDraw方法来绘图?
谢谢。我试试啊。
小崔爱读书
2010-02-04
打赏
举报
回复
之前也写过几个窗口上绘图的程序,不过没写过web activex控件,没想到这个这么腻歪,不知怎么回事儿。
sjdev
2010-02-04
打赏
举报
回复
[Quote=引用 3 楼 cuipy 的回复:]
我是在OnLButtonDown OnLButtonUp onMouseMove这三个时间组合,来实现鼠标画图的。
是移开以后挡住部分消失了,但我用Invalidate也不行的。不知道什么原因。我调用Invalidate了。
[/Quote]
你在这三个函数中更新所绘制的数据是可以的,但真正把数据绘制成图像,应该在Draw(OnDraw)??函数中。
数据更新后,掉Invalidate就ok了。
小崔爱读书
2010-02-04
打赏
举报
回复
我是在OnLButtonDown OnLButtonUp onMouseMove这三个时间组合,来实现鼠标画图的。
是移开以后挡住部分消失了,但我用Invalidate也不行的。不知道什么原因。我调用Invalidate了。
数世纪
2010-02-04
打赏
举报
回复
是挡住的地方移开后没有了?还是挡住部分全部消失?
如果是部分没有,是没有重绘,invalidate就行了,全部消失要再分析一下
sjdev
2010-02-04
打赏
举报
回复
是在Draw函数中画的吗?
小崔爱读书
2010-02-04
打赏
举报
回复
我最后解决了。我想大家说的都是有道理的,不过就100分,平分吧。
我没用链表,将DC存在内存中,然后OnDraw的时候读的内存中的DC,再覆盖一下现在的DC。
fandouC
2010-02-04
打赏
举报
回复
需要用链表保存点坐标的
jameshooo
2010-02-04
打赏
举报
回复
还有好几个概念你还没弄明白,所以解释有点困难。
1、ATL制作的控件可以是有窗口的,也可以是无窗口的,你的是哪一类?
2、不管有没有窗口,你只需重载OnDraw方法,并且用参数提供的HDC来绘制,ATL库内部屏蔽了有窗口和无窗口控件绘制之间的区别,有窗口控件的绘制来源是WM_PAINT消息,无窗口控件的绘制来源是容器对 OnDraw 的调用。
3、无窗口控件重绘必须调用容器的 Invalidate 方法,由容器再次调用控件的 OnDraw 方法执行重绘,不能使用任何窗口相关的API,也不能在 OnDraw 外部绘制。
4、有窗口控件就是一个标准的窗口,所以按照 WM_PAINT 方式绘制一个窗口,可以使用所有的窗口API。
5、所有窗口在大多数情况下都应该在 WM_PAINT 里面执行所有的绘制任务,但不是绝对的,有一些特殊的需求一般在 WM_PAINT 之外绘制,例如用鼠标选择一段文字时文字的背景和前景色变成高亮状态、编辑控件的光标闪烁等等,请记住一个原则,只要是不怕被消掉的就可以在外部绘制,文字高亮在窗口失去焦点时就可以失效,闪烁的光标通过定时器触发时再绘制,它们都不怕被消掉。问题是你的需求不符合这个原则,所以不应该放到外部绘制。还是 SJDEV 说的,你的每一次鼠标操作都应该产生一些数据保存起来,在 OnDraw 中绘制这些数据,这种做法不会导致被擦除。
6、还有一些概念,我都不知道该如何解释起。至于 CS_OWNDC 的作用,在你搞明白基本概念后,再去看看MSDN的解释就能理解了。
小崔爱读书
2010-02-04
打赏
举报
回复
我是用vs.2008开发的,是不是在开始创建组件的时候需要选择什么特别的选项啊?
小崔爱读书
2010-02-04
打赏
举报
回复
是不是因为ATL创建的是一个控件,而不是继承自CWindowImpl的窗口?没有自己重绘DC的功能啊?
小崔爱读书
2010-02-04
打赏
举报
回复
CS_OWNDC 这个是什么啊?我是一个ATL创建的控件,继承的都是一堆接口,另外。。我可以在其他地方绘图,就是绘图完毕后,这个控件一被覆盖后就不自绘之前我画到上面的东西了。连背景都没了。
jameshooo
2010-02-04
打赏
举报
回复
看起来你的控件是有窗口句柄的,这个窗口类是什么?如果是自定义类的话,在RegisterClass时把WNDCLASS::style的值里面加上 CS_OWNDC 标记,你就可以在OnDraw或WM_PAINT之外绘图了。
小崔爱读书
2010-02-04
打赏
举报
回复
必须嘛?我什么也没操作也要调用吗?
wwgddx
2010-02-04
打赏
举报
回复
[Quote=引用 16 楼 cuipy 的回复:]
还有,我的控件不能处理WM_PAINT消息,我一旦创建了这个消息的处理方法,即便我什么代码也不写,cpu也持续100%,弄得我都几乎无法关闭ie窗口。
[/Quote]
WM_PAINT消息必须调用BeginPain();和EndPaint();这两个函数.
加载更多回复(5)
在ATL无
窗口
ACTIVEX
控件
中响应timer消息
本文介绍了如何在ATL无
窗口
ACTIVEX
控件
中响应TIMER消息,以实现类似QQ动态GIF
图
片显示的效果。通过创建一个辅助
窗口
对象,利用其
窗口
句柄设置TIMER,并在辅助类的OnTimer()中调用
控件
对象的换帧函数,从而解决无
窗口
控件
无法响应TIMER的问题。同时,文中也提到了在删除
控件
时防止程序崩溃的注意事项。
ActiveX
网页播放
控件
本文介绍了如何使用VS2008开发一个
ActiveX
控件
,用于在网页上实现分屏播放视频。通过创建MFC
ActiveX
控件
,设计CPlayerGroup、CPlayer和CPlayerItem类,实现不同分屏模式的布局调整,并处理
窗口
尺寸变化时的布局更新,以及用户交互反馈。
ActiveX
交互时浏览器的设置以及
ActiveX
控件
注册的检测
本文围绕
ActiveX
使用中遇到的问题展开,介绍了js无法访问
ActiveX
的解决步骤,包括检测IE是否禁用
ActiveX
、指定
控件
是否注册加载,还给出了IE禁用
ActiveX
及
控件
未注册或未加载的解决办法,如设置受信站点、修改注册表等。
VS2012下制作
ActiveX
控件
并添加到网页
该博客介绍了如何在VS2012环境下制作
ActiveX
控件
,包括创建
控件
、定义接口、部署安装、CAB打包以及在网页中测试的详细步骤。过程中提到了权限问题的解决办法,以及在IE中设置允许
ActiveX
控件
执行的必要性。
ActiveX
是什么?界面开发有哪些好用的
ActiveX
控件
推荐?
本文详细介绍了
ActiveX
控件
的概念及应用,包括安装步骤、解决安装受阻问题的方法,以及推荐使用的
ActiveX
控件
等。
ATL
3,248
社区成员
48,530
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章