亲自改进的一个能方便显示各种类型图片的CStatic类

合集下载

c++第5章 图形绘制

c++第5章 图形绘制

第5章图形绘制在Visual C++6.0中,掌握图形程序设计方法是非常重要的。

因为图形在任何一个可视化工程项目中都是不可缺少的。

CDC(设备环境)类封装了图形绘制所需要的各种操作。

本章我们将通过实际例子和较详细的阐述,来了解和掌握如何使用设备环境类(CDC)及图形设备接口(GDI)进行图形绘制。

5.1 设备环境与设备环境类(CDC)5.1.1 设备环境设备环境也称设备上下文(Device Context,简称DC),是计算机物理设备的代表,也是图形设备接口的主要组成部分。

由于Windows是一个与设备无关的操作系统,即Windows不允许直接访问硬件,如果用户想将文本和图形绘制到显示器或其它设备中去,必须通过“设备环境”这个抽象层与硬件进行通信,设备上下文对象的作用就是实现Windows的设备无关性,任何向屏幕上进行输出的功能都要间接地通过它来完成。

设备上下文是Windows的一种数据结构,它包含了有关如显示器或打印机等设备的绘图属性信息。

所有绘画都是通过设备上下文对象来实现的,该对象封装了Windows的画线、图形和文本的API函数。

设备上下文允许在Windows下独立于设备的绘画。

设备上下文不仅能够被用来在屏幕上绘画,它也可以将绘画输出到打印机和图元文件中。

5.1.2 设备环境类设备环境类CDC直接继承于CObject类,该类定义了一类设备对象。

CDC对象提供了非常多的成员函数,与设备环境的显示器、打印机等一起工作。

例如,如果要在显示器等设备上绘制图形,我们可以用MFC提供的设备环境类CDC类,因为CDC类中包含了绘图所需要的所有成员函数。

同时。

MFC还提供了以下几个CDC的派生类:1、CPaintDC类此类比较特殊,它的构造函数和析构函数都是针对OnPaint进行的。

用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)指针来使用,CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。

C++中static的作用

C++中static的作用

C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。

前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。

一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。

我们先举一个静态全局变量的例子,如下://Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}void fn(){ n++;cout<<n<<endl;}静态全局变量有以下特点:该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。

对于一个完整的程序,在内存中的分布情况如下图:代码区全局数据区堆区栈区一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。

自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。

全局数据区的数据并不会因为函数的退出而释放空间。

细心的读者可能会发现,Example 1中的代码中将static int n; //定义静态全局变量改为int n; //定义全局变量程序照样正常运行。

的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突;您可以将上述示例代码改为如下://Example 2//File1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}//File2#include <iostream.h>extern int n;void fn(){ n++;cout<<n<<endl;}编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。

c语言class用法

c语言class用法

c语言class用法在C语言中,类(class)的概念并不像在面向对象编程语言(如C++或Java)中那样常见。

然而,在某些情况下,我们仍然可以使用类来组织相关的数据和函数,以实现更复杂的数据结构和算法。

本文将介绍在C语言中如何使用类,并探讨其优缺点。

一、类的定义和使用在C语言中,类的定义通常以结构体(struct)的形式出现。

类可以包含数据成员(字段)和函数成员(方法)。

数据成员通常用变量表示,而函数成员可以是函数、宏或者内置类型。

以下是一个简单的类定义示例:```ctypedefstruct{intx;inty;}Point;typedefstruct{Pointp;void(*display)(Point);}Circle;```在这个例子中,`Point`是一个结构体,包含了两个整型变量`x`和`y`,表示一个点的坐标。

而`Circle`是一个类,它包含了一个`Point`类型的成员变量`p`和一个函数成员`display`,该函数用于显示一个圆。

可以使用类来定义变量和方法:```cCirclemy_circle={{1,2},my_display};voidmy_display(Pointp){printf("Thecirclecenterisat(%d,%d)\n",p.x,p.y);}```二、类方法的调用类可以包含方法,这些方法与类实例相关联。

方法通常由关键字`static`修饰,并且必须与类实例相关联。

以下是一个使用类的示例:```cvoiddraw_circle(Circlec){printf("Drawingcirclewithcenter(%d,%d)\n",c.p.x,c.p.y);}```要调用类方法,需要使用类实例:```cdraw_circle(my_circle);```三、类优缺点分析使用类在C语言中可以创建更复杂的数据结构和算法,但也有一些缺点:优点:1.提高了代码的可读性和可维护性。

MFC类库的基本类

MFC类库的基本类

MFC类库是一个层次结构,主要有CObject类、应用程序类、可视对象类、绘图和打印类、通用类、数据库类、Internet和网络类、OLE类。

(1)CObject类CObject类是MFC的抽象基类,MFC中的大多数类是从CObject类派生出来的。

它是MFC 中多数类和用户自定义的根类,该类为程序员提供了希望融入所编写程序的许多公共操作,包括对象的建立和删除、串行化支持、对象诊断输出、运行时信息以及集合类的兼容等。

