游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2109|回复: 6

请求援助

[复制链接]

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
QQ
发表于 2009-1-12 08:33:00 | 显示全部楼层 |阅读模式
来着自定义的简单gdi中的一个函数
void StartDrawing(HDC hdc)
  {
    assert(m_hdc == NULL);
   
    m_hdc = hdc;

    //get the current pen
    m_OldPen = (HPEN)SelectObject(hdc, m_BlackPen);
    //select it back in
    SelectObject(hdc, m_OldPen);

    m_OldBrush = (HBRUSH)SelectObject(hdc, GetStockObject(BLACK_BRUSH));//这里已经替换,
                                                     //现在绘图的画刷就是我们想要的画刷。
    SelectObject(hdc, m_OldBrush);//这里将原来的画刷又拿回去了

//问题是这是在一个告知开始绘画的函数中,要用的画刷刚刚拿起来还没有使用就又放回去了?
//SelectObject(hdc, m_OldBrush);放在那里不明白他的用意?
  }

[em7] [em24]

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2009-1-12 11:37:00 | 显示全部楼层

Re:请求援助

不懂。。。
这个函数执行完以后,PEN 和 BRUSH 应该都没有变化。。还是原来的..
但是它在中间把 PEN 和 BRUSH 分别拿出来,又分别放回去,到底是啥意思???

期待高手。。。。

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2009-1-12 11:51:00 | 显示全部楼层

Re:请求援助

哦~~~~
看了一会儿,好像明白这个函数的意思了

m_OldPen 和 m_OldBrush 应该是类当中的数据成员,并且在初始化的时候被赋值为:NULL

这个函数的功能就是对这两个数据成员赋值,用他们来保存指定 DC 的当前的 PEN 和 BRUSH。

    //随便选一个 PEN,把当前 PEN 的值赋给 m_OldPen,于是 m_OldPen 保存了当前的 pen  的值
    m_OldPen = (HPEN)SelectObject(hdc, m_BlackPen);
    //为了不改变当前 PEN 的设置,再把 m_OldPen 选入DC
    SelectObject(hdc, m_OldPen);

BRUSH 部分的代码意思也一样
不过我觉得,如果是这个意思的话,应该把 m_OldPen 和 m_OldBrush 的名称改为: m_CurPen 和 m_CurBrush,这两个名字也许更合适。。。。

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-1-12 12:17:00 | 显示全部楼层

Re:请求援助

使用GDI在修改DC当前对象后,绘制完要手工恢复原来的对象,以便其他程序能有正确的初始值,这是从伪多任务的Window 3.0时代继承下来的API。

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
QQ
 楼主| 发表于 2009-1-12 13:29:00 | 显示全部楼层

Re: Re:请求援助

qrli: Re:请求援助

使用GDI在修改DC当前对象后,绘制完要手工恢复原来的对象,以便其他程序能有正确的初始值,这是从伪多任务的Window 3.0时代继承下来的API。

哇!高手  写的好专业啊!
[em16]你的意思是不是说在m_OldPen = (HPEN)SelectObject(hdc, m_BlackPen);执行时这步就用选定的画笔去绘制图案,当这步执行完时所要绘制的图案已经绘制完了。后面的返回原来的值,可以看做是对这个DC的一次赋初值,好让画刷继续用它。
  [em24]

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2009-1-12 16:28:00 | 显示全部楼层

Re:请求援助

楼主啊。。。你贴出来的这个函数,其实就是一个初始化类的数据成员的过程

qrli 兄弟说的意思是:
每次改变了 PEN , BRUSH 或者其他的可以 SelectObject 的对象(例如,Font)之后,都要把原来的对象交还给DC。。。

比如:
m_OldPen = (HPEN)SelectObject(hdc, m_BlackPen);
DrawSomething();
SelectObject(hdc, m_OldPen);

第一行代码,把指定DC的 PEN 换成 m_BlackPen,并且把DC中原来的 PEN 保存起来
第二行代码,用  m_BlackPen 画你要画的东西。
第三行代码,把DC原来的 PEN ,也就是在第一步中得到的 “m_OldPen”交还给DC

具体到你给的这个函数,实际上并没有任何绘图过程,所以只是单纯的把当前DC的 PEN 和 BRUSH 保存到 m_OldPen 和 m_OldBrush 这两个变量中。。。

m_OldPen = (HPEN)SelectObject(hdc, m_BlackPen);执行时这步就用选定的画笔去绘制图案,当这步执行完时所要绘制的图案已经绘制完了。


SelectObject函数不是用来绘图的。。。。它只能给绘图做一些准备工作。。

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
QQ
 楼主| 发表于 2009-1-12 18:52:00 | 显示全部楼层

Re:请求援助

哦   了解了!!    谢谢draculamx
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 12:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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