CxImage 显示图像

这一环节中涉及到的CDC类的成员函数:
1. Virtual int GetClipBox(lpRect) const // 获取裁剪区域到Rect里,值得注意的是它是逻辑坐标系下的坐标,故需要使用CDC类的成员函数LPtoDP()将其转换为设备坐标下的坐标;这是因为下面用到的一个函数CreateCompatibleBitmap使用的是设备坐标系。
2. Bool IsPrinting() const // Determines whether the device context is being used for printing.
3. Virtual BOOL CreateCompatibleDC(CDC *pDC) // 创建一个与pDC所指向的设备相兼容的内存DC, 而内存DC的作用是"It can be used to prepare images in memory before copying them to the actual device surface of the compatible device", 此处"images"是我们在DC上“绘图”所得到的图片;既然要在DC上“绘图”,那就要有相应的画布(CBitmap),画笔(CPen),画刷(CBursh)等工具。讲到这里,就不得不提到CBitmap类的一个成员函数:
BOOL CreateCompatibleBitmap(pDC, nWidth, nHeight) //初始化一个位图(默认为白色),使得该位图跟由pDC所指定的设备相兼容;然后我们通过CDC类的另一个成员函数:SelectObject()将其选入DC作为画布,之后所有的绘图操作都在该画布上进行。
4. SetMapMode() //设置逻辑坐标与设备坐标的映射模式;
5. GetMapMode() //获取逻辑坐标与设备坐标的映射模式;
6. GetBkColor() // 获取DC当前的背景颜色;
7. SetBkColor() //设置DC当前的背景颜色;
8. FillSoildRect(...) //用指定的颜色填充给定的区域;
9. BitBlt(...) //从一个源DC中拷贝位图到当前DC。如果当前DC是设备DC(比如显示器屏幕),源DC是内存DC话,那么就是将位图从内存DC拷贝到显示器屏幕上。

 

Demo中就是使用以上这些函数来从CDC类中派生了一个内存DC:CMemDC,如下:

类的结构
内存DC的主要目的是防止窗口重绘时出现闪烁的问题。所以要先在内存上绘图,然后一次性将在内存中绘制好的图片显示到屏幕上。在Demo里,该类是这么使用的:

void CDemoView::OnDraw(CDC* pDC)
{
    CMemDC *pMemDC = NULL;
pDC = pMemDC=new CMemDC;
Delete pMemDC;
}
这么使用就产生了两个问题:一,pDC是CDC类的,而pMemDC是CMemDC类的,它们之间能够进行赋值吗;二, 即使它们能够进行赋值,pDC也就变成了内存DC而原先的设备DC就消失了。这样我怎么在显示器上进行绘图呢?
释疑:首先,对于第一个问题。从孙鑫的视频第二章我们知道:对于一个派生类,它的内存结构分为两个部分,一部分是其父类的内存结构,另一部分是其新增加部分的内存结构。所以,让派生类的对象赋值给父类的对象是可行的。接下来我们应该考虑的一个问题是,CMemDC的构造函数对其第一部分的内存结构作了哪些改变。通过观察其成员函数Construct,可以发现其父类的内存结构发生了如下的变化:一是通过CreateCompatibleDC(pDC),使其成为另一个内存DC;二是将设备兼容位图bitmap选入了DC;这两个变化使pDC = pMemDC其成为了一个完整的内存DC。其次,对于第二个问题。要从OnDraw的最后一条语句去考虑pMemDC发生析构的时候情况发生了什么变化。事实上,在pMemDC的成员变量m_pDC内保存了原来的设备DC,当该对象发生析构的时候它调用了m_pDC的BitBlt将内存DC的图片复制到了显示器屏幕上。至此所有的问题都得到了圆满的解决。

附录:函数统计
CDC类
1. FillRect(...) //用指定的画刷填充给定的区域
2. GetSafeHdc() //获取DC句柄
CxImage类
1. Void copy(const CxImage &src, ...) // copies the image from an existinag source.
2. Long Draw(...)// Draws the image in the specified device context

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值