CObject类的声明在Afx.h中。

(2)应用程序结构类该类主要用于构造框架应用程序的结构,提供了多数应用程序公用的功能.编写程序的任务是填充框架,添加应用程序专有的功能。

1.应用程序和线程支持类CWinThread类是所有线程的基类,窗口应用程序类CWinApp类就是从该类中派生来的。

每个应用程序有且只有一个应用程序对象,在运行程序中该对象和其他对象相互协调,该对象从CWinApp中派生出来。

该类封装了初始化、运行、终止应用程序的代码。

2.命令相关类CCmdTarget类是CObject的子类,它是MFC所有具有消息映射属性的基类。

消息映射规定了当一对象接收到消息命令时,应调用哪个函数对该消息进行处理。

程序员很少需要从CCmdTarget类中直接派生出新类,往往都是从它的子类中派生出新类。

如窗口类(CWnd)、应用程序类(CWinApp)、文档模板类(CDocTemplate)、视类(CView)及框架窗口类(CFrameWnd)等。

3.文档类文档对象由文档对象模板创建,用于管理应用程序的数据。

视图对象表示一个窗口的客户区,用于显示文档数据并允许读者与之交互。

有关文档/视结构的类如下:①CDocTemplate类:文档模板的基类。

文档模板用于协调文档、视图和框架窗口的创建。

②CSingleDocTemplate类:单文档界面(SDI)的文档模板。

③CMultiDocTemplate类:多文档界面(MDI)的文档模板。

常用类

常用类

常用类CArchive类:用于二进制保存档案CBitmap类:封装Windows的图形设备接口(GDI)位图CBrush类:封装图形设备接口(GDI)中的画刷CButton类:提供Windows按钮控件的功能CByteArray类:该类支持动态的字节数组CCmdUI类:该类仅用于ON_UPDATE_COMMAND_UI处理函数中CColorDialog类:封装标准颜色对话框CDC类:定义设备环境对象类CDialog类:所有对话框(模态或非模态)的基类CDocument类:提供用户定义的文档类的基本功能CEdit类:是一个用于编辑控件的类CFile类:该类是基本文件类的基类C类:封装了打开和保存文件的标准对话框CFindReplaceDialog类:封装了标准查找/替换对话框CFont类:封装了Windows图形设备接口(GDI)中的字体对象CFontDialog类:封装了字体选择对话框CGdiObject类:GDI绘图工具的基类CIPAddressCtrl类:提供了IP地址控件的功能CImageList类:管理大小相同的图标或位图集CMenu类:封装应用程序菜单栏和弹出式菜单CPen类:封装了Windows图形设备接口(GDI)中的画笔对象CPoint类:操作CPoint和POINT结构CRect类:封装了一个矩形区域及相关操作CRgn类:封装用于操作窗口中的椭圆、多边形或者不规则区域的GDI区域CSize类:用于表示相对坐标或位置CSpinButtonCtrl类:旋转控件Spin的控制类CStatusBar类:状态栏窗口的基类CString类:处理字符串CStringList类:支持CString对象的列表CWinApp类:派生的程序对象的基类CWnd类:提供所有窗口类的基本函数API函数CArchive类:用于二进制保存档案CArchive::CArchive 建立一个CArchive对象CArchive(CFile* p nMode,int nBufSize=4096,void* lpBuf=NULL);参数:pFile 指向CFile对象的指针,这个CFile对象是数据的最终源或目的;nMode是标志,取值为CArchive::load时,从文档中加载数据(要求CFile读许可),取值为CArchive::store时,将数据存入文档(要求CFile写许可);nBufSize 指定内部文件缓冲区的大小(按字节计);lpBuf 指向大小为nBufSize的缓冲区,若未指定,则从局部堆中分配一缓冲区,并在该对象被删除时释放该缓冲区,但不释放用户提供的缓冲区。

C Builder_6图形、图像及实例

C  Builder_6图形、图像及实例

ok.et内容提要:本文介绍了图形的绘制和图像处理,其中详细介绍了画布(Canvas)的属性与使用方法,利用它们,可以非常直观方便地绘制直线、曲线、矩形、椭圆等各种图形。

本文还介绍了图像处理的方法,其中包括 Image 组件、TBitmap 类和 TJPEGImage 类的使用,而要进行快速的图像处理,几乎都离不开 ScanLine 技术。

使用 ScanLine 技术,能够快速取得bitmap 的每行的颜色值,而无需使用 Canvas 的 Pixels 属性逐点获取像素点的颜色值。

关键字:C++Builder、图形、图像、画布引言:自 Windows 诞生以来,可以通过 GDI(Graphics Device Interface)来实现图形的绘制。

然而对于初学者来说,庞大复杂的 GDI 绘图系统是一个难以跨越的学习障碍。

