本帖最后由 equalman 于 2011-01-24 14:13:53 编辑

解决方案 »

  1.   

    自己顶,如果设计成popup风格的 会是这样的
      

  2.   

    自己顶个,描绘代码是这样的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);
                }
            }
        }
    }
      

  3.   

    ITEM的区域是可以变成其它颜色的,你其它区域不好搞
    pDC->FillRect(lpDrawItemStruct->rcItem, (HBRSUH)GetStockObject(BLACK_BRUSH));
      

  4.   

    现在不是颜色的问题,我写了输出文字的代码,就是图片上的那个 第几个产品 如果是popup风格就会显示 不过dialog位置有问题,有个都出来了 child就不显示,不知哪里还需要设置下
      

  5.   

    自己顶,我发现child模式的 不是不显示 是不知道隐藏在什么地方了 有时能看到 可同样的代码 popup风格下却能显示 只是有对话框出了listbox的范围了 不知道为什么 
      

  6.   

    没有,刚发现了原因.
       那个listbox里的对话框我是以屏幕坐标移动到listbox的相应位置的;比如当前listbox不用滚动条只能容纳一个dialog,而有两个dialog要显示,一开始显示完成,我滚动了滚动条到第二个dialog,此时我移动了应用程序,因为drawitem函数只重绘当前已经显示的dialog,而不会管当前没显示的item,没有显示的第一个dialog还在原来的位置,就有了下面这幅图片
      

  7.   

    如果在listbox里显示CStatic控件的话 movewindow设置为lpDrawItemStruct->rcItem就可以,而显示CDialog的话就要把这个框换成屏幕坐标系 否则dialog会显示在屏幕左上角?
      

  8.   

    我不明白为啥要Dialog呢?在自绘里加个窗口我怕闪烁会很严重。
    至于对话框颜色改变,可以处理下OnEraserBkgnd,好像这么拼写的吧。返回一个灰色刷就好了。
      

  9.   

    那该怎么办嗯 我发现了 40条数据时闪烁已经很严重,那这个问题我该怎么完成呢
    这个是要模仿的程序
     http://hi.csdn.net/attachment/201101/24/0_1295871327uTUu.gif 
    右键下载改成exe就可以运行
      

  10.   

    http://hi.csdn.net/attachment/201101/24/0_1295871327uTUu.gif