请问怎样设置裁减区?

newkaka1981 2006-08-22 06:57:14
我把画图的代码写在OnDraw里面,然后想在菜单命令中设置视图的裁减区,可是没有任何效果。该菜单命令代码如下:

void Cdraw_functionView::OnTESTSelectClipRgnOn()
{
// TODO: Add your command handler code here
CDC *pDC3 = GetDC();

int nRgnX,nRgnY;
nRgnX = nRgnY = 1;

CRgn Rgn;
Rgn.CreateRectRgn( nRgnX, nRgnY, nRgnX + 200, nRgnY + 200 );

pDC3->SelectClipRgn(&Rgn);
Invalidate();
}

如果我把以上代码放到OnDraw里面去,并且把其中的pDC3换成OnDraw自己的参数pDC,则可用。

是不是GetDC()返回的CDC指针和OnDraw里面传入的CDC指针不一样?那我怎样才可以在其他函数中获得和OnDraw参数一样的CDC指针呢?

或者说我在菜单命令中重设CDC裁减区的功能应该如何实现呢?
...全文
186 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
newkaka1981 2006-08-23
  • 打赏
  • 举报
回复
pDC3是通过GetDC获得的,难道这个获得的DC不是当前的DC吗?那如果我想获得当前的DC改如何做呢?
youngwolf 2006-08-23
  • 打赏
  • 举报
回复
SelectClipRgn被选入了pDC3,但Invalidate();后,DC就再也不是pDC3了,应该放在OnDraw里面。注意,上面没有调用ReleaseDC,这是很严重的。
newkaka1981 2006-08-23
  • 打赏
  • 举报
回复
差别应该很大吧?这段代码如果写在OnDraw里面就有效,可是如果写在其他函数调用里面就无效,哪位知道为什么?该如何解决?
youngwolf 2006-08-23
  • 打赏
  • 举报
回复
你在菜单命令建好区域(类变量),然后在视图的OnPaint等类似函数里(这种函数会传递一个CDC指针)SelectClipRgn不就行了,很简单的啊。
newkaka1981 2006-08-23
  • 打赏
  • 举报
回复
那也就是说无法实现在菜单命令里设置当前视图的裁减区的功能了?
youngwolf 2006-08-23
  • 打赏
  • 举报
回复
CDC是一个MFC类,就像CWnd一样,每次GetDC,都是不一样的,你
CDC *pDC3 = GetDC();
...
pDC3->SelectClipRgn(&Rgn);
Invalidate();

其实什么都没做,只有在使用CDC之前SelectClipRgn才有用,这就是为什么画线啊,写字函数前面都有一堆SelectObject,如果你那样也行,那么只需要在初始化函数里一次性SelectObject就行了,其实不行。
你找一些专业的自绘控件看看,在OnPaint,OnDraw等函数里,前面总是一堆SelectObject,因为每次运行到OnPaint,OnDraw等函数里时,都生成了一个新CDC,记住一个原则,只有句柄是不变的,其它的都是可变的。你在MSDN中GetDC函数,会有一句很显眼的话,告诉你,不可将本函数的返回值保存供以后使用,它可能是临时的,类型这样的函数还有很多,这是MFC的特点,比如GetDlgItem等等。
superarhow 2006-08-23
  • 打赏
  • 举报
回复
为啥不把CRgn定义成一个成员变量?
cenchure 2006-08-22
  • 打赏
  • 举报
回复
功能上并没有区别

15,979

社区成员

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

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