可变大小的椭圆窗口,移动时闪烁问题

csdnone 2008-01-30 05:20:36
大家好:

我要做一个椭圆窗口,从边上平滑移动到屏幕中央,移动过程中窗口要求由小变大。
但是在移动过程中,窗口闪烁很厉害。

我是这样做的:在需要移动时,OnTimer事件中:
1、计算窗口新的尺寸和位置
2、调用MoveWindow函数移动窗口到新的位置
3、给窗口创建新的大小的椭圆区域:
CRgn rgn;
rgn.CreateEllipticRgnIndirect(&rc);
SetWindowRgn( (HRGN)rgn, FALSE );
4、在OnPaint事件中,用拉伸位图的方式,双缓冲绘图

在调试过程中发现,当执行到SetWindowRgn这句时,创建的窗口区域右边会出现黑边框,感觉区域向右偏移了。
创建方形的区域则无此问题。

请问,是我的处理流程不对吗?该怎么解决?

谢谢大家。
...全文
197 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
liln0530 2008-02-01
  • 打赏
  • 举报
回复
void CtesetView::OnDraw(CDC*pDC)
{
CRect rectClient;
GetClientRect(rectClient);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000, 1000);
pDC->SetViewportExt(rectClient.right, -rectClient.bottom);
pDC->SetViewportOrg(rectClient.right/2, rectClient.bottom/2);
pDC->Ellipse(CRect(-500, -500, 500, 500));


// TODO: add draw code for native data here
}


我用MFC这样写的好像不会闪,LZ看看有用没有
youyifang 2008-01-31
  • 打赏
  • 举报
回复
橡皮线实现的时候,只是用鼠标控制的不断移动,现在你拉动窗体来移动是一样的。我这里只有用鼠标移动绘制图形的例子,没有去实现移动窗体来实现的例子,已发到你的邮箱(由于没有采用双缓冲,有点闪,不过你看下思想就可以了)。
csdnone 2008-01-31
  • 打赏
  • 举报
回复
谢谢wdq0916,你的代码是直接在屏幕dc上绘制一个椭圆,跟我遇到的问题不一样。呵呵。
wdq0916 2008-01-31
  • 打赏
  • 举报
回复
我发你邮箱了,收到了吗
csdnone 2008-01-30
  • 打赏
  • 举报
回复
wdq0916:
我的邮箱是:chatone@163.com

Mackz:
这个方法我试了,不行,我觉得是切割的椭圆有问题,
rgn.CreateEllipticRgnIndirect(&rc); 这句话中的rc区域是窗口的矩形区域,应该没有问题吧?

youyifang:
有没有例子?或者给出关键代码。

谢谢大家。

wdq0916 2008-01-30
  • 打赏
  • 举报
回复
邮箱我发给你看看有用吗?
wdq0916 2008-01-30
  • 打赏
  • 举报
回复
我这有个例子只是改变椭圆大小 不改变位置的例子
菜牛 2008-01-30
  • 打赏
  • 举报
回复
我想你在改变窗口大小和位置之前调用一下LockWindowUpdate试试,别忘了解锁。
youyifang 2008-01-30
  • 打赏
  • 举报
回复
直接计算移动比例后,用橡皮线的绘制方法取消原先的那个,重新绘制一个新的,处理好的话是没有闪烁的。

15,979

社区成员

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

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