VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 590|回复: 5

请教一个关于CDC::SelectObject()的问题

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-2-13 16:30:01 | 显示全部楼层 |阅读模式

以下是MSDN中的一段代码,我已经把它们靠到VC中,可以运行,但有几个地方为什么这样用呢?

void CBrushView::OnDraw(CDC* pDC)
{
   CBrushDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);

   // CBrush::CBrush.
   CBrush brush1;   // Must initialize!
   brush1.CreateSolidBrush(RGB(0,0,255));   // Blue brush.

   CBrush* pTempBrush = NULL;
   CBrush OrigBrush;

   CRect rc;
   GetClientRect(&rc);
   ScreenToClient(&rc);    // 这里似乎没有必要吧!

   pTempBrush = (CBrush*)pDC->SelectObject(brush1);
   
   //SelectObject()参数应该是一个指针吧!为什么这样也可以呢?
   
   // Save original brush.
   OrigBrush.FromHandle((HBRUSH)pTempBrush);

   // Paint upper left corner with blue brush.
   pDC->Rectangle(0, 0, rc.Width() / 2, rc.Height() / 2);

    // Reselect original brush into device context.
   pDC->SelectObject(&OrigBrush);
}

修改成这样后,也就是把 OrigBrush 换成了指针,

编译可以通过,但运行时会弹出错误报告!!

   CBrush *OrigBrush;
   …
   OrigBrush = (CBrush*)pDC->SelectObject( brush1 );

   // Paint upper left corner with blue brush.
   pDC->Rectangle(0, 0, rc.Width() / 2, rc.Height() / 2);

   // Reselect original brush into device context.
   pDC->SelectObject(OrigBrush);

大家赐教了!!!


回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-4-12 09:30:01 | 显示全部楼层
ScreenToClient(&rc);   
这一句是把屏幕坐标转换成客户区坐标,当然有用。
   OrigBrush.FromHandle((HBRUSH)pTempBrush);
这一句是不必要的,OrigBrush变量也是多余的,只要
   pDC->SelectObject(&OrigBrush);
这句就够了,目的是释放添加到pDC里面的刷子资源。
  pTempBrush = (CBrush*)pDC->SelectObject(brush1);
这句应该写成:
  pTempBrush = (CBrush*)pDC->SelectObject(&brush1);
至于楼主这样编译也能通过,我没试过,不清楚,但肯定不对。
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-5-2 11:30:01 | 显示全部楼层
to 卐瞎子卐:
   ScreenToClient(&rc)的前一句GetClientRect(&rc)获得的已经是客户区坐标了,注释   ScreenToClient(&rc)之后程序也能正常运行;
   定义OrigBrush是为了保存原始画刷,因为pDC->SelectObject(brush1)返回值是一个指针;
   SelectObject()中本应传递指针变量的,但pDC->SelectObject(brush1)是msdn中的用法啊! 为什么传递对象也可以呢?在msdn中并没有这样的函数定义!!


回复

使用道具 举报

1

主题

11

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-5-6 20:00:01 | 显示全部楼层
CBrush,CPen等的基类CGdiObject有操作符CGdiObject::operator HGDIOBJ() const
而CDC有CDC::SelectObject(HGDIOBJ hObject)
所以CBrush自动转换成了HGDIOBJ
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-6-1 13:15:02 | 显示全部楼层
to huanwu:

   在msdn中找到了CBrush::operator HBRUSH() const

   和 CDC::SelectObject( CBrush * );

   但没有发现发现你说的那两个函数原型,也没有CDC::SelectObject( HBRUSH ),
   
   是不是句柄也可以当指针来用呢?句柄就是指针?
回复

使用道具 举报

1

主题

11

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-6-24 09:45:01 | 显示全部楼层
CDC::SelectObject(HGDIOBJ hObject)是内联函数没有写出来
按F11调试可以看见
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表