VC中 获取CStatic的hdc,用BitBlt函数来连续画图,只是后一张图覆盖前一张,如何解决?谢谢

liulongcan45 2010-02-27 08:46:09
具体问题如下:
CStatic cs701=new CStatic();
cs701->Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP,rcs701,this,IDC_STATIC701);
获得其hdc,连续调用cards.dll中的函数画图:
cdtDraw(hdc,0,0,1,1,RGB(255,255,255));
cdtDraw(hdc,15,0,1,1,RGB(255,255,255));
cdtDraw(hdc,0,0,1,1,RGB(255,255,255));
|————| |——|————| |————|——|
| | | | | | | |
| | | | | | | |
| | | | | | | |
|————| |——|————| |————|——|
以上为各个函数调用后的效果图,希望能看懂。谢谢~
...全文
489 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulongcan45 2010-03-02
  • 打赏
  • 举报
回复
Invalidate()是使窗口某部分成为无效区域,并使WM_PAINT消息进入消息队列,从而调用OnPaint()函数。但该消息优先级低,所以不能实时重绘。而UpdateWindow()则马上发送WM_PAINT消息给窗体,不必经过消息队列,马上执行OnPaint()函数重绘无效区域。

现在本问题中,关键是CWnd::OnPaint()会重绘CStatic的什么内容?当我调用cdtDraw画了一张牌后,直接调用OnPaint(),窗口并不会把该牌清除啊。。。
zhou1xp 2010-03-02
  • 打赏
  • 举报
回复
自己写一个CStatic 的派生类吧,用一个成员变量来控制
arthur____ 2010-03-02
  • 打赏
  • 举报
回复
redraw()。。找找。忘了。
Eleven 2010-03-02
  • 打赏
  • 举报
回复
在画图以前先用背景把绘图区域刷一遍,在绘新图
liulongcan45 2010-03-02
  • 打赏
  • 举报
回复
还是不行~现在的问题是Invalidate(TRUE)的执行过程,如果移动窗口到显示范围以外再移动回来,会触发窗口无效重绘,这是显示出来的正好是想要的结果。但是直接用cs701->Invalidate(TRUE)却没有这种效果,郁闷。
fandh 2010-03-02
  • 打赏
  • 举报
回复
(CStatic*)cs701->Invalidate(TRUE)?
liulongcan45 2010-03-02
  • 打赏
  • 举报
回复
嗯~以上几位的方法试过,关键是我的背景原来就是一张位图(赌桌),要画的扑克牌就放在上面,所以CString的背景应该是透明的,如果用(CStatic*)cs701->SetBitmap(NULL)的话背景显示的是窗口的背景色(一片白色),那么,该用哪个函数来显示空图好呢?
beyonld 2010-03-01
  • 打赏
  • 举报
回复
定义个背景色画刷,切换的时候刷
yhp1888 2010-03-01
  • 打赏
  • 举报
回复
“哦!其实我想问的是:如何实现每调用一个函数就清空一下CStatic的内容,这样每次都只显示一张牌。”
--或者,你显示一个大的空图,来作为清除
yhp1888 2010-03-01
  • 打赏
  • 举报
回复
引用楼主 liulongcan45 的回复:
具体问题如下:
CStatic cs701=new CStatic();
cs701->Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP,rcs701,this,IDC_STATIC701);
获得其hdc,连续调用cards.dll中的函数画图:
cdtDraw(hdc,0,0,1,1,RGB(255,255,255));
cdtDraw(hdc,15,0,1,1,RGB(255,255,255));
cdtDraw(hdc,0,0,1,1,RGB(255,255,255));
|————|        |——|————|          |————|——|
|        |        |    |        |          |        |    |
|        |        |    |        |          |        |    |
|        |        |    |        |          |        |    |
|————|        |——|————|          |————|——| 
以上为各个函数调用后的效果图,希望能看懂。谢谢~


你这个显示本来就是对的。因为后一图的位置不完全是前一图的位置,位置重叠的才会覆盖


“哦!其实我想问的是:如何实现每调用一个函数就清空一下CStatic的内容,这样每次都只显示一张牌。”
--那你就调清除命令呀!
liulongcan45 2010-03-01
  • 打赏
  • 举报
回复
哦!其实我想问的是:如何实现每调用一个函数就清空一下CStatic的内容,这样每次都只显示一张牌。
cpp2017 2010-02-27
  • 打赏
  • 举报
回复
没看懂,lz想问什么?

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