使用数据库加载和保存图像(c++ 5.0及以后)

开始一个项目并添加代码演示了添加图片或删除图像BLOB字段的数据库文件:

首先创建一个数据库文件(DB1.MDB)与下面列出的字段,在运行本教程之前。

字段名 类型
图像 OleObject
大小 数量
  1. 开始一个新项目如下:运行Microsoft Visual Studio,选择新项目文件,并执行以下操作:

    1. 扩大Visual c++树,如果不是已经扩大。
    2. 选择MFC的子树。
    3. 选择MFC应用程序从右边窗口。
    4. 项目名称文本框中,指定ImageBlob
    5. 位置文本框,指定项目的路径。
    6. 单击好吧按钮。
  2. 在overview窗口点击Next。

  3. 应用程序类型步对话框中,执行以下操作:

    1. 选择对话框。
    2. 使用MFC在一个共享DLL。
    3. 单击下一个按钮。
  4. 4步骤2的对话框中,执行以下操作:

    1. 确保关于盒子被选中。
    2. 确保系统菜单被选中。
    3. 单击下一个按钮。
  5. 4步骤3的对话框中,单击Finish:

  6. # include语句添加到您的程序可以访问的c++类库常量和类:

    1. 在项目的工作区,点击解决方案资源管理器选项卡。
    2. 双击ImageBlob项目文件夹以打开它。
    3. 双击头文件文件夹打开它。
    4. 双击StdAfx.h文件来编辑它。
  7. 将下面几行添加到文件的末尾(记住,你可能不得不改变头文件所在的路径):

    # include“. . \ \ . \ \ . . \ \ . \ \ . . \ \ \ \ ClassLib \ \ ltWrappr.h包括“

  8. 静态文本控件添加到主窗口如下:

    1. 在项目的工作区,点击ResourceView选项卡。
    2. 双击ImageBlob.rc文件夹打开它。
    3. 双击对话框文件夹打开它。
    4. 双击IDD_IMAGEBLOB_DIALOG设计表单。
    5. 选择待办事项……文本控件;然后按下删除键删除它。
    6. 单击静态文本控制图标,添加一个控件的对话框,然后大小和位置控制你想要在运行时出现。
  9. # import语句添加到您的程序可以访问Microsoft ActiveX数据对象2.6库:

    1. 在项目的工作区,单击“解决方案资源管理器”选项卡。
    2. 双击ImageBlob文件夹打开它。
    3. 双击该头文件文件夹打开它。
    4. 双击StdAfx。h文件来编辑它。
  10. 将下面几行添加到文件的末尾(记住,你可能需要改变文件名为. tlb所在的路径):

    #进口< C: \ \ \ \ Windows \ \ \ \ system32系统\ \ \ \ msado26。tlb >重命名(“EOF”,“ADOEOF”)使用名称空间ADODB;

  11. 单击资源视图选项卡。在视图菜单中,选择工具箱,然后添加六个命令按钮的表单和名称如下:

    ID 标题
    IDC_CONNECT 相距到数据库
    IDC_DISCONNECT 从数据库断开连接
    IDC_ADDRECORD 添加记录
    IDC_DELETERECORD D&elete记录
    IDC_MOVENEXT 移动下一个
    IDC_MOVEPREVIOUS 移动之前

    保存的资源文件。

  12. 执行以下步骤添加m_btnAddRecord CImageBlobDlg类变量和链接到CButton控制使用动态数据交换:

    1. 开放ImageBlob.rc并双击IDD_IMAGEBLOB_DIALOG。
    2. 右键单击添加记录按钮和选择添加变量
    3. 指定m_btnAddRecord作为变量名,控制的类别。
    4. 点击完成关闭对话框。
  13. 重复步骤11其他按钮,使用下面的变量名:

    ID 成员变量名
    IDC_MOVEPREVIOUS m_btnMovePrevious
    IDC_MOVENEXT m_btnMoveNext
    IDC_DISCONNECT m_btnDisconnect
    IDC_DELETERECORD m_btnDeleteRecord
    IDC_CONNECT m_btnConnect
  14. 添加以下CImageBlobDlg类的成员变量:

    _ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset;LBitmapWindow m_LBitmapWnd;

  15. 去OnInitDialog()函数如下:

    1. 从视图菜单,选择类视图
    2. 在项目的工作区,点击ClassView选项卡。
    3. 双击ImageBlob文件夹打开它。
    4. 点击CImageBlobDlg类。
    5. 双击OnInitDialog ()函数的窗口来编辑它。
  16. 编辑OnInitDialog()函数来添加以下代码行后说/ / TODO:添加额外的初始化:

    LBase: LoadLibraries (LT_KRN);LBase: LoadLibraries (LT_DIS);LBase: LoadLibraries (LT_FIL);矩形钢筋混凝土;GetDlgItem (IDC_STATIC) - > GetWindowRect (rc);ScreenToClient (rc);HWND HWND = m_LBitmapWnd.CreateWnd (- > GetSafeHwnd () 0 WS_VISIBLE | L_BS_CENTER | L_BS_PROCESSKEYBOARD, rc。离开了,rc。rc。对,rc.bottom);m_LBitmapWnd.EnableAutoScroll(真正的);m_LBitmapWnd。SetFileName (MAKE_IMAGE_PATH(文本(“image1.cmp”)));intnRet = m_LBitmapWnd。负载(0 ORDER_BGR 1);HRESULT人力资源;CoInitialize(空);hr = m_pConnection。调用CreateInstance (__uuidof(连接));m_pRecordset.CreateInstance (__uuidof(记录集));m_btnMoveNext.EnableWindow(假);m_btnMovePrevious.EnableWindow(假);m_btnAddRecord.EnableWindow(假);m_btnDeleteRecord.EnableWindow(假);

  17. 执行以下操作将事件处理程序添加到吗连接到数据库按钮:

    1. 开放ImageBlob.rc并双击IDD_IMAGEBLOB_DIALOG。
    2. 右键单击连接到数据库按钮,选择添加事件处理程序
    3. 消息类型列表中,选择BN_CLICKED
    4. 单击添加和编辑按钮关闭对话框,然后输入以下代码:
      HRESULT人力资源;_bstr_t bstrConnection (”提供者= Microsoft.Jet.OLEDB.4.0;数据源= d: \ \ temp \ \ DB1.mdb;“);_bstr_t bstrQuery (“SELECT * FROM图像”);_variant_t vNull;vNull。vt = VT_ERROR;vNull。范围= DISP_E_PARAMNOTFOUND;如果(m_pConnection - >状态= = adStateClosed){hr = m_pConnection - >打开(bstrConnection _bstr_t (L”“),_bstr_t (L”“),adModeUnknown);}如果(成功(人力资源){m_pRecordset - > PutRefActiveConnection (m_pConnection);hr = m_pRecordset - >打开(_variant_t (bstrQuery) vNull, adOpenKeyset, adLockOptimistic, adCmdText);如果(成功(人力资源){如果(! m_pRecordset - > GetBOF ()){m_pRecordset - > MoveFirst ();}如果(! m_pRecordset - > GetADOEOF ()){m_btnMoveNext.EnableWindow(真正的);m_btnMovePrevious.EnableWindow(真正的);m_btnDeleteRecord.EnableWindow(真正的);}m_btnAddRecord.EnableWindow(真正的);}}
  18. 执行以下操作将事件处理程序添加到吗断开数据库按钮:

    1. 开放ImageBlob.rc并双击IDD_IMAGEBLOB_DIALOG。
    2. 右键单击断开数据库按钮,选择添加事件处理程序
    3. 消息类型列表中,选择BN_CLICKED
    4. 单击添加和编辑按钮关闭对话框,然后输入以下代码:
      如果(m_pConnection - >状态= = adStateOpen){m_pConnection - > Close ();}如果(m_pRecordset - >状态= = adStateOpen){m_pRecordset - > Close ();}m_btnMoveNext.EnableWindow(假);m_btnMovePrevious.EnableWindow(假);m_btnAddRecord.EnableWindow(假);m_btnDeleteRecord.EnableWindow(假);
  19. 执行以下操作将事件处理程序添加到吗添加记录按钮:

    1. 开放ImageBlob.rc并双击IDD_IMAGEBLOB_DIALOG。
    2. 右键单击添加记录按钮,选择添加事件处理程序
    3. 消息类型列表中,选择BN_CLICKED
    4. 单击添加和编辑按钮关闭对话框,然后输入以下代码:
      L_SIZE_T nSize;intnRet;LMemoryFile LeadMemFile;LBuffer LeadMemBuffer;如果(m_pConnection - >状态= = adStateClosed){对话框(文本(“连接关闭”));返回;}LeadMemFile。SetBitmap ((LBitmapBase *) &m_LBitmapWnd);nRet = LeadMemFile.Save (QS &LeadMemBuffer FILE_LEAD, 24日);nSize = LeadMemBuffer.GetSize ();字节* pData =(字节*)LeadMemBuffer.Lock ();varBLOB变体;BlobToVariant (varBLOB pData(长)nSize);LeadMemBuffer.Unlock ();LeadMemBuffer.Free ();m_pRecordset - > AddNew ();m_pRecordset l[0] - > - >字段项- > AppendChunk (varBLOB);m_pRecordset - >字段- >项目[1 l] - > PutValue((长)nSize);m_pRecordset - >更新();VariantClear (&varBLOB);如果(m_pRecordset - > RecordCount > = 0){m_btnMoveNext.EnableWindow(真正的);m_btnMovePrevious.EnableWindow(真正的);m_btnDeleteRecord.EnableWindow(真正的);}
  20. 执行以下操作将事件处理程序添加到吗删除记录按钮:

    1. 开放ImageBlob.rc并双击IDD_IMAGEBLOB_DIALOG。
    2. 右键单击删除记录按钮,选择添加事件处理程序
    3. 消息类型列表中,选择BN_CLICKED
    4. 单击添加和编辑按钮关闭对话框,然后输入以下代码:
      如果(m_pConnection - >状态= = adStateClosed){对话框(文本(“连接关闭”));返回;}如果(! m_pRecordset - > GetBOF () | | ! m_pRecordset - > GetADOEOF ()){m_pRecordset - > MoveLast ();m_pRecordset - > Delete (adAffectCurrent);m_pRecordset - >更新();如果(m_pRecordset - > RecordCount < = 0){m_btnMoveNext.EnableWindow(假);m_btnMovePrevious.EnableWindow(假);m_btnDeleteRecord.EnableWindow(假);}}
  21. 执行以下操作将事件处理程序添加到吗移动下一个按钮:

    1. 开放ImageBlob.rc并双击IDD_IMAGEBLOB_DIALOG。
    2. 右键单击移动下一个按钮,选择添加事件处理程序
    3. 消息类型列表中,选择BN_CLICKED
    4. 单击添加和编辑按钮关闭对话框,然后输入以下代码:
      如果(m_pConnection - >状态= = adStateClosed){对话框(文本(“连接关闭”));返回;}如果(! m_pRecordset - > GetADOEOF ()){m_pRecordset - > MoveNext ();}如果(m_pRecordset - > GetADOEOF ()){对话框(文本(“从db无法获得的图像”));m_pRecordset - > MovePrevious ();}其他的{ReadImage ();}
  22. 执行以下操作将事件处理程序添加到吗移动之前按钮:

    1. 开放ImageBlob.rc并双击IDD_IMAGEBLOB_DIALOG。
    2. 右键单击移动之前按钮,选择添加事件处理程序
    3. 消息类型列表中,选择BN_CLICKED
    4. 单击添加和编辑按钮关闭对话框,然后输入以下代码:
      如果(m_pConnection - >状态= = adStateClosed){对话框(文本(“连接关闭”));返回;}如果(! m_pRecordset - > GetBOF ()){m_pRecordset - > MovePrevious ();}如果(m_pRecordset - > GetBOF ()){对话框(文本(“从db无法获得的图像”));m_pRecordset - > MoveNext ();}其他的{ReadImage ();}
  23. 去ImageBlobDlg。h文件然后添加以下函数声明:

    afx_msg无效OnClose ();无效BlobToVariant(变体&varArray字节* pData,长lSize);无效ReadImage ();

  24. 去ImageBlobDlg。cpp文件然后添加以下行BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间:

    ON_WM_CLOSE ()

  25. ImageBlobDlg.cpp添加以下功能:

    无效CImageBlobDlg: OnClose (){如果(m_LBitmapWnd.IsAllocated ()){m_LBitmapWnd.Free ();}LBase: UnloadLibraries (LT_KRN);LBase: UnloadLibraries (LT_DIS);LBase: UnloadLibraries (LT_FIL);CoInitialize(空);CDialog: OnClose ();}无效&varArray CImageBlobDlg:: BlobToVariant(变种,字节* pData,长lSize){字节* pByte;SAFEARRAY远* psa;SAFEARRAYBOUND rgsabound [1];rgsabound [0]。lLbound = 0;rgsabound [0]。cElements = lSize;/ /创建一个单一空间的字节数组psa = SafeArrayCreate (VT_I1 1 rgsabound);/ /设置数组的数据编辑框中的数据如果(SafeArrayAccessData (psa (无效* *)&pByte) = = NOERROR)memcpy (pByte(值),(值)pData lSize);SafeArrayUnaccessData (psa);varArray。vt = VT_ARRAY | VT_UI1;varArray。parray = psa;}无效CImageBlobDlg: ReadImage (){长nSize;字节* pData =零;LMemoryFile LeadMemFile;intnRet;_variant_t varSize;varSize = m_pRecordset - - > >字段项[1 l] - >价值;nSize = varSize.intVal;/ /免费的旧图片m_LBitmapWnd.Free ();对话框(文本(“老形象释放”));如果(nSize){_variant_t varBLOB;VariantInit (&varBLOB);/ /获得数据的一部分varBLOB = m_pRecordset - - > >字段项l [0] - > GetChunk (nSize);pData =(字节*)malloc (nSize);memset (pData 0 nSize);如果(varBLOB。vt = = (VT_ARRAY | VT_UI1)){字节* pBuf =零;SafeArrayAccessData (varBLOB.parray, (无效* *)pbuf);LeadMemFile。SetBitmap ((LBitmapBase *) &m_LBitmapWnd);LBuffer LeadMemBuffer (pBuf nSize);nRet = LeadMemFile。负载(ORDER_BGR LeadMemBuffer, 24日,NULL);SafeArrayUnaccessData (varBLOB.parray);}}}

  26. 创建一个新文件Imports.cpp它在你的项目文件。

    1. 在项目的工作区,点击解决方案资源管理器选项卡。
    2. 双击ImageBlob文件夹打开它。
    3. 右键单击源文件文件夹并选择添加新项。
    4. 右键单击源文件。
    5. 扩大Visual c++树,如果不是已经扩大。
    6. 选择代码的子树。
    7. 选择c++文件(. cpp)从右边窗口。
    8. 的名字文本框中,指定进口
    9. 单击好吧按钮。
    10. 双击导入。cpp的解决方案资源管理器,并添加以下行(记住,你可能不得不改变库文件所在的路径):
      # include“StdAfx.h”#如果定义(WIN64)# pragma评论(自由,“. . \ \ . \ \ . . \ \ . \ \ . . \ \ Lib \ \ CDLLVC10 \ \ x64 \ \ Ltwvc_x.lib”)#其他的# pragma评论(自由,“. . \ \ . \ \ . . \ \ . \ \ . . \ \ Lib \ \ CDLLVC10 \ \ Win32 \ \ Ltwvc_u.lib”)# endif/ / #如果定义(WIN64)
  27. 在主菜单中,选择构建- >构建ImageBlob。exe构建项目。

  28. 在主菜单中,选择建立ImageBlob - >执行。exe运行项目。

LEADTOOLS光栅成像c++类库的帮助
188金宝搏的网址客服|支持|联系我们|知识产权的通知
©1991 - 2021领先的技术公司。保留所有权利。