我使用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 中不能正常显示现图片,但是图片名都能正常显示(也就是说,,有时候图片变成空白的,)我不明白这是为什么,,,因为这种现象是偶尔出现的!!
我不明白到底会是在哪里出现了差错,,,,!!望名位多多指教,,谢了!!

解决方案 »

  1.   

    也来学习,我ListCtrl 的ICO图标有时也是一块白.
      

  2.   

    由于这种现象是偶尔出现的,但是文字始终能够正常的显示,,所以我自己觉得取数据库应该不会有什么问题。。我设了ListCtrl 的背景为空 语句如下:m_CtrlList.SetBkColor( CLR_NONE ) ;
      

  3.   

    varBLOB = m_pRecordset ->GetFields()->GetItem("ICON")->GetChunk( lDataSize ) ;-------------------------
    换成
    varBLOB = m_pRecordset->GetFields()->GetItem("ICON")->Value;
      

  4.   

    你用MySQL还是SQLServer ...?查一下你的存数据部分,要进行通配符转换的。
      

  5.   

    谢谢大家,,问题解决了,,,

    m_ImageList.Create(48 , 48 , ILC_COLOR32|ILC_MASK, 5, 1);
    改成:
    m_ImageList.Create(48 , 48 , ILC_COLOR32|ILC_MASK, 32, 16);
    可能是有时候系统在给 m_ImageList 分配内存时有误,才会引起的,,谢谢LongLongAgoImBoy(ThereIsAMe)给我出了这么好的一个思路