公司项目,要求做一个设备运行的动画。我首先做了一个图片,发现vc6.0上的picture控件不支持真彩色
显示。于是个人在网上搜了很多资料,这里做一个关于vc6.0图片显示的总结。方便自己,也方便他人。
总结的工程代码下载地址:http://download.csdn.net/detail/yongan1006/9507347
这篇文章,我分为以下几步:
1.如何显示256色以下的图片
2.bmp格式图片文件介绍
3.显示真彩色图片
4.其它方面
1.如何显示256色以下的图片
1.1使用picture控件。将picture控件的属性改成位图。插入位图资源,并将位图资源ID,选到picture控件
属性中(示例工程代码中,右键DIALOGUE1)
1.2 使用消息wm_ctlcolor,在这个消息中返回一个自定义的画刷。(示例工程中,主界面的背景显示
的就是一幅图)。这种方法也可以显示真彩色的位图。真彩色的位图,也可以插入到位图资源编辑器
中。只是资源编辑器无法显示。但是不影响后面的程序对其ID的引用。
这种方法有局限性。使用这个消息的控件有CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT 编辑框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滑动条
CTLCOLOR_STATIC 静态文本框、矩形等。
此方法不适用于按纽控件。
2.bmp格式图片文件介绍
这里上一个图片,更加具体的介绍请参看网址:http://www.docin.com/p-1304460575.html
还有一个要说明的是,真彩色的bmp图片,调色板这一项是没有的。
3.显示真彩色图片
我的示例工程中,右键DIALOGUE2,展示的是如何用picture控件来显示真彩色图片。右键DIALOG3展示的
是如何用cdc来绘制真彩色图片。
3.1 picture控件来显示真彩色图片。
这里我是从cstatic上继承出了一个子类CPicBtn。子类中重写了函数PreSubclassWindow()。本来我是想
初始化一些东西,这些代码最好写在类似于onInitDialogue中消息响应函数中。可惜cstatic上没有
WM_INITDIALOGUE的类似消息。
网上大牛,可写了一些总结关于PreSubclassWindow()和PreclassWindow()的。这里我就贴个结论出来。
具体参看:http://blog.csdn.net/liu_cheng_ran/article/details/7571843
3.2 cdc来绘制真彩色图片
代码中在WM_PAINT消息响应函数中,使用了三种方法。分别调用了函数BitBlt(),StretchBlt(),
StretchDIBits()。
BitBlt()只是粘贴了原图,StretchBlt()函数可以对原图进行拉伸和缩放,以适应显示窗口的大小。
它们的操作对象是加载了位图的cdc对象。 StretchDIBits()操作的是原图的内存。它需要bmp的
位图数据。要求的参数多一些。但是这些信息,都可以通过CBitmap的对象
方法GetBitmap(),GetDIBits()直接或间接获取。
另外注意到调用StretchBlt()函数之前 调用了 SetStretchBltMode()函数。它的作用是防止颜色失真。
但是调用SetStretchBltMode()函数,还需要再调用SetBrushOrgEx()保证cdc工作的初始位置正确。
4.其它方面
写程序时,会需要一些转化。
4.1 CDC和HDC的区别与转换
获取cdc
CDC* pDC
pDC=GetDC();
获取hdc
HDC hDC;
hDC=pDC->m_hDC;
hDC=GetSafeHDC(pDC);
hDC=::GetDC(HWND handle)
转化
CDC* pDC
HDC hDC;
pDC=Attach(hDC);
hDC=GetSafeHDC(pDC);
pDC->m_hDC==hDC
4.2窗口ID,句柄,指针三者相互转换函数
ID--HANDLE--HWND三者之间的互相转换
===============
id->句柄
hWnd = ::GetDlgItem(hParentWnd,id);
===============
id->指针
CWnd::GetDlgItem();
===============
句柄->id
id = GetWindowLong(hWnd,GWL_ID);
===============
句柄->指针
CWnd *pWnd=CWnd::FromHandle(hWnd);
===============
指针->ID
id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);
=================
指针->句柄
hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;