碰到一难题,,请大家帮忙出出主意!!
我使用ListCtrl (stle ->view 为 Icon) 控件做一个类似于“资源管理器”的程序用来浏览数据库中的内容!!其实数据库包括一个二进制的字段(其为一张bmp图片),和一个图片名的字段,。我将数据库中的图片名和图片读出来后。其中图片经过转换后添加到一个ImageList 的变量中,,难后用ListCtr显示,,其代码如下
void CTouchDlg::DisplayIcon( CString strSql )
{
m_CtrlList.ShowWindow( SW_HIDE ) ;
int i = 0 ;
long lDataSize = 0 ;
CString strName = "" ;
try
{
if ( m_pRecordset ->State )
{
m_pRecordset ->Close() ;
}
m_pRecordset->Open( _bstr_t( strSql ) ,
_variant_t( (IDispatch*)m_pConnection ,true ) ,
adOpenStatic ,
adLockOptimistic ,
adCmdText ) ;
m_ImageList.DeleteImageList() ;
m_CtrlList.DeleteAllItems() ;
m_ImageList.Create(48 , 48 , ILC_COLOR32|ILC_MASK, 5, 1);
while ( ! ( m_pRecordset -> adoEOF ) )
{
strName = ( char* )( _bstr_t )( m_pRecordset->GetCollect( "Name" ) ) ; //Name 为图片名
long lDataSize = 0 ;
lDataSize = m_pRecordset ->GetFields()->GetItem("ICON")->ActualSize ; (ICON)为存储图片的字段
if ( lDataSize > 0 )
{
_variant_t varBLOB ;
varBLOB = m_pRecordset ->GetFields()->GetItem("ICON")->GetChunk( lDataSize ) ;
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(m_pBMPBuffer = new char[lDataSize+1])
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcp(m_pBMPBuffer,pBuf,lDataSize); SafeArrayUnaccessData (varBLOB.parray);
//将二进制转成图片句柄
m_hPhotoBitmap = BufferToHBITMAP();
}
}
if ( m_hPhotoBitmap )
{
::ImageList_AddMasked( m_ImageList.m_hImageList, m_hPhotoBitmap , RGB( 0, 43, 67 ) ) ;
}
}
m_pRecordset ->MoveNext() ;
m_CtrlList.InsertItem( i , strName , i ) ;
i ++ ;
}
}
catch ( _com_error e )
{
AfxMessageBox( "ÏÔʾͼ±êÓдíÎó·¢Éú\r\n" + DisplayAdoError( m_pConnection ) ) ;
}
m_CtrlList.ShowWindow( SW_SHOW ) ;
}
现在问题是这样的,,有时候发现 ListCtrl 中不能正常显示现图片,但是图片名都能正常显示(也就是说,,有时候图片变成空白的,)我不明白这是为什么,,,因为这种现象是偶尔出现的。。。!!
我不明白到底会是在哪里出现了差错,,,,!!望名位多多指教,,谢了!!