所幸的是,在C++Builder 绘图系统中,提供了一个简易可行的画布( Canvas),可以用非常直观的方式来实现Windows 下的绘图功能。

C++Builder 提供了 Image 组件,可以很方便地装载图像,以及进行图像处理。

正文:1 在窗体上作图1.1 知识要点1. 画布( Canvas)在 C++Builder 中,几乎所有的可视化组件(包括:Form、Image、Bitmap、PaintBox)都包含Canvas 属性。

Canvas 包含了许多和绘图有关的性质,如 Pen、Brush、Pixels、Font 等,另外它还包含了各种绘图的函数,如 LineTo、Rectangle、MoveTo、Polygon 等。

(1)Canvas 类主要属性有:Font:画布绘制文本所用的字体。

Brush:用于填充背景的画笔刷。

Pen:用来画线和描述图形轮廓的画笔。

PenPos:当前绘图位置的坐标。

Pixels:画布像素数组。

(2)Canvas 类主要方法有:Arc:用当前画笔在画布上画圆弧。

VC界面显示图片

VC界面显示图片(JPG JPEG GIF)2007-12-23 02:14一、引言JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛的认可。

GIF格式虽然仅支持256色但它对于颜色较少的图像有着很高的压缩率,甚至超过JPEG标准,也得到了广泛的认同。

但作为众多程序员的一个重要的开发工具--Microsoft Visual C++ 6.0的MFC库却仅对没有经过任何压缩的BMP位图文件有着良好的支持,可以读取、显示、存储甚至在内存中创建一块内存位图。

由于BMP格式的图像没有经过任何的压缩,不论是作为程序的外部文件,还是作为程序的内部资源都要占据大量的空间,尤其是后者会大大增加可执行文件的长度。

可以看出,如果能用经过压缩、具有较好的压缩率的JPEG或GIF格式的图像来取代BMP文件在VC中的应用,无疑还是很有吸引力的。

二、设计思路虽然有一些操作、处理JPEG、GIF等其他格式图像的Active X控件,但总的来说使用起来并不太方便,笔者经过实验摸索,总结出了一种借助于COM接口的OLE方法来实现上述功能的一种简便方法,现介绍如下以飨广大读者:下面我们要使用IPicture 的COM接口,有必要对该图像接口做些了解:该接口主要管理图像对象及其属性,图像对象为位图、图标和图元等提供一种与语言无关的抽象。

和标准的字体对象一样,系统也提供了对图像对象的标准实现。

其主要的接口是IPicture和IPictureDisp,后者是由IDispatch接口派生以便通过自动化对图像的属性进行访问。

图像对象也支持外部接口IPropertyNotifySink,以便用户能在图像属性发生改变时作出决定。

图像对象也支持IPersistStream接口,所以它能从一个IStream接口的实例对象保存、装载自己,而IStream 接口也支持对流对象的数据读写。

C++Builder 6图形、图像及实例


Name Caption Name Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Text Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption
book C++Builder 图形、图像及实例 net 内容提要:本文介绍了图形的绘制和图像处理,其中详细介绍了画布(Canvas)的属性与使用 et k. 方法,利用它们,可以非常直观方便地绘制直线、曲线、矩形、椭圆等各种图形。本文还介绍了图 .n oo 像处理的方法,其中包括 Image 组件、TBitmap 类和 TJPEGImage 类的使用,而要进行快速的图像 ok nb 处理,几乎都离不开 ScanLine 技术。使用 ScanLine 技术,能够快速取得 bitmap 的每行的颜色值, c 而无需使用 Canvas 的 Pixels 属性逐点获取像素点的颜色值。 w. 关键字:C++Builder、图形、图像、画布 ww 引言:自 Windows 诞生以来,可以通过 GDI(Graphics Device Interface)来实现图形的绘制。 t 然 而 对 于 初 学 者 来 说 , 庞 大 复 杂 的 GDI 绘 图 系 统 是 一 个 难 以 跨 越 的 学 习 障 碍 。 所 幸 的 是 , 在 ne C++Builder 绘图系统中,提供了一个简易可行的画布(Canvas),可以用非常直观的方式来实现 et k. Windows 下的绘图功能。C++Builder 提供了 Image 组件,可以很方便地装载图像,以及进行图像处 n o 理。 k. bo 正文: boo .cn 1 在窗体上作图 cn ww 1.1 知识要点 . w et 1. 画布(Canvas) n 在 C++Builder 中,几乎所有的可视化组件(包括:Form、Image、Bitmap、PaintBox)都包含 et k. Canvas 属性。Canvas 包含了许多和绘图有关的性质,如 Pen、Brush、Pixels、Font 等,另外它还包 .n oo 含了各种绘图的函数,如 LineTo、Rectangle、MoveTo、Polygon 等。 ok nb (1)Canvas 类主要属性有: o c Font:画布绘制文本所用的字体。 nb w. Brush:用于填充背景的画笔刷。 .c ww Pen:用来画线和描述图形轮廓的画笔。 w PenPos:当前绘图位置的坐标。 w Pixels:画布像素数组。 w et k (2)Canvas 类主要方法有: .n oo Arc:用当前画笔在画布上画圆弧。 k b Chord:绘制由直线和椭圆相交而成的一个封闭形状。 oo cn CopyRect:将图形的一部分从另一个画布复制过来。 nb w. Ellipse:在给定的区域绘制椭圆。 c w FillRect:用当前画刷填充指定的矩形。 . w FloodFill:用当前画刷填充指定的区域。 ww (3)LineTo 类主要方法有: w t MoveTo:连同 LineTo 绘制直线。 e Polygon:绘出一系列的线,串起所传入的各个点,并从最后一点到第一点绘制一条线。 .n Polyline:绘出一系列的线,串起所传入的各个点。 ook c Rectangle:绘制圆角矩形。 b . StretchDraw:在画布上给定的大小绘制图像。 cn ww TextOut:在画布上写出字符串。 . w TextRect:在限定的区域写出字符串,区域之外的字符串不会被显示出来。 ww 2. 颜色常数 w 在 C++Builder 中提供了许多颜色的预定常数,这些预设颜色都以 cl(cl 代表 color)为启始字

