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

本文详细介绍了在VC6.0环境下如何处理不同类型的图片显示问题,包括256色以下图片及真彩色图片的显示方法。文章还提供了实用的代码示例,如使用picture控件显示真彩色图片的方法,以及利用CDC绘制图片的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司项目,要求做一个设备运行的动画。我首先做了一个图片,发现vc6.0上的picture控件不支持真彩色

显示。于是个人在网上搜了很多资料,这里做一个关于vc6.0图片显示的总结。方便自己,也方便他人。

总结的工程代码下载地址:http://download.youkuaiyun.com/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.youkuaiyun.com/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;


  

Visual C++6.0使用GDI+的一般方法 1. 载解压GDI+开发包; 2. 正确设置include & lib 目录; 3. stdafx.h 添加: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include 4. 程序中添加GDI+的包含文件gdiplus.h以及附加的类库gdiplus.lib。 通常gdiplus.h包含文件添加在应用程序的stdafx.h文件中,而gdiplus.lib可用两种进行添加: 第一种是直接在stdafx.h文件中添加下列语句: #pragma comment( lib, "gdiplus.lib" ) 另一种方法是: 在VC.net中添加库文件在:项目菜单->属性->链接器->输入 举个例子: (1)在应用程序项目的应用类中,添加一个成员变量,如下列代码: ULONG_PTR m_gdiplusToken; 其中,ULONG_PTR是一个DWORD数据类型,该成员变量用来保存GDI+被初始化后在应用程序中的GDI+标识,以便能在应用程序退出后,引用该标识来调用Gdiplus:: GdiplusShutdown来关闭GDI+。 (2)在应用类中添加ExitInstance的重载,并添加下列代码用来关闭GDI+: int CGDITestApp::ExitInstance() { Gdiplus::GdiplusShutdown(m_gdiplusToken); return CWinApp::ExitInstance(); } (3)在应用类的InitInstance函数中添加GDI+的初始化代码: 注意:下面这些GDI+的初始化代码必须放在m_pMainWnd->UpdateWindow();之前。 CWinApp::InitInstance(); Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); (4)在需要绘图的窗口或视图类中添加GDI+的绘制代码。 下面分别就单文档和基于对话框应用程序为例,说明使用GDI+的一般过程和方法。 1. 在单文档应用程序中使用GDI+ 在上面的过程中,我们就是以一个单文档应用程序Ex_GDIPlus作为示例的。下面列出第4步所涉及的代码: void CGDITestView::OnDraw(CDC* pDC) { CGDITestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here usingnamespace Gdiplus; Graphics graphics(pDC->m_hDC); Pen newPen(Color(255,0,0),3); HatchBrush newBrush(HatchStyleCross,Color(255,0,255,0),Color(255,0,0,255));//创建一个填充画刷,前景色为绿色,背景色为蓝色 graphics.DrawRectangle(&newPen,50,50,100,60);// 在(50,50)处绘制一个长为100,高为60的矩形 graphics.FillRectangle(&newBrush,50,50,100,60); // 在(50,50)处填充一个长为100,高为60的矩形区域 } 编译并运行,结果如图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值