vc6.0 图片显示(个人笔记)

公司项目,要求做一个设备运行的动画。我首先做了一个图片,发现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;


  

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值