从CStatic派生新类,形成具有可以改变字体、背景颜色和字体颜色的控件类

从CStatic派生新类,形成具有可以改变字体、背景颜色和字体颜色的控件类[cpp]view plaincopy1.// ColorT ext_Static.h : header file2.3.#pragma once4.//////////////////////////////////////////////////////////////// /////////////5.// CColorT ext_Static window6.7.class CColorText_Static : public CStatic8.{9.// Attributes10.private:11.BOOL b_FillBackColor;12.COLORREF m_DisBackColro;13.COLORREF m_BackColor;14.COLORREF m_TextColor;15.CFont *m_Font;16.CBrush m_BackBrush;17.CBrush m_DisBackBrush;18.19.// Construction20.public:21.CFont *GetFont() { return m_Font; }22.olorText_Static();24.virtual void SetFont(LOGFONT *LogFont, BOOL bRedr aw = TRUE);25.virtual void SetFont(CFont* pFont, BOOL bRedraw = T RUE);26.virtual void SetFont(int nHeight, LPCTSTR fontName, B OOL bRedraw = true);27.28.void Set_BackColor(COLORREF cr);29.COLORREF Get_BackColor() { return(m_BackColor); };30.31.void Set_TextColor(COLORREF cr)32.{33.m_TextColor = cr;34.if(GetSafeHwnd())35.Invalidate();36.}37.38.COLORREF Get_TextColor()39.{40.return(m_TextColor);41.}42.// Attributes43.public:44.45.// Operations46.public:47.48.// Overrides49.// ClassWizard generated virtual function overrides50.//{{AFX_VIRTUAL(CColorText_Static)51.//}}AFX_VIRTUAL52.53.// Implementation54.public:55.virtual ~CColorText_Static();56.57.// Generated message map functions58.protected:59.//{{AFX_MSG(CColorText_Static)60.afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor) ;61.afx_msg BOOL OnEraseBkgnd(CDC* pDC);62.//}}AFX_MSG63.DECLARE_MESSAGE_MAP()64.65.};66.67.///////////////////////////////////////////////////////////// ////////////////[cpp]view plaincopy1.// ColorT ext_Static.cpp : implementation file2.//3.4.#include "stdafx.h"5.#include "ColorText_Static.h"6.7.#ifdef _DEBUG8.#define new DEBUG_NEW9.#undef THIS_FILE10.static char THIS_FILE[] = __FILE__;11.#endif12.13.///////////////////////////////////////////////////////////// ////////////////14.// CColorT ext_Static15.olorText_Static::CColorText_Static()17.{18.b_FillBackColor = 0;19.m_Font = 0;20.m_DisBackColro = RGB(200, 200, 200);21.Set_BackColor(GetSysColor(COLOR_3DFACE));22.Set_TextColor(0);23.}24.olorText_Static::~CColorT ext_Static()26.{27.if(m_Font)28.{29.m_Font->DeleteObject();30.delete m_Font;31.}32.33.m_BackBrush.DeleteObject();34.m_DisBackBrush.DeleteObject();35.}36.37.void CColorText_Static::SetFont(LOGFONT *LogFont, B OOL bRedraw)38.{39.if(m_Font)41.42.if(m_Font == NULL)43.m_Font = new CFont();44.45.if(m_Font)46.{47.if(!m_Font->CreatePointFontIndirect( LogFont ))48.{49.delete m_Font;50.m_Font = NULL;51.}52.}53.}54.55.void CColorText_Static::SetFont(CFont* pFont, BOOL b Redraw)56.{57.LOGFONT LogFont;58.pFont->GetLogFont(&LogFont);59.SetFont(&LogFont, bRedraw);60.}61.62.void CColorText_Static::SetFont(int nHeight, LPCTSTR f ontName, BOOL bRedraw)63.{64.if(m_Font)65.m_Font->DeleteObject();66.67.if(m_Font == NULL)69.70.if(m_Font)71.{72.if(!m_Font->CreatePointFont(nHeight, fontName))73.{74.delete m_Font;75.m_Font = NULL;76.}77.}78.if(bRedraw && GetSafeHwnd())79.Invalidate();80.}81.82.void CColorText_Static::Set_BackColor(COLORREF cr)83.{84.m_BackColor = cr;85.b_FillBackColor = true;86.87.m_BackBrush.DeleteObject();88.m_BackBrush.CreateSolidBrush(m_BackColor);89.90.m_DisBackBrush.DeleteObject();91.m_DisBackBrush.CreateSolidBrush(m_DisBackColro);92.93.if(GetSafeHwnd())94.Invalidate();95.}96.97.BEGIN_MESSAGE_MAP(CColorText_Static, CStatic)98.//{{AFX_MSG_MAP(CColorText_Static)99.ON_WM_CTLCOLOR_REFLECT()100.ON_WM_ERASEBKGND()101.//}}AFX_MSG_MAP102.END_MESSAGE_MAP()103.104.///////////////////////////////////////////////////////////// ////////////////105.// CColorT ext_Static message handlers106.107.HBRUSH CColorT ext_Static::CtlColor(CDC* pDC, UINT nCtlColor)108.{109.// TODO: Change any attributes of the DC here110.pDC->SetBkMode(TRANSPARENT);111.pDC->SetT extColor(m_TextColor);112.113.if(m_Font)114.pDC->SelectObject(m_Font);115.116.HBRUSH hBrush = (HBRUSH) m_BackBrush;117.if(!IsWindowEnabled())118.hBrush = (HBRUSH) m_DisBackBrush;119.return ( hBrush );120.// TODO: Return a non-NULL brush if the parent's handler should not be called return NULL;121.}122.123.BOOL CColorText_Static::OnEraseBkgnd(CDC* pDC)124.{125.// TODO: 在此添加消息处理程序代码和/或调用默认值126.return TRUE;127.return CStatic::OnEraseBkgnd(pDC);128.}[cpp]view plaincopy1.//测试代码2.3.//在对话框上添加静态文本框编辑ID为IDC_COLOR_STATIC4.5.// 在头文件里加6.#include "ColorText_Static.h"7.8.//关联变量与控件 (在此建立的测试对话框类为CFfDlg)9.10.//FfDlg.h11.12.public:olorText_Static m_ColorText;14.15.//FfDlg.cpp16.void CFfDlg::DoDataExchange(CDataExchange* pDX)17.{18.CDialog::DoDataExchange(pDX);19.//{{AFX_DATA_MAP(CFfDlg)20.DDX_Control(pDX, IDC_COLOR_STATIC, m_ColorText);21.//}}AFX_DATA_MAP22.}23.24.//初始化控件参数25.BOOL CFfDlg::OnInitDialog()26.{27.CDialog::OnInitDialog();28.29.m_ColorText.Set_BackColor(RGB(255,0,0)); //控件背景色30.m_ColorText.Set_T extColor(RGB(0,255,0)); //字体颜色31.m_ColorText.SetFont(100, _T("宋体")); //设置显示字体和大小32.m_ColorText.SetWindowT ext(_T("测试控件")); //设置显示内容33.34.return true;35.}。

C++中在用MFC显示一幅图像的步骤

在MFC中显示一幅图像的步骤:1.创建一个位图对象CBitmap bitmap;2.载入位图bitmap.loadbitmap();3.创建一个矩形对象CRect rect;获取客户区矩形窗口getwindrect4.创建客户区DC并且获取客户区DCCCLientdc dc(this);5.创建设备描述表:CDC memdc;6.创建兼容DC memdc.creatcompatibleDC(关联客户DC)7.创建一个位图结构体用来获取要显示的位图信息BITMAP bm;bitmap.Getbitmap(&bm);8.选择对象Cbitmap *poldbitmap=memdc.selectobject(&bitmap); 9.显示位图用这个函数:BitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc, DWORD dwRop);或者用这个函数StretchBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc, int nSrcWidth,int nSrcHeight,DWORD dwRop);10.再次选择位图Memdc.selectobject(&pOldbitmap);下面是整个程序:先创建一个MFC程序,单文档的,其他的都默认设置。

点击完成即可点击插入或者按下ctral+r,接着插入位图资源选择要显示的位图资源接着进入OnDraw 函数,编程添加如下代码:void CPicturedlgView::OnDraw(CDC* pDC){CPicturedlgDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCBitmap bitmap;//创建位图对象bitmap.LoadBitmap(IDB_BITMAP1);//载入位图资源CRect rect;GetWindowRect(&rect);//创建一个矩形结构体,获取显示窗口的边界数据,传递给rect结构体///////////创建客户区DCCClientDC dc(this);////////创建暂存DCCDC memdc;//////创建兼容DCmemdc.CreateCompatibleDC(&dc);BITMAP bm;//////创建位图结构体bm;bitmap.GetBitmap(&bm);/////////获取位图信息CBitmap *pOldbitmap=memdc.SelectObject(&bitmap);////////选择位图/////////显示位图dc.SetStretchBltMode(COLORONCOLOR);dc.StretchBlt(5,5,rect.right-rect.left-10,rect.bottom-rect.top,&memdc,0,0,bm.bmWidth,b m.bmHeight,SRCCOPY);dc.SelectObject(pOldbitmap);///////在此选择位图}运行后显示如下:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最近项目中要用到图片显示,有现成的不过用起来感觉不是很好.主要原因:(一)都是读取的本地文件 (二)显示的效率不是很好 (三)不符合项目要求.于是上codeproject上找了一个类CPictureCtrl,使用很方便,但是vc6下不支持,并且不能根据图片大小调整显示大小,于是对其进行了改进.1.源代码CPictureCtrl.h文件://////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// PictureCtrl.h//// Author: Tobias Eiseler//// E-Mail: tobias.eiseler@//// Function: A MFC Picture Control to display// an image on a Dialog, etc.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#pragma once#include "afxwin.h"#ifndef ULONG_PTR#define ULONG_PTR unsigned long *#endif#include "GdiPlus.h"using namespace Gdiplus;#pragma comment(lib,"GdiPlus.lib") //以上部分是gdi说明class CPictureCtrl :public CStatic{public://ConstructorCPictureCtrl(void);//Destructor~CPictureCtrl(void);public://Loads an image from a fileBOOL LoadFromFile(CString &szFilePath);//Loads an image from an IStream interfaceBOOL LoadFromStream(IStream* piStream);//Loads an image from a byte stream;BOOL LoadFromStream(BYTE* pData, size_t nSize);//Loads an image from a Resource// BOOL LoadFromResource(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType);//Overload - Single load functionBOOL Load(CString &szFilePath,int nWidth = 0,int nHeight = 0);BOOL Load(IStream* piStream,int nWidth = 0,int nHeight = 0);BOOL Load(BYTE* pData, size_t nSize,int nWidth = 0,int nHeight = 0);// BOOL Load(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType);//Frees the image datavoid FreeData();protected:virtual void PreSubclassWindow();//Draws the Controlvirtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);virtual BOOL OnEraseBkgnd(CDC* pDC);afx_msg void OnPaint();DECLARE_MESSAGE_MAP()private://Internal image stream bufferIStream* m_pStream;//Control flag if a pic is loadedBOOL m_bIsPicLoaded;int nWidth,nHeight;//GDI Plus TokenULONG_PTR m_gdiplusToken;};CPictureCtrl.c文件/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////// PictureCtrl.cpp//// Author: Tobias Eiseler//// E-Mail: tobias.eiseler@//// Function: A MFC Picture Control to display // an image on a Dialog, etc.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include "StdAfx.h"#include "PictureCtrl.h"//Macro to release COM Components#ifdef SAFE_RELEASE#undef SAFE_RELEASE#endif#define SAFE_RELEASE(x) do{\if((x) != NULL)\{\while((x)->Release() != 0);\(x) = NULL;\}\}while(0)CPictureCtrl::CPictureCtrl(void):CStatic(), m_pStream(NULL), m_bIsPicLoaded(FALSE), m_gdiplusToken(0){GdiplusStartupInput gdiplusStartupInput;GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); }CPictureCtrl::~CPictureCtrl(void){//Tidy upFreeData();GdiplusShutdown(m_gdiplusToken);}BEGIN_MESSAGE_MAP(CPictureCtrl, CStatic)//{{AFX_MSG_MAP(CPictureCtrl)ON_WM_PAINT()//}}AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CPictureCtrl::LoadFromStream(IStream *piStream){//Set success error stateSetLastError(ERROR_SUCCESS);FreeData();//Check for validity of argumentif(piStream == NULL){SetLastError(ERROR_INVALID_ADDRESS);return FALSE;}//Allocate streamDWORD dwResult = CreateStreamOnHGlobal(NULL, TRUE, &m_pStream); if(dwResult != S_OK){SetLastError(dwResult);return FALSE;}//Rewind the argument streamLARGE_INTEGER lInt;lInt.QuadPart = 0;piStream->Seek(lInt, STREAM_SEEK_SET, NULL);//Read the lenght of the argument streamSTATSTG statSTG;dwResult = piStream->Stat(&statSTG, STATFLAG_DEFAULT);if(dwResult != S_OK){SetLastError(dwResult);SAFE_RELEASE(m_pStream);return FALSE;}//Copy the argument stream to the class streampiStream->CopyTo(m_pStream, statSTG.cbSize, NULL, NULL);//Mark as loadedm_bIsPicLoaded = TRUE;Invalidate();RedrawWindow();return TRUE;}BOOL CPictureCtrl::LoadFromStream(BYTE* pData, size_t nSize){//Set success error stateSetLastError(ERROR_SUCCESS);FreeData();//Allocate streamDWORD dwResult = CreateStreamOnHGlobal(NULL, TRUE, &m_pStream); if(dwResult != S_OK){SetLastError(dwResult);return FALSE;}//Copy argument data to the streamdwResult = m_pStream->Write(pData, (ULONG)nSize, NULL);if(dwResult != S_OK){SetLastError(dwResult);SAFE_RELEASE(m_pStream);return FALSE;}//Mark as loadedm_bIsPicLoaded = TRUE;Invalidate();RedrawWindow();return TRUE;}BOOL CPictureCtrl::LoadFromFile(CString &szFilePath){//Set success error stateSetLastError(ERROR_SUCCESS);FreeData();//Allocate streamDWORD dwResult = CreateStreamOnHGlobal(NULL, TRUE, &m_pStream);if(dwResult != S_OK){SetLastError(dwResult);return FALSE;}//Open the specified fileCFile cFile;CFileException cFileException;if(!cFile.Open(szFilePath, CStdioFile::modeRead | CStdioFile::typeBinary, &cFileException)) {SetLastError(cFileException.m_lOsError);SAFE_RELEASE(m_pStream);return FALSE;}//Copy the specified file's content to the streamBYTE pBuffer[1024] = {0};while(UINT dwRead = cFile.Read(pBuffer, 1024)){dwResult = m_pStream->Write(pBuffer, dwRead, NULL);if(dwResult != S_OK){SetLastError(dwResult);SAFE_RELEASE(m_pStream);cFile.Close();return FALSE;}}//Close the filecFile.Close();//Mark as Loadedm_bIsPicLoaded = TRUE;Invalidate();RedrawWindow();return TRUE;}// BOOL CPictureCtrl::LoadFromResource(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType)// {// //Set success error state// SetLastError(ERROR_SUCCESS);// FreeData();//// //Locate the resource// HRSRC hResource = FindResource(hModule, lpName, lpType);// if(hResource == NULL)// {// return FALSE;// }//// //Get the size of the resource// DWORD dwResourceSize = SizeofResource(hModule, hResource);// if(dwResourceSize == 0)// {// return FALSE;// }//// //Load the Resource// HGLOBAL hGlobalResource = LoadResource(hModule, hResource);// if(hGlobalResource == NULL)// {// return FALSE;// }//// //Lock the resource and get the read pointer// BYTE* pRecource = (BYTE*)LockResource(hGlobalResource);// if(pRecource == NULL)// {// return FALSE;// }//// //Allocate the Stream// DWORD dwResult = CreateStreamOnHGlobal(NULL, TRUE, &m_pStream); // if(dwResult != S_OK)// {// FreeResource(hGlobalResource);// SetLastError(dwResult);// pRecource = NULL;// return FALSE;// }//// //Copy the resource data to the stream// dwResult = m_pStream->Write(pRecource, dwResourceSize, NULL);// if(dwResult != S_OK)// {// FreeResource(hGlobalResource);// SAFE_RELEASE(m_pStream);// SetLastError(dwResult);// return FALSE;// }//// //Tidy up// // FreeResource(hGlobalResource);//// //Mark as loaded// m_bIsPicLoaded = TRUE;//// Invalidate();// RedrawWindow();//// return TRUE;// }//Overload - Single load functionBOOL CPictureCtrl::Load(CString &szFilePath,int nWidth,int nHeight){this->nWidth = nWidth;this->nHeight = nHeight;return LoadFromFile(szFilePath);}BOOL CPictureCtrl::Load(IStream* piStream,int nWidth,int nHeight){this->nWidth = nWidth;this->nHeight = nHeight;return LoadFromStream(piStream);}BOOL CPictureCtrl::Load(BYTE* pData, size_t nSize,int nWidth,int nHeight){this->nWidth = nWidth;this->nHeight = nHeight;return LoadFromStream(pData, nSize);}// BOOL CPictureCtrl::Load(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType) // {// return LoadFromResource(hModule, lpName, lpType);// }void CPictureCtrl::FreeData(){m_bIsPicLoaded = FALSE;SAFE_RELEASE(m_pStream);}void CPictureCtrl::PreSubclassWindow(){CStatic::PreSubclassWindow();ModifyStyle(0, SS_OWNERDRAW);}void CPictureCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)//只有vs才支持{//Check if pic data is loadedif(m_bIsPicLoaded){//Get control measuresRECT rc;this->GetClientRect(&rc);Graphics graphics(lpDrawItemStruct->hDC);Image image(m_pStream);if (nHeight <= 0 || nWidth <= 0 )//图片宽度,高度不合法时,按默认处理{graphics.DrawImage(&image, (INT)rc.left, (INT)rc.top, (INT)(rc.right-rc.left),(INT)(rc.bottom-rc.top));}else//否则,计算其相对CStatic位置,并显示出来{int nTopDiff,nTop;int nLeftDiff,nLeft;nTopDiff = ((rc.bottom-rc.top) - nHeight)/2;nLeftDiff = ((rc.right-rc.left) - nWidth)/2;if (nTopDiff <=0){nTop = rc.top;nHeight = rc.bottom-rc.top;}else{nTop = rc.top + nTopDiff;}if (nLeftDiff <=0 ){nLeft = rc.left;nWidth = rc.right-rc.left;}else{nLeft =rc.left + nLeftDiff;}this->SetWindowPos(this,nTop,nLeft,nWidth,nHeight,SWP_SHOWWINDOW|SWP_DRAWFRA ME );graphics.DrawImage(&image, nLeft, nTop, nWidth, nHeight);}}}BOOL CPictureCtrl::OnEraseBkgnd(CDC *pDC)//先于onpaint运行{if(m_bIsPicLoaded){//Get control measuresRECT rc;this->GetClientRect(&rc);Graphics graphics(pDC->GetSafeHdc());LARGE_INTEGER liSeekPos;liSeekPos.QuadPart = 0;m_pStream->Seek(liSeekPos, STREAM_SEEK_SET, NULL);Image image(m_pStream);if (nHeight <= 0 || nWidth <= 0 )//图片宽度,高度不合法时,按默认处理{graphics.DrawImage(&image, (INT)rc.left, (INT)rc.top, (INT)(rc.right-rc.left), (INT)(rc.bottom-rc.top));}else//否则,计算其相对CStatic位置,并显示出来{int nTopDiff,nTop;int nLeftDiff,nLeft;nTopDiff = ((rc.bottom-rc.top) - nHeight)/2;nLeftDiff = ((rc.right-rc.left) - nWidth)/2;if (nTopDiff <=0){nTop = rc.top;nHeight = rc.bottom-rc.top;}else{nTop = rc.top + nTopDiff;}if (nLeftDiff <=0 ){nLeft = rc.left;nWidth = rc.right-rc.left;}else{nLeft =rc.left + nLeftDiff;}this->SetWindowPos(this,nTop,nLeft,nWidth,nHeight,SWP_SHOWWINDOW|SWP_DRAWFRA ME );graphics.DrawImage(&image, nLeft, nTop, nWidth, nHeight);}return TRUE;}else{return CStatic::OnEraseBkgnd(pDC);}return TRUE;}void CPictureCtrl::OnPaint(){CPaintDC dc(this);if(m_bIsPicLoaded){//Get control measuresRECT rc;this->GetClientRect(&rc);Graphics graphics(dc.m_hDC);Image image(m_pStream);dc.FillSolidRect(&rc,GetSysColor(COLOR_3DFACE));//以窗口灰色背景色填充,而dc.GetBkColor()获取的是白色的背景if (nHeight <= 0 || nWidth <= 0 )//图片宽度,高度不合法时,按默认处理{graphics.DrawImage(&image, (INT)rc.left, (INT)rc.top, (INT)(rc.right-rc.left),(INT)(rc.bottom-rc.top));}else//否则,计算其相对CStatic位置,并显示出来{int nTopDiff,nTop;int nLeftDiff,nLeft;nTopDiff = ((rc.bottom-rc.top) - nHeight)/2;nLeftDiff = ((rc.right-rc.left) - nWidth)/2;if (nTopDiff <=0){nTop = rc.top;nHeight = rc.bottom-rc.top;}else{nTop = rc.top + nTopDiff;}if (nLeftDiff <=0 ){nLeft = rc.left;nWidth = rc.right-rc.left;}else{nLeft =rc.left + nLeftDiff;}graphics.DrawImage(&image, nLeft, nTop, nWidth, nHeight);}}}2.改进的地方a.使之支持vc6不支持vc6的原因是CStatic不支持DrawItem,于是我重写了OnPaint() b.图片能够按照要求大小显示,并且显示位置做了处理c.图片小于CStaic时,消除前一张图片,背景色与窗口颜色相同(这里使用的是重绘背景色的方式)3.测试测试的时候,循环显示三张图片,总量大概800多K, 循环100次,大约需要6秒钟,因为采用了重绘背景色的方式有闪烁的感觉,如果每显示一张图片,睡20毫秒的话(可以睡更短时间),显示比较正常,会消耗12秒钟,完全可以满足每秒25帧的要求.运行时,内存没有明显过大增加,cpu使用率到达一定程度后也不会再增长.应该来讲,是符合实际使用要求的.4.改进计算显示位置的代码有重复的嫌疑,可以进一步封装,鉴于时间问题及代码量不顾大的原因,没有做改进,有兴趣的同志可以跟进.。

相关文档
最新文档