MFC+ADOでjpgイメージファイルをACCESSライブラリに入れる
3544 ワード
ネット上ではこの例はまだないようですが、VCで人事部管理システムを作ったら、人員写真がないはずがありません.見つけられる例はすべてBMPで、使う勇気がありません!
この例はVC 6を用いた.0とaccess 2002(officeXP)は、ADOの使い方、ファイルダイアログの使用、CPictureクラス、bufferバッファに関連しています.
一、私のADO用法整理
1. stdafx.hヘッダファイルに追加:
CPicture.hCPicture.cpp 2、フローチャートを見ると、ADOはbufferメモリとACCESS 2002データベースの間に作用し、CPictureはbufferメモリと表示ウィンドウの間に作用することがわかります.三、jpgをライブラリに保存して表示する
この例はVC 6を用いた.0とaccess 2002(officeXP)は、ADOの使い方、ファイルダイアログの使用、CPictureクラス、bufferバッファに関連しています.
一、私のADO用法整理
1. stdafx.hヘッダファイルに追加:
#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
2.アプリケーションの初期化に追加:AfxOleInit();
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");/// Connection
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=wy.mdb","","",adModeUnknown);///
/// Provider ACCESS2000 , ACCESS97, :Provider=Microsoft.Jet.OLEDB.3.51;
}
}
catch(_com_error e)///
{
CString errormessage;
errormessage.Format(" wy.mdb !/r/n :%s",e.ErrorMessage());
AfxMessageBox(errormessage);///
}
3.アプリケーションEXITへの参加:if (m_pConnection->State)
m_pConnection->Close();
4.アプリケーションへの参加:_ConnectionPtr m_pConnection;
5.ダイアログ・クラスに追加するには、次の手順に従います._RecordsetPtr m_pRecordset;
6. 注意:extern CWYApp theApp;
7. レコードセットの使用:try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM ORDER BY id",
_variant_t((IDispatch*)theApp.m_pConnection,true),
adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error e)///
{
AfxMessageBox(" !");///
}
CPictureクラス(JPG.GIFなどの画像を表示できます.詳細はCPicture.hヘッダファイルを参照してください)CPicture.hCPicture.cpp 2、フローチャートを見ると、ADOはbufferメモリとACCESS 2002データベースの間に作用し、CPictureはbufferメモリと表示ウィンドウの間に作用することがわかります.三、jpgをライブラリに保存して表示する
void COneDlg::OnButton1()
{
CFile f;
CString FilePathName;
CFileException e;
CFileDialog dlg(TRUE,NULL,NULL,0,"jpg Files (*.jpg)|*.jpg||",this);
if(dlg.DoModal()==IDOK)
{
FilePathName=dlg.GetPathName();
if(m_Pic.m_IPicture != NULL) m_Pic.FreePictureData(); // Important - Avoid Leaks...
if(f.Open(FilePathName, Cfile::modeRead | Cfile::typeBinary, &e)) // jpg
{
int nSize = f.GetLength(); // jpg
BYTE * pBuffer = new BYTE [nSize]; //
if (f.Read(pBuffer, nSize) > 0 ) // jpg pBuffer( )
{
BYTE *pBuf = pBuffer; /// pBuffer jpg
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
m_pRecordset->AddNew();
if(pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nSize;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < (long)nSize; i++)
SafeArrayPutElement (psa, &i, pBuf++);
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
m_pRecordset->GetFields()->GetItem("j")->AppendChunk(varBLOB);
}
m_pRecordset->Update();
(m_Pic.LoadPictureData(pBuffer, nSize));// pBuffer jpg
delete [] pBuffer; //
pBuf=0; //
}
f.Close();
}
CClientDC dc(this);
m_Pic.UpdateSizeOnDC(&dc); // Get Picture Dimentions In Pixels
m_Pic.Show(&dc, CRect(200,0,200+m_Pic.m_Width,m_Pic.m_Height) );//
}
}
.......
完全な例の中で多くの中国語の説明があって、あなたに役に立ちますか!?何か不都合な点がございましたら、よろしくお願いいたします