碰到一难题,,请大家帮忙出出主意!!

lzf8977 2004-08-26 08:39:09
我使用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 中不能正常显示现图片,但是图片名都能正常显示(也就是说,,有时候图片变成空白的,)我不明白这是为什么,,,因为这种现象是偶尔出现的。。。!!
我不明白到底会是在哪里出现了差错,,,,!!望名位多多指教,,谢了!!
...全文
94 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzf8977 2004-09-11
  • 打赏
  • 举报
回复
谢谢大家,,问题解决了,,,

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)给我出了这么好的一个思路。。。
gwinner 2004-08-27
  • 打赏
  • 举报
回复
你用MySQL还是SQLServer ...?查一下你的存数据部分,要进行通配符转换的。
bohut 2004-08-27
  • 打赏
  • 举报
回复
varBLOB = m_pRecordset ->GetFields()->GetItem("ICON")->GetChunk( lDataSize ) ;

-------------------------
换成
varBLOB = m_pRecordset->GetFields()->GetItem("ICON")->Value;
Jimmy_Xia 2004-08-27
  • 打赏
  • 举报
回复
楼主,你要么试试做一个文件,每次运行程序就重新创建这个文件。
把你每次从数据库读取的图片数据保存到文件中,一旦碰到图片显示有问题的,就看看文件中数据是否正常,这样就能排除了数据读取错误问题。
然后第二步,不要从数据库中读取文件,你将显示错误的图片数据直接从文件读取或者更直接的在程序中写死,然后再看看能否正常显示图片。
如果也有问题,那要么图片文件错误,要么...我也不知道了,呵呵
lzf8977 2004-08-27
  • 打赏
  • 举报
回复
由于这种现象是偶尔出现的,但是文字始终能够正常的显示,,所以我自己觉得取数据库应该不会有什么问题。。我设了ListCtrl 的背景为空 语句如下:m_CtrlList.SetBkColor( CLR_NONE ) ;
holyeagle 2004-08-26
  • 打赏
  • 举报
回复
取出图像时候是否正确?
名牌大灰狼 2004-08-26
  • 打赏
  • 举报
回复
楼主和我的应该出的错应该是差不多.不过我的错没找出来
名牌大灰狼 2004-08-26
  • 打赏
  • 举报
回复
也来学习,我ListCtrl 的ICO图标有时也是一块白.
flyelf 2004-08-26
  • 打赏
  • 举报
回复
会不会是从数据库获取的时候有问题呢

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