listbox自绘显示child风格对话框,对话框变成了白色? 本帖最后由 equalman 于 2011-01-24 14:13:53 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己顶,如果设计成popup风格的 会是这样的 自己顶个,描绘代码是这样的void COwnerDrawListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { int itemCount = GetCount(); if (!destroyedListBox&&itemCount>0) { CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); Product *pListDataItem = (Product *)GetItemDataPtr(lpDrawItemStruct->itemID); if (NULL!=pListDataItem) { if((lpDrawItemStruct->itemAction | ODA_FOCUS) && (lpDrawItemStruct->itemState & ODS_FOCUS)) { CRect rect(lpDrawItemStruct->rcItem); pDC->DrawFocusRect(rect); } else if ((lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED)) { } else { } //ShowPic(pListDataItem->imageData,pListDataItem->imageLength,pDC,lpDrawItemStruct->rcItem); CRect temp=lpDrawItemStruct->rcItem; CPoint topleft,rightbottom; topleft.x=temp.left; topleft.y=temp.top; rightbottom.x=temp.right; rightbottom.y=temp.bottom; ClientToScreen(&topleft); ClientToScreen(&rightbottom); temp.left=topleft.x; temp.top=topleft.y; temp.bottom=rightbottom.y; temp.right=rightbottom.x; CWnd * pWndPic=NULL; CString text; text.Format("这是第%d个产品",lpDrawItemStruct->itemID+1); if (NULL!=pListDataItem->productItem) { pWndPic=(CWnd*)pListDataItem->productItem->GetDlgItem(IDC_PRODUCTITEMPIC); pWndPic->SetWindowText(text); pListDataItem->productItem->MoveWindow(&temp); pListDataItem->productItem->ShowWindow(SW_SHOW); } else { pListDataItem->productItem=new CProductItem(); pListDataItem->productItem->Create(IDD_PRODUCTITEM,this); pWndPic=(CWnd*)pListDataItem->productItem->GetDlgItem(IDC_PRODUCTITEMPIC); pWndPic->SetWindowText(text); pListDataItem->productItem->MoveWindow(&temp); pListDataItem->productItem->ShowWindow(SW_SHOW); } } }} ITEM的区域是可以变成其它颜色的,你其它区域不好搞pDC->FillRect(lpDrawItemStruct->rcItem, (HBRSUH)GetStockObject(BLACK_BRUSH)); 现在不是颜色的问题,我写了输出文字的代码,就是图片上的那个 第几个产品 如果是popup风格就会显示 不过dialog位置有问题,有个都出来了 child就不显示,不知哪里还需要设置下 自己顶,我发现child模式的 不是不显示 是不知道隐藏在什么地方了 有时能看到 可同样的代码 popup风格下却能显示 只是有对话框出了listbox的范围了 不知道为什么 没有,刚发现了原因. 那个listbox里的对话框我是以屏幕坐标移动到listbox的相应位置的;比如当前listbox不用滚动条只能容纳一个dialog,而有两个dialog要显示,一开始显示完成,我滚动了滚动条到第二个dialog,此时我移动了应用程序,因为drawitem函数只重绘当前已经显示的dialog,而不会管当前没显示的item,没有显示的第一个dialog还在原来的位置,就有了下面这幅图片 如果在listbox里显示CStatic控件的话 movewindow设置为lpDrawItemStruct->rcItem就可以,而显示CDialog的话就要把这个框换成屏幕坐标系 否则dialog会显示在屏幕左上角? 我不明白为啥要Dialog呢?在自绘里加个窗口我怕闪烁会很严重。至于对话框颜色改变,可以处理下OnEraserBkgnd,好像这么拼写的吧。返回一个灰色刷就好了。 那该怎么办嗯 我发现了 40条数据时闪烁已经很严重,那这个问题我该怎么完成呢这个是要模仿的程序 http://hi.csdn.net/attachment/201101/24/0_1295871327uTUu.gif 右键下载改成exe就可以运行 http://hi.csdn.net/attachment/201101/24/0_1295871327uTUu.gif com的几个问题 单线程没问题,多线程出问题 怪:Image *p=new Image结果返回NULL?! 基于MFC的DLL怎么实例化一个ActiveX控件 我想写程序设置自己的桌面,一定要将在程序中实现jpg到bmp的转换么? 如何在两个窗口间发消息 我已经登陆到了一台机器(NT系统),但没有安装任何远程控制软件,如何复制文件到这台机器, 新年散分大行动 能不能谈谈编译和运行呢? 为什么生成ATL程序后,编译时老死机呢? Alfresco查询,急。。。 存储资源时 Class Wizard 为灰
{
int itemCount = GetCount();
if (!destroyedListBox&&itemCount>0)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
Product *pListDataItem = (Product *)GetItemDataPtr(lpDrawItemStruct->itemID);
if (NULL!=pListDataItem)
{
if((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
(lpDrawItemStruct->itemState & ODS_FOCUS))
{
CRect rect(lpDrawItemStruct->rcItem);
pDC->DrawFocusRect(rect);
}
else if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED))
{ }
else
{ } //ShowPic(pListDataItem->imageData,pListDataItem->imageLength,pDC,lpDrawItemStruct->rcItem);
CRect temp=lpDrawItemStruct->rcItem;
CPoint topleft,rightbottom;
topleft.x=temp.left;
topleft.y=temp.top;
rightbottom.x=temp.right;
rightbottom.y=temp.bottom;
ClientToScreen(&topleft);
ClientToScreen(&rightbottom);
temp.left=topleft.x;
temp.top=topleft.y;
temp.bottom=rightbottom.y;
temp.right=rightbottom.x;
CWnd * pWndPic=NULL;
CString text;
text.Format("这是第%d个产品",lpDrawItemStruct->itemID+1);
if (NULL!=pListDataItem->productItem)
{
pWndPic=(CWnd*)pListDataItem->productItem->GetDlgItem(IDC_PRODUCTITEMPIC);
pWndPic->SetWindowText(text);
pListDataItem->productItem->MoveWindow(&temp);
pListDataItem->productItem->ShowWindow(SW_SHOW);
}
else
{
pListDataItem->productItem=new CProductItem();
pListDataItem->productItem->Create(IDD_PRODUCTITEM,this);
pWndPic=(CWnd*)pListDataItem->productItem->GetDlgItem(IDC_PRODUCTITEMPIC);
pWndPic->SetWindowText(text);
pListDataItem->productItem->MoveWindow(&temp);
pListDataItem->productItem->ShowWindow(SW_SHOW);
}
}
}
}
pDC->FillRect(lpDrawItemStruct->rcItem, (HBRSUH)GetStockObject(BLACK_BRUSH));
那个listbox里的对话框我是以屏幕坐标移动到listbox的相应位置的;比如当前listbox不用滚动条只能容纳一个dialog,而有两个dialog要显示,一开始显示完成,我滚动了滚动条到第二个dialog,此时我移动了应用程序,因为drawitem函数只重绘当前已经显示的dialog,而不会管当前没显示的item,没有显示的第一个dialog还在原来的位置,就有了下面这幅图片
至于对话框颜色改变,可以处理下OnEraserBkgnd,好像这么拼写的吧。返回一个灰色刷就好了。
这个是要模仿的程序
http://hi.csdn.net/attachment/201101/24/0_1295871327uTUu.gif
右键下载改成exe就可以运行