VC中怎样将位图写入js 指定位置添加控件的Picture控件中

平台:VS2012&
程序类型:MFC 应用程序
1 MFC对话框之上的动态控件的创建
在对话框上的控件是MFC类的一个具体对象,其对应的变量内包含了类的数据成员和函数成员。当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息、响应函数以及变量。当需要在对话框中动态的创建某个控件时,就需要手动为动态控件添加消息、响应函数及变量,即是手动来代替类向导。
动态创建控件时,可按照以下步骤进行:
(1) 明确控件所属于的类
每一个控件都对应着一个类,如按钮Button所属于的类为CButton。在程序中我们需要用CButton类创建一个具体的按钮对象,并用函数指示它在对话框之上的位置及大小。由于指针的众多好处,可用一个CButton *类型的变量来管理所创建的按钮。但要谨慎使用指针变量,防止内存泄露,野指针。
(2) 确定控件的ID号
在对话框中的每一个控件都有一个独一无二的ID号。当用控件类来创建具体的控件对象时也需要这个ID来作为标识。ID号其实是一个宏,为了控件ID的有序性,可以到VS2012“资源管理器”下的String Table下为每一个控件定义ID值。这些ID号会自动的被保存到Resource.h文件中形成宏。
(3) 动态创建控件的一般流程
在明确了控件类和其ID号之后,就可以在合适的函数内编写动态创建控件的代码。动态生成按钮(Button)、文本框(Staic Text)、编辑框(Edit Control)、联合框(Combo Box)等控件的流程可表述如下(以创建文本框为例笔记):
//动态创建一个静态文本框
CStatic *CMFCDialogDlg::CreateOneStatic(LPCTSTR str, CRect Coord, UINT IDC)
CStatic *pStatic = NULL;
pStatic = new CS
ASSERT_VALID(pStatic);
pStatic-&Create(str,
WS_CHILD|WS_VISIBLE|SS_CENTER, Coord, this, IDC);
以上是创建一个文本框的函数。首先明确文本框类为CStatic,然后用C++的动态分配函数分配一个文本框对象,最后利用文本此对象的Create函数将对象按照指定风格(标题str,文本框显示外表,坐标,ID号)显示在对话框之上。最后将创建的控件地址返回给调用函数以管理。动态创建控件的核心就是每个控件类的对象中的create函数,不同的控件类的create函数需要的参数可能不同。当需要释放创建的动态按钮时,用delete语句释放动态按钮的地址即可(这也属于new-delete动态分配必须的搭配),在对画框之上创建的控件也会随之消失。
(4) 动态控件大小随对话框比例变化
利用控件内的Create函数动态创建控件到对话框上时,可以不要将坐标都用常值。因为对话框窗口可以跟随用户的需要发生变化。MFC中指定了对话框大小发生变化的消息ON_WM_SIZE(),只要在ON_WM_SIZE()消息对应的响应函数OnSize()中获取到大小变化后的对话框的尺寸大小,那么就能够按照动态控件与对话框的比例来决定当前控件的大小了。这样,动态控件也能够跟随对话框成比例的变化了。
2 Picture Control控件显示图片
在MFC中,CImage类中包含了载入图片、绘制图片到某区域的成员函数。而Picture &Control控件正是为CImage对象提供了一个平台。也就是说经CImage对象载入到内存中的图片可以在Picture Control控件之上绘制出来。所以,CImage类和Picture Control控件类可以搭配使用。
(1) 准备Picture &Control控件
直接切换到对话框文件下,往对话框中拖入一个Picture Control控件。记住其ID号。
(2) Picture Control控件显示图片的代码
只从显示图片这个角度上说。Picture Control控件只是为图片显示提供了一个平台,载入图片及绘制图片的操作都是由CImage对象的成员函数完成的,另外还会用到一些其它的常用函数。
//根据路径载入图片
image.Load(_T(&E:\\MyLibrayPhotoShop\\log.jpg&));
//获取图片的宽 高度
cx = image.GetWidth();
cy = image.GetHeight();
//获取Picture Control控件的大小
GetDlgItem(IDC_PICTURE)-&GetWindowRect(&rect);
//将客户区选中到控件表示的矩形区域内
ScreenToClient(&rect);
//窗口移动到控件表示的区域
GetDlgItem(IDC_PICTURE)-&MoveWindow(rect.left, rect.top, cx, cy, TRUE);
CWnd *pWnd = NULL;
pWnd = GetDlgItem(IDC_PICTURE);//获取控件句柄
pWnd-&GetClientRect(&rect);//获取句柄指向控件区域的大小
CDC *pDc = NULL;
pDc = pWnd-&GetDC();//获取picture的DC
image.Draw(pDc-&m_hDC, rect);//将图片绘制到picture表示的区域内
ReleaseDC(pDc);
读这段代码。
[1] CImage内的Load方法将指定路径下的图片载入,然后在利用其内的GetWidth和GetHeight方法获取到图片的宽度和高度。
[2] GetDlgItem通过PictureControl控件的ID获取到它的句柄后调用Picture Control中的GetWindRect方法来获取它本身在对话框中所占用的范围。然后利用ScreenToClient方法将客户区转到Picture Control内,目的是利用Picture Control内的MoveWindow方法重新设置Picture Control控件在对话框上所占的位置,是它适应图片的大小。
[3] 再重新设获取picture Control在对话框中占用的面积。用pDc来管理Picture Control中的DC。然后CImage的Draw方法就可以利用获取的参数在rect区域绘制图片了。
程序运行如下:
如果程序需要多次运行以上代码时才能够准确的显示图片,那么可以先一次性(如在OnInitDialog()函数中)载入图片。然后在OnPaint()函数中编写绘制图片的函数,让它得到多次运行。
MFC Note Over.
本文已收录于以下专栏:
相关文章推荐
本节主要讲一种简单实用的控件,图片控件Picture Control。我们可以在界面某个位置放入图片控件,显示图片以美化界面。
       图片控件简介
     &...
MFC常常需要显示图片信息,当前测试了png jpg两种图片的显示方法,均可用。
CString FilePath =
_T(&D:\\jinbing\\test\\test_1_8_1\\mf...
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
onpaint函数里添加程序:
CClientDC *pDC = new CClientDC(GetDlgItem(IDC_LIGHT));
GetDlgItem(IDC...
1.新建MFC对话框应用程序。
其余选项默认,单击完成,创建出对话框应用程序。删掉原来自带的一些控件,添加picture控件和两个按钮。
2.由于以后的代码会用到CvvImage类,而open...
系统环境:Windows 7软件环境:Visual Studio 2008 SP1本次目的:实现VC单文档、对话框程序显示图片效果      CImage是VC.NET中定义的一种MFC/ATL共享类...
一. List Control:       属性中Style有四种, 其中只有Report才分为多列. 初始化时, 先定义显示方式, 再插入列信息.      DWOR...
最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在《数字图像处理》课程中完成的软件都是基于单文档的程序,这里介绍两...
一遍关于怎么动态创建PictureControl的文章,有兴趣的可以看一看
一、利用Picture控件静态加载显示Bitmap图片
在界面上创建Picture控件
将Picture控件的Type属性设为Bitmap
导入或新建Bitmap类型资源,ID为IDB_BITMAP1...
1. 加载 BMP
CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC); // 得到 Picture Control 句柄
pWnd-&ModifyStyle...
他的最新文章
讲师:汪剑
讲师:陈守元
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)VC++中图像处理类CBitmap的用法
投稿:hebedich
字体:[ ] 类型:转载 时间:
使用VC进行图像处理的时候,CBitmap类为我们提供了丰富的位图处理函数,本文总结了该类的相关函数和常用使用方法,包括加载位图,显示位图,析构CBitmap资源以及在内存中保存位图等内容。
VC++中图像处理类CBitmap的用法
class CBitmap : public CGdiObject
DECLARE_DYNAMIC(CBitmap)
static CBitmap* PASCAL FromHandle(HBITMAP hBitmap);
// Constructors
CBitmap();
BOOL LoadBitmap(LPCTSTR lpszResourceName);
BOOL LoadBitmap(UINT nIDResource);
BOOL LoadOEMBitmap(UINT nIDBitmap); // for OBM_/OCR_/OIC_
#ifndef _AFX_NO_AFXCMN_SUPPORT
BOOL LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0,
LPCOLORMAP lpColorMap = NULL, int nMapSize = 0);
BOOL CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitcount,
const void* lpBits);
BOOL CreateBitmapIndirect(LPBITMAP lpBitmap);
BOOL CreateCompatibleBitmap(CDC* pDC, int nWidth, int nHeight);
BOOL CreateDiscardableBitmap(CDC* pDC, int nWidth, int nHeight);
// Attributes
operator HBITMAP()
int GetBitmap(BITMAP* pBitMap);
// Operations
DWORD SetBitmapBits(DWORD dwCount, const void* lpBits);
DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits)
CSize SetBitmapDimension(int nWidth, int nHeight);
CSize GetBitmapDimension()
// Implementation
virtual ~CBitmap();
#ifdef _DEBUG
virtual void Dump(CDumpContext& dc)
CGdiObject
class CGdiObject : public CObject
DECLARE_DYNCREATE(CGdiObject)
// Attributes
HGDIOBJ m_hO
// must be first data member
operator HGDIOBJ()
HGDIOBJ GetSafeHandle()
static CGdiObject* PASCAL FromHandle(HGDIOBJ hObject);
static void PASCAL DeleteTempMap();
BOOL Attach(HGDIOBJ hObject);
HGDIOBJ Detach();
// Constructors
CGdiObject(); // must Create a derived class object
BOOL DeleteObject();
// Operations
#pragma push_macro("GetObject")
#undef GetObject
int _AFX_FUNCNAME(GetObject)(int nCount, LPVOID lpObject)
int GetObject(int nCount, LPVOID lpObject)
#pragma pop_macro("GetObject")
UINT GetObjectType()
BOOL CreateStockObject(int nIndex);
BOOL UnrealizeObject();
BOOL operator==(const CGdiObject& obj)
BOOL operator!=(const CGdiObject& obj)
// Implementation
virtual ~CGdiObject();
#ifdef _DEBUG
virtual void Dump(CDumpContext& dc)
virtual void AssertValid()
1 装载已导入工程的位图资源
// 装载位图
bmp.LoadBitmap(IDB_BITMAP);
2 装载位图文件
&&& 为了能让CBitmap能够装载位图文件,必须调用API函数LoadImage
HANDLE LoadImage(
HINSTANCE hinst,
// handle of the instance containing the image
LPCTSTR lpszName, // name or identifier of image
UINT uType,
// type of image
int cxDesired,
// desired width
int cyDesired,
// desired height
UINT fuLoad
// load flags
装载: Example 1:
HBITMAP hBmp = (HBITMAP)LoadImage(NULL,
m_fileName,
IMAGE_BITMAP,
LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
Example 2:
hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
IMAGE_BITMAP,
LR_LOADFROMFILE);
将装载后得到的HBITMAP资源句柄 与 CBitmap 对象 相连
if (hBmp != NULL) {
CBitmap *pBmp = CBitmap::FromHandle(hBmp);
if (hBmp != NULL) {
bmp.DeleteObject();
bmp.Attach(hBmp);
3 显示位图
bmp.LoadBitmap(IDB_BITMAP1);
bmp.GetBitmap(&bm);
dc.CreateCompatibleDC(pDC);
CBitmap*pOldBmp=(CBitmap *)dc.SelectObject(&bmp);
pDC-&BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY);
pDC-&SelectObject(pOldBmp);
bmp.DeleteObject();
bmp.LoadBitmap(IDB_BITMAP2);
4 删除资源
bmp.LoadBitmap(IDB_BITMAP);
CBitmap *pOld=pDC-&SelectObject(&bmp);
// 此时位图对象还在pDC中,因此不能马上删除
// 而是先将位图从DC中选出 然后再删除
pDC-&SelectObject(pOld);
bmp.DeleteObject();
5 CBitmap 析构
当CBitmap作为局部变量 在其退出作用范围后,会发生析构,这时候CBitmap会将其对应的位图资源(hBitmap )释放掉。
若想继续使用该位图资源hBitmap,则在退出作用范围前,应将位图资源hBitmap和CBitmap对象通过Detach()函数进行分离
代码如下:HBITMAP& CMyClass::Load()
&&& bmp.LoadBitmap(IDB_BITMAP);
&&& // 通过Detach 将资源与对象分离,这样bmp析构后,资源仍存在&
&&& // 否则 ,bmp析构时,会将位图资源一起析构掉,这样出了局部范围外,就不可再使用这个位图资源了
&&& return bmp.Detach();
6 在仅获得HBITMAP资源句柄情况下,如何获得这个资源的BITMAP信息
GetObject(hBitmap,sizeof(BITMAP),&bm);
7 在内存中开辟资源空间 将原图保存到内存中
//-------------------在内存中建立区域以存放所得位图-------------------
// hBitmapSrc 为 CBitmap中保存的矩形原图资源句柄
// hDC 句柄
// 在内存中开辟位图资源,用以保存原图
HBITMAP CopyHBitmap(HBITMAP hBitmapSrc,HDC hDC)
HBITMAP hBitmapD
HDC hdcSrc,hdcD
GetObject(hBitmapSrc,sizeof(BITMAP),&bm);
hBitmapDst=CreateCompatibleBitmap(hDC,bm.bmWidth,bm.bmHeight);
hdcSrc=CreateCompatibleDC(hDC);
hdcDst=CreateCompatibleDC(hDC);
SelectObject(hdcSrc,hBitmapSrc);
SelectObject(hdcDst,hBitmapDst);
BitBlt(hdcDst,0,0,bm.bmWidth,bm.bmHeight,hdcSrc,0,0,SRCCOPY);
DeleteDC(hdcSrc);
DeleteDC(hdcDst);
return hBitmapD
下面给大家一个具体实例:将CBitmap类中的图像保存到文件
// 使用下面的代码,可以把CBitmap类中的图像保存到图像文件中。支持格式:BMP、JPG、GIF和PNG。
void SaveBitmap(CString strFilePath, CBitmap Bitmap)
if ( Bitmap.m_hObject )
CImage imgT
// CImage是MFC中的类。
imgTemp.Attach(Bitmap.operator HBITMAP());
imgTemp.Save(strFilePath);
// 注意文件路径名strFilePath必须包含后缀,即BMP、JPG、GIF或PNG中的一种。
最后附上CBitmap,HBitmap,Bitmap区别及联系
加载一位图,可以使用LoadImage:
HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int CyDesired,UINT fuLoad);
LoadImage可以用来加载位图,图标和光标
加载时可以规定加载图的映射到内存的大小:
&&& cxDesired:指定图标或光标的宽度,以像素为单位。如果此参数为零并且参数fuLoad值中LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源宽度。
 cyDesired:指定图标或光标的高度,以像素为单位。如果此参数为零并且参数fuLoad值中LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源高度。
LoadImage的返回值是相关资源的句柄。因为加载的是位图所以返回的句柄是HBITMAP型的(需要强制转换)。
延伸理解 HBITMAP/CBitmap/BITMAP:
HBITMAP是bitmap的指针,
msdn中如是:Handle to a bitmap.typedef HANDLE HBITMAP;
CBitmap是mfc中封装bitmap的类;
Encapsulates(囊括) a Windows graphics device interface (GDI) bitmap and provides member functions to manipulate(操作) the bitmap.
BITMAP是一个结构体,封装着bitmap的一些信息。定义了逻辑位图的高,宽,颜色格式和位值。
MSDN中如是:This structure defines the type, width, height, color format, and bit values of a bitmap.
三者之间的关系转换:
HBITMAP hB
//下面是三者之间的联系:
bitmap.Attach(hBitmap);//由HBITMAP 得到关联的CBitmap
bitmap.GetBitmap(&bm); // 由CBitmap 得到关联的BITMAP
hBitmap=(HBITMAP)bitmap.GetSafeHandle();//由CBitmap得到相关的HBITMAP
BITMAP结构具有如下形式:
typedef struct tagBITMAP
&&&& int&&&&& bmT
&&&& int&&&&& bmW//宽
&&&& int&&&&& bmH//高
&&&& int&&&&& bmWidthB
&&&& BYTE&&&& bmP
&&&& BYTE&&&& bmBitsP
&&&& LPVOID bmB
}& BITMAP;
延伸理解下Attach/Detach:
& attach是把一个C++对象与一个WINDOWS对象关联,直到用detach则把关联去掉。&
& 如果attach了以后没有detach,则C++对象销毁的时候WINDOWS对象跟着一起完蛋。&
& attach了以后,C++对象的指针和WINDOWS对象的HWND会有一个映射关系,其作用相当于你直接用一个C++对象去Create一个WINDOWS对象,例如&& CEdit&&&& edit.create(...)&
& 并且此映射是永久的,知道此对象完蛋为止。&
& 如果用类似GetDlgItem函数也可以返回一个指针,并可以强制转换。GetDlgItem会到映射表里找。&
& 有2种映射表,一中是永久的,一种是临时的。&
& 直接用C++对象创建的WINDOWS对象或者是通过attach的对象的映射关系都被放到永久表中,否则就在临时表中创建映射。&
& 所以GetDlgItem不推荐你保存返回的指针,因为你很难保证你的WINDOWS对象跟C++对象的关联是否放在永久表中。&
& 如果映射是放在临时表中,那么在空闲时间会被自动删除。&
& 用attcah完全是为了方便用MFC类的成员函数去操纵WINDOWS对象。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具4501人阅读
看这篇文章之前建议先看一下下面这篇文章:
修改了一下-----/*******************通过读取位图文件来显示位图**********************/
既然是向数据库中添加位图信息,那么有必须明白我们的数据是以什么形式存放在数据库的,当然没有别的方法,只能是二进制了,所以在创建数据库的时候,一定要注意选择的字段的类型,不然是添加下进去的。(刚开始的时候,我就遇到了这个问题,费了好长时间才搞定的。Access中的字段定义为”&OLE&对象”,sql2000中字义为image就行了。
void CTestDlg::OnButton2() //读取位图文件并显示在picture控件上
&& &// TODO: Add your control notification handler code here
//&& &CStatic *pStatic=(CStatic*)GetDlgItem(IDC_PHOTO);
&& &//CClientDC dc(this);
&& &CFileDialog fileDlg(TRUE,&bmp&,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,&(*.bmp)|*.bmp||&);
&& &&& &if (fileDlg.DoModal()!=IDOK)
&& &&& &&& &
&& &CString filePath=fileDlg.GetPathName();
&& &CString strFileName=fileP
&& &//成位图信息BITMAPINFO
&& &BITMAPINFO *bitmapinfo=NULL;
&& &BYTE *BmpData=NULL;
&& &CF//读取位图信息
&& &//设置文件的打开方式
&& &if(!file.Open(strFileName,CFile::modeRead|CFile::typeBinary))
&& &//BITMAP文件头结构体
&& &BITMAPFILEHEADER BitmapH
&& &//读取位图文件头
&& &if(file.Read(&BitmapHead,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
&& &&& &MessageBox(&读取文件头失败!&);
&& &if(BitmapHead.bfType!=0x4d42)
&& &&& &MessageBox(&对不起,您读取的不是位图文件!&);
&& &//位图信息
&& &BITMAPINFOHEADER BitmapI
&& &if(file.Read(&BitmapInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
&& &&& &MessageBox(&读取位图信息失败!&);
&& &if(BitmapInfo.biBitCount!=24)
&& &&& &MessageBox(&对不起,当前程序只支持24位位图信息!&);
&& &bitmapinfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];
&& &if(!bitmapinfo)
&& &&& &MessageBox(&内存分配失败!&);
&& &/*把BMP位图信息头中的数据读取到位图信息结构中去.*/
&& &memcpy(bitmapinfo,&BitmapInfo,sizeof(BITMAPINFOHEADER));
&& &/*用来得到位图文件的大小*/
&& &DWORD dataByte=BitmapHead.bfSize-BitmapHead.bfOffB
&& &BmpData=(BYTE*)new char[dataByte];
&& &if(!BmpData)
&& &&& &MessageBox(&内存分配失败!&);
&& &&& &delete BmpD
&& &if(file.Read(BmpData,dataByte)!=dataByte)
&& &&& &MessageBox(&读取位图数据失败!&);
&& &file.Close();
&& &CClientDC *pDC=new CClientDC(this);
&& &pDC-&SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC-&GetSafeHdc(),200,0,BitmapInfo.biWidth,BitmapInfo.biHeight, 0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,BmpData,bitmapinfo,DIB_RGB_COLORS,SRCCOPY);
void CTestDlg::OnButton1() //将通过文件读出来的位图信息存储到数据库中
&& &// TODO: Add your control notification handler code here
&& &char *pBuffer=m_pbufferBMP;
&& &VARIANT varP
&& &SAFEARRAY *pA
&& &SAFEARRAYBOUND rgsabound[1];
&& &if (pBuffer)
&& &&& &rgsabound[0].lLbound=0;
&& &&& &rgsabound[0].cElements=
&& &&& &pArray=SafeArrayCreate(VT_UI1,1,rgsabound);
&& &&& &char *
&& &&& &SafeArrayAccessData(pArray,(void**)&byte);
&&&&&&& for (long index=0;index&=++index)
&& &&& &&& &byte=m_pbufferBMP;
&& &&& &SafeArrayUnaccessData(pArray);
&& &&& &varPic.vt=VT_ARRAY | VT_UI1;
&& &&& &varPic.parray=pA
&&&& m_pRecordset-&AddNew();
&& & m_pRecordset-&PutCollect(&id&,_variant_t(&1001&));
&& & m_pRecordset-&GetFields()-&GetItem(&photo&)-&AppendChunk(varPic);
&&&& MessageBox(&add ok&);
&& &catch (_com_error e)
&& &&& &MessageBox(&Add picture to database is failed!&);
&& &m_pRecordset-&Update();
&& &MessageBox(&save ok&);
http://blog.csdn.net/ply421600/article/details/6725763
既然是向数据库中添加位图信息,那么有必须明白我们的数据是以什么形式存放在数据库的,当然没有别的方法,只能是二进制了,所以在创建数据库的时候,一定要注意选择的字段的类型,不然是添加下进去的。(刚开始的时候,我就遇到了这个问题,费了好长时间才搞定的。Access中的字段定义为” OLE 对象”,sql2000中字义为image就行了。)
1&&&&&&读取一个位图,
CFile FileP//用来读取位图文件
DWORD FileLen=0;//位图的长度
char* FileB//用于存放位图信息
if(!FilePic.Open(FilePath,CFile::modeRead))//打开位图文件
&&&&&&&&MessageBox(&打开图片信息失败!&);
FileLen=FilePic.GetLength();//得到位图的长度
FileBuff=new char[FileLen+1];//给位图文件申请内在空间
memset(FileBuff,0,FileLen+1);//初始化位图文件的空间
if(!FileBuff)//判断位图空间是否申请成功
&&&&&&&&MessageBox(&给图片分配空间失败!&);
if(FilePic.Read(FileBuff,FileLen)!=FileLen)//读取位图信息,存入到FileBuff中去
&&&&&&&&MessageBox(&读取图片信息失败!&);
对此的改进:
&& &CFileDialog fileDlg(TRUE,&bmp&,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,&(*.bmp)|*.bmp||&);
&& &if (fileDlg.DoModal()!=IDOK)
&& &CString filePath=fileDlg.GetPathName();
&& &if (!file.Open(filePath,CFile::modeRead))
&& &DWORD fileSize=file.GetLength();
&& &m_pbufferBMP=new char[fileSize+1];
&& &memset(m_pbufferBMP,'\0',fileSize+1);
&& size=file.Read(m_pbufferBMP,fileSize);
2&&&&&&把位图信息存放到VARIANT对象中,存入数据库中
char* pBuff= FileB
VARIANT varP//该对象用于存放位图信息
SAFEARRAY *safeA//定义一个SAFEARRAY结构对象(对于这个东西,会有专门的文档大家可以看一下,网上很多,不过都差不多,最好去MSDN上找一下)
SAFEARRAYBOUND rgsabound[1];//此结构体用来定义SAFEARRAY的边界,详情见MSDN
if(pBuff)//判断位图文件是否为空
&&&&&&&&rgsabound[0].lLbound=0;//定义下界
&&&&&&&&rgsabound[0].cElements=DwP//定义上限
&&&&&&&&&&&&&&safeArray=SafeArrayCreate(VT_UI1,1,rgsabound);// 使用SafeArrayCreate在堆上创建一维数组
&&&&&&&&for(long i=0;i&(long)DwPi++)
&&&&&&&&&&&&&&&SafeArrayPutElement(safeArray,&i,pBuff++);//传值
&&&&&&&&varPic.vt=VT_ARRAY|VT_UI1;//把值给VARIANT对象
&&&&&&&&varPic.parray=safeA //把值给VARIANT对象
3&&&&&&把数据写到数据库中
ACCESS2003:
::CoInitialize(NULL);
m_pConnection.CreateInstance(&ADODB.Connection&);
& _bstr_t strSQL=&Provider=Microsoft.Jet.OLEDB.4.0;Data Source=企业人事管理系统数据库\\test2.mdb&;\\放在当前项目路径下企业人事管理系统数据库中
&HRESULT hrs=m_pConnection-&Open(strSQL,&&,&&,adModeUnknown);
&&& if (SUCCEEDED(hrs))
&& &&& &AfxMessageBox(&link& database ok!&);
&& &}else{
&& &&& &AfxMessageBox(&link failed!&);
&& &}catch(_com_error e){
&& &&& &AfxMessageBox(&& &e.ErrorMessage());
m_pRecordset.CreateInstance(&ADODB.Recordset&);
&& &HRESULT hr = m_pRecordset-&Open(&SELECT * FROM photo&,
&& &&& &_variant_t((IDispatch *)m_pConnection,true),
&& &&& &adOpenDynamic,adLockPessimistic,adCmdText);
//m_pRecordset和m_pConnection都是类成员对象
pRecordset-&AddNew();
pRecordset-&PutCollect(&Name&,_variant_t(&zhang1&));
pRecordset-&GetFields()-&GetItem(&Picture&)-&AppendChunk(varPic);
catch(_com_error e)
&&&&&&&&MessageBox(&Add pic to access is falied!&);
pRecordset-&Update();
::CoInitialize(NULL);
m_pConnection.CreateInstance(&ADODB.Connection&);
& _bstr_t strSQL=&Driver={SQL Server};Server=ZLQ-PC;DataBase=test2&;
&& &HRESULT hrs=m_pConnection-&Open(strSQL,&sa&,&123&,adModeUnknown);
& if (SUCCEEDED(hrs))
&& &&& &AfxMessageBox(&link& database ok!&);
&& &}else{
&& &&& &AfxMessageBox(&link failed!&);
&& &}catch(_com_error e){
&& &&& &AfxMessageBox(&& &e.ErrorMessage());
m_pRecordset.CreateInstance(&ADODB.Recordset&);
&& &HRESULT hr = m_pRecordset-&Open(&SELECT * FROM photo&,
&& &&& &_variant_t((IDispatch *)m_pConnection,true),
&& &&& &adOpenDynamic,adLockPessimistic,adCmdText);
pRecordsetSql-&AddNew();
&&&&&&&try
&&&&&&&&&&&&&&pRecordsetSql-&PutCollect(&Name&,_variant_t(&zhang1&));
&&&&&&&&&&&&&&pRecordsetSql-&GetFields()-&GetItem(&Pic&)-&AppendChunk(SavePic(FileBuff,FileLen));
&&&&&&&catch(_com_error e)
&&&&&&&&&&&&&&MessageBox(&Add picture to sqlserver2000 is failed!&);
&&&&&&&pRecordsetSql-&Update();
//写入数据库方式二
&&& char *pBuffer=m_pbufferBMP;
&& &VARIANT varP
&& &SAFEARRAY *pA
&& &SAFEARRAYBOUND rgsabound[1];
&& &if (pBuffer)
&& &&& &rgsabound[0].lLbound=0;
&& &&& &rgsabound[0].cElements=
&& &&& &pArray=SafeArrayCreate(VT_UI1,1,rgsabound);
&& &&& &char *
&& &&& &SafeArrayAccessData(pArray,(void**)&byte);
&&&&&&& for (long index=0;index&=++index)
&& &&& &&& &byte=m_pbufferBMP;//m_pbufferBMP就是通过CFile读出来的位图文件,保存在char *m_pbufferBMP类成员变量中
&& &&& &SafeArrayUnaccessData(pArray);
&& &&& &varPic.vt=VT_ARRAY | VT_UI1;
&& &&& &varPic.parray=pA
&&&& m_pRecordset-&AddNew();
&& & m_pRecordset-&PutCollect(&id&,_variant_t(&1001&));
&& & m_pRecordset-&GetFields()-&GetItem(&photo&)-&AppendChunk(varPic);
&&&& MessageBox(&add ok&);
&& &catch (_com_error e)
&& &&& &MessageBox(&Add picture to database is failed!&);
&& &m_pRecordset-&Update();
下面是测试通过的:
首先:在StdAfx.h:加入:#import &c:\program files\common files\system\ado\msado15.dll& no_namespace rename(&EOF&,&adoEOF&)&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &\
然后:在基于对话框上添加两个按钮和Picture控件ID:IDC_PHOTO
其次建表:Access中的字段定义为”&OLE&对象”,sql2000中字义为image就行了。
表名:photo
access :id 数字 这里暂时不设主键
&&&&&&&&&&&&&& photo& Ole 不为空
Access下的连接字符串:注意当前表放到当前项目:企业人事管理系统数据库文件夹下
&&& _bstr_t strSQL=&Provider=Microsoft.Jet.OLEDB.4.0;Data Source=企业人事管理系统数据库\\test2.mdb&;
&& & HRESULT hrs=m_pConnection-&Open(strSQL,&&,&&,adModeUnknown);
&&&&&&&&&&& & id int 不设主键
&&&&&&&&&&&&&& photo& image 不为空
ms中的连接字符串:Server=服务器名字;DataBase=你的数据库名字
_bstr_t strSQL=&Driver={SQL Server};Server=ZLQ-PC;DataBase=test2&;
& HRESULT hrs=m_pConnection-&Open(strSQL,&sa&,&123&,adModeUnknown);
在CtestDlg类中添加下面的代码
class CTest1Dlg : public CDialog
// Construction
&& &CTest1Dlg(CWnd* pParent = NULL);&& &// standard constructor
&&& HBITMAP m_hPhotoB
&& & _ConnectionPtr m_pC
&& & _RecordsetPtr m_pR
&& & char * m_pBMPB
&& & DWORD m_nFileL
最后:在初始化对话框中,连接数据库
BOOL CTest1Dlg::OnInitDialog()
&& &CDialog::OnInitDialog();
&& &// Add &About...& menu item to system menu.
&& &// IDM_ABOUTBOX must be in the system command range.
&& &ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
&& &ASSERT(IDM_ABOUTBOX & 0xF000);
&& &CMenu* pSysMenu = GetSystemMenu(FALSE);
&& &if (pSysMenu != NULL)
&& &&& &CString strAboutM
&& &&& &strAboutMenu.LoadString(IDS_ABOUTBOX);
&& &&& &if (!strAboutMenu.IsEmpty())
&& &&& &&& &pSysMenu-&AppendMenu(MF_SEPARATOR);
&& &&& &&& &pSysMenu-&AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
&& &// Set the icon for this dialog.& The framework does this automatically
&& &//& when the application's main window is not a dialog
&& &SetIcon(m_hIcon, TRUE);&& &&& &&& &// Set big icon
&& &SetIcon(m_hIcon, FALSE);&& &&& &// Set small icon
&& &// TODO: Add extra initialization here
&& &::CoInitialize(NULL);
&& &try{&& &m_pConnection.CreateInstance(&ADODB.Connection&);
&& &_bstr_t strSQL=&Provider=Microsoft.Jet.OLEDB.4.0;Data Source=企业人事管理系统数据库\\test2.mdb&;
&& & HRESULT hrs=m_pConnection-&Open(strSQL,&&,&&,adModeUnknown);
&& &//_bstr_t strSQL=&Driver={SQL Server};Server=ZLQ-PC;DataBase=test2&;
&& &//HRESULT hrs=m_pConnection-&Open(strSQL,&sa&,&123&,adModeUnknown);
&& &if (SUCCEEDED(hrs))
&& &&& &AfxMessageBox(&连接数据库成功!&);
&& &&& &m_pRecordset.CreateInstance(&ADODB.Recordset&);
&& &&& &HRESULT hr = m_pRecordset-&Open(&SELECT * FROM photo&,
&& &&& &&& &_variant_t((IDispatch *)m_pConnection,true),
&& &&& &&& &adOpenDynamic,adLockPessimistic,adCmdText);
&& &}else{
&& &&& &AfxMessageBox(&连接数据库失败!&);
&& &}catch(_com_error e){
&& &&& &AfxMessageBox(&& &e.ErrorMessage());
&& &return TRUE;& // return TRUE& unless you set the focus to a control
//把位图保存到数据库中
void CTest1Dlg::OnButton1()
&& &// TODO: Add your control notification handler code here
&& &CFileDialog FileDlg(TRUE, &BMP&, NULL,&& &&& &//定义文件对话框
&& &&& &OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, &位图文件(*.BMP)|*.BMP||&);
&& &if(FileDlg.DoModal() != IDOK)&& &&& &&& &//打开文件对话框
&& &CString pathname = FileDlg.GetPathName();//获取选中文件的路径
&& &CF&& &&& &&& &&& &&& &&& &//定义一个文件变量
&& &if(!file.Open(pathname, CFile::modeRead) )//以制度的方式打开文件
&& &m_nFileLen = file.GetLength();//获取文件的长度
&& &m_pBMPBuffer = new char[m_nFileLen + 1];//开辟符数组
&& &if(!m_pBMPBuffer)&& &&& &&& &//如果控件不够大
&& &if(file.Read(m_pBMPBuffer,m_nFileLen) != m_nFileLen)//读取文件保存在字符数组中
&& &&& &&& &
&& &char&& &&& &&& &*pBuf = m_pBMPB
&& &VARIANT&& &&& &&& &varBLOB;
&& &SAFEARRAY&& &&& &*
&&& SAFEARRAYBOUND&& &rgsabound[1];
&& &if(pBuf)
&& &&& &rgsabound[0].lLbound = 0;
&& &&& &rgsabound[0].cElements = m_nFileL
&& &&& &psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
&& &&& &for (long i = 0; i & (long)m_nFileL i++)
&& &&& &&& &SafeArrayPutElement (psa, &i, pBuf++);
&& &&& &varBLOB.vt = VT_ARRAY | VT_UI1;
&& &&& &varBLOB.parray =
&& &{&& m_pRecordset-&AddNew();
&& &&&& m_pRecordset-&PutCollect(&id&,&1001&);
&& &&& &m_pRecordset-&GetFields()-&GetItem(&photo&)-&AppendChunk(varBLOB);
&& &&& &m_pRecordset-&Update();
&& &catch (_com_error e)
&& &{&&& CS
&& &&&&& str.Format(&错误信息:%s&,e.ErrorMessage());
&& &&& &MessageBox(&Add picture to database is failed!,reason:&+str);
&& &MessageBox(&保存成功!&);
//把位图从数据库中读出来
void CTest1Dlg::OnButton2()
&& &// TODO: Add your control notification handler code here
&& &if(m_hPhotoBitmap)
&& &&& &DeleteObject(m_hPhotoBitmap);
&& &&& &m_hPhotoBitmap = NULL;
&& &if(m_pBMPBuffer)
&& &&& &delete m_pBMPB
&& &&& &m_pBMPBuffer = NULL;
&& &//上面代码是为了清除以前的图像
&& &char *pBuff=NULL;//用于存放位图的内存空间
&& &&& &if (m_pRecordset!=NULL)
&& &&& &{m_pRecordset-&Close();
&& &&& &//m_pRecordset-&Open(bstrRecordset,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
&& &&& &m_pRecordset.CreateInstance(&ADODB.Recordset&);
&& &&& &m_pRecordset-&Open(&SELECT * FROM photo&,
&& &&& &&& &_variant_t((IDispatch *)m_pConnection,true),
&& &&& &&& &adOpenDynamic,adLockPessimistic,adCmdText);
&& &&& &long DataS//在数据库中读取出来的位图的大小
&& &&& &m_pRecordset-&MoveLast();//移动到记录最后,保证最新数据
&& &&& &DataSize=m_pRecordset-&Fields-&GetItem(&photo&)-&ActualS//得到位图字段的大小
&& &&& &if(DataSize&0)//判断那个位图字段是否为空
&& &&& &&& &
&& &&& &{& &
&& &&& && &
&& &&& &&& &_variant_t TheV//存储读出来的数据
&& &&& &&& &TheValue=m_pRecordset-&GetFields()-&GetItem(&photo&)-&GetChunk(DataSize);//读取字段一
&&&&&&&&&&& //TheValue=m_pRecordset-&GetCollect(&photo&);
&& &&& &&& &if(TheValue.vt==(VT_ARRAY|VT_UI1))
&& &&& &&& &{ &
&& &&& &&& &&& &pBuff=new char[DataSize+1];
&& &&& &&& &&& &if(pBuff)
&& &&& &&& &&& &{& &
&& &&& &&& &&& &&& &
&& &&& &&& &&& &
&& &&& &&& &&& &&& &char *buff=NULL;
&&&&&&&&&&&&&&&&&& &
&& &&& &&& &&& &&& &
&& &&& &&& &&& &&& &/***********************主要也就下面这几句画,其它的和显示位图相似**************************/
&& &&& &&& &&& &&& &
&& &&& &&& &&& &&& &SafeArrayAccessData(TheValue.parray,(void**)&buff);//把位图数据放到buff中去
&& &&& &&& &&& &&& &memcpy(pBuff,buff,DataSize);//把位图数据放到pBuff中
&& &&& &&& &&& &
&& &&& &&& &&& &&& &SafeArrayUnaccessData(TheValue.parray);//释放
&& &&& &&& &&& &&& &
&& &&& &&& &&& &
&& &&& &&& &&& &&& &m_pBMPBuffer = new char[DataSize + 1];//开辟符数组
&&&&&&&&&&&&&&&&&&& memcpy(m_pBMPBuffer,pBuff,DataSize);
&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&&& &
&& &&& &&& &&& &&& &//AfxMessageBox(m_pBMPBuffer);
&& &&& &&& &&& &
&& &&& &&& &&& &&& &//将位图内存数据PBuff转为HBITMAP
&& &&& &&& &&& &&& &
&& &&& &&& &&& &&& &
&& &&& &&& &&& &&&& HBITMAP hBitmap=NULL;//定义一个HBITMAP对象,用于显示位图用
&& &&& &&& &&& &&& &LPSTR&& &&& &&& &&& &hDIB,lpBuffer = m_pBMPB
&& &&& &&& &&& &&& &LPVOID&& &&& &&& &&& &lpDIBB
&& &&& &&& &&& &&& &BITMAPFILEHEADER&& &bmfH
&& &&& &&& &&& &&& &DWORD&& &&& &&& &&& &bmfHeaderL
&& &&& &&& &&& &&& &
&& &&& &&& &&& &&& &//获得位图的头信息
&& &&& &&& &&& &&& &bmfHeaderLen = sizeof(bmfHeader);
&& &&& &&& &&& &&& &//strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
&& &&& &&& &&& &&& &memcpy(&bmfHeader,lpBuffer,bmfHeaderLen);
&& &&& &&& &&& &&& &//根据获得的信息头判断是否是位图
&& &&& &&& &&& &&& &if (bmfHeader.bfType != (*(WORD*)&BM&))
&& &&& &&& &&& &&& &{&& AfxMessageBox(&this is not bitmap!&);
&& &&& &&& &&& &&& &&& &
&& &&& &&& &&& &&& &}
&& &&& &&& &&& &&& &//获取位图数据
&& &&& &&& &&& &&& &hDIB = lpBuffer + bmfHeaderL//将指针移动到文件头的后面
&& &&& &&& &&& &&& &BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;
&& &&& &&& &&& &&& &BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
&& &&& &&& &&& &&& &lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)-&bfOffB& //偏移字节数
&& &&& &&& &&& &&& &
&& &&& &&& &&& &&& &//创建位图
&& &&& &&& &&& &&& &CClientDC dc(this);
&& &&& &&& &&& &&& &hBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,
&& &&& &&& &&& &&& &&& &CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
&& &&& &&& &&& &&& &
&& &&& &&& &&& &&& &//显示位图
&& &&& &&& &&& &&& &CB&&&&&&&&&&&&&&&&&&&&&&&&&&& //定义位图变量
&& &&& &&& &&& &&& &bmp.Attach(hBitmap);&& &
&& &&& &&& &&& &&& &BITMAP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //定义一个位图结构
&& &&& &&& &&& &&& &bmp.GetBitmap(&bm);&&&&&& &
&& &&& &&& &&& &&& &CDC dcM
&& &&& &&& &&& &&& &dcMem.CreateCompatibleDC(GetDC());&&&&&&& //创建一个兼容的DC
&& &&& &&& &&& &&& &CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(bmp); //将位图选入设备环境类
&& &&& &&& &&& &&& &CRect lR&&&&&&&&&&&&&&&&&&&&&&&&&&& //定义一个区域
&& &&& &&& &&& &&& &CStatic *pstatic=(CStatic*)GetDlgItem(IDC_PHOTO);
&& &&& &&& &&& &&& &pstatic-&GetClientRect(&lRect);&&&&&&&&&&& //获取控件的客户区域
&& &&& &&& &&& &&& &lRect.NormalizeRect();
&& &&& &&& &&& &
&& &&& &&& &&& &&& &pstatic-&GetDC()-&StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),
&& &&& &&& &&& &&& &&& &&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //显示位图
&& &&& &&& &&& &&& &dcMem.SelectObject(&poldBitmap); //将原有的句柄选入设备环境
&& &&& &&& &&& &&& &bmp.DeleteObject();
&& &&& &&& &&& &&& &
&& &&& &&& &
&& &&& &&& &&& &&& &
&& &&& &&& &&& &}
&& &&& &&& &&& &
&& &&& &&& &}
&& &&& &&& &
&& &catch(_com_error e)
&& &&& &MessageBox(&打开数据表失败!&);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:719826次
积分:9369
积分:9369
排名:第2020名
原创:249篇
转载:28篇
译文:14篇
评论:53条
(2)(1)(6)(10)(3)(6)(2)(1)(3)(1)(4)(1)(1)(1)(4)(3)(1)(1)(1)(1)(2)(14)(1)(1)(11)(4)(16)(2)(1)(28)(51)(53)(30)(9)(10)(6)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 dialog指定控件下面 的文章

 

随机推荐