创建了对话框的程序,对话框上导入背景图片,放置一个组合框控件,实现下拉。
现要实现下拉前面导入图标,且是大图标,64*64.如下图:可是上面的不能够显示大图标,要显示下面的64*64的图标:
程序编译运行都是正确的,我导入4张图标也是64*64的,可是显示的时候是32*32的,下面是我的测试代码:
继承了CComboBox
#pragma once
// CNewComboBoxclass CNewComboBox : public CComboBox
{
DECLARE_DYNAMIC(CNewComboBox)public:
CNewComboBox();
virtual ~CNewComboBox();protected:
DECLARE_MESSAGE_MAP()
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);   //绘制图标函数
int CNewComboBox::SetItemIcon(UINT nID,LPCTSTR lpszString); //设置图标函数
};
//
//
//实现部分void CNewComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO:  添加您的代码以绘制指定项 CDC dc;
dc.Attach(lpDrawItemStruct->hDC);         //组合框DC
CRect itemRect(lpDrawItemStruct->rcItem); //项区域 int nSate  = lpDrawItemStruct->itemState;   //项状态
int nIndex = lpDrawItemStruct->itemID;      //项索引 if(nIndex != -1)
{
if(nSate & ODS_SELECTED)    //如果选中该项
{
dc.FillSolidRect(&itemRect,RGB(124,231,169));
}
else
{
dc.FillSolidRect(&itemRect,RGB(2,94,193));
}

UINT uID = GetItemData(nIndex);
POINT pt;
pt.x = itemRect.left;
pt.y = itemRect.top;
dc.DrawIcon(pt,LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(uID))); //画图标
itemRect.left += 1; dc.SetBkMode(TRANSPARENT);
CString str;
GetLBText(nIndex,str);
dc.DrawText(str,itemRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); //显示文本
} dc.Detach();
}int CNewComboBox::SetItemIcon(UINT nID,LPCTSTR lpszString)  //第一个参数是图标ID号,第二个是文本内容
{
int index = AddString(lpszString);
SetItemData(index,nID);
return index;
}
我在OnInitDialog()中调用:
BOOL CTestUserComboxDlg::OnInitDialog()
{
CDialog::OnInitDialog();        ………… // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 m_Combox.SetItemIcon(IDI_ICON1,_T(""));
m_Combox.SetItemIcon(IDI_ICON2,_T(""));
m_Combox.SetItemIcon(IDI_ICON3,_T(""));
m_Combox.SetItemIcon(IDI_ICON4,_T("")); m_Combox.SetItemHeight(-1,72);
m_Combox.SetItemHeight(0, 72);// m_Combox.SetItemHeight(-1, m_Combox.m_sizeIcon.cy + 6);
// m_Combox.SetItemHeight(0, m_Combox.m_sizeIcon.cx + 6); return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}望高手们,帮忙看看。导入到资源的是64*64的图标,显示的是32*32的。

解决方案 »

  1.   

    别用DrawIcon,换DrawIconEx
    可以指定画出的尺寸
      

  2.   

    补充:CDC里好像没有封装DrawIconEx
    直接使用API函数吧:
    HICON hIcon=LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(uID));
    ::DrawIconEx(dc.m_hDC,pt.x,pt.y,64,64);
      

  3.   

    看看combo能不能修改图标大小
      

  4.   

    错误:error C2660: “DrawIconEx”: 函数不接受 5 个参数void CNewComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    // TODO:  添加您的代码以绘制指定项 CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);         //组合框DC
    CRect itemRect(lpDrawItemStruct->rcItem); //项区域 int nSate  = lpDrawItemStruct->itemState;   //项状态
    int nIndex = lpDrawItemStruct->itemID;      //项索引 if(nIndex != -1)
    {
    if(nSate & ODS_SELECTED)    //如果选中该项
    {
    dc.FillSolidRect(&itemRect,RGB(124,231,169));
    }
    else
    {
    dc.FillSolidRect(&itemRect,RGB(2,94,193));
    }

    UINT uID = GetItemData(nIndex);
    POINT pt;
    pt.x = itemRect.left;
    pt.y = itemRect.top; //dc.DrawIcon(pt,LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(uID))); //画图标 HICON hIcon=LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(uID));
    ::DrawIconEx(dc.m_hDC,pt.x,pt.y,64,64);
    itemRect.left += 1; dc.SetBkMode(TRANSPARENT);
    CString str;
    GetLBText(nIndex,str);
    dc.DrawText(str,itemRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); //显示文本
    } dc.Detach();
    }
      

  5.   


    BOOL DrawIconEx(
      HDC hdc,                   // handle to device context
      int xLeft,                 // x-coord of upper left corner
      int yTop,                  // y-coord of upper left corner
      HICON hIcon,               // handle to icon
      int cxWidth,               // icon width
      int cyWidth,               // icon height
      UINT istepIfAniCur,        // frame index, animated cursor
      HBRUSH hbrFlickerFreeDraw, // handle to background brush
      UINT diFlags               // icon-drawing flags
    );
      

  6.   

    例如::DrawIconEx(dc.m_hDC,pt.x,pt.y,64,64, 0, NULL, DI_NORMAL);
      

  7.   

    DrawIconEx (hDC, X, Y, hIcon, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT | DI_DEFAULTSIZE); 
      

  8.   

    测试了你的代码。。
    1.好像不能使选中的放到Combobox框中。。
    2.文字不能测试成功,都是乱码。。
    GetLBText()获取的是乱码。。
      

  9.   


    这样的写法也不对吧!  error C2660: “DrawIconEx”: 函数不接受 8 个参数
      

  10.   

    谢谢你们,问题解决了下面是我修改的代码:
    void CNewComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    // TODO:  添加您的代码以绘制指定项 CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);         //组合框DC
    CRect itemRect(lpDrawItemStruct->rcItem); //项区域 int nSate  = lpDrawItemStruct->itemState;   //项状态
    int nIndex = lpDrawItemStruct->itemID;      //项索引 if(nIndex != -1)
    {
    if(nSate & ODS_SELECTED)    //如果选中该项
    {
    dc.FillSolidRect(&itemRect,RGB(124,231,169));
    }
    else
    {
    dc.FillSolidRect(&itemRect,RGB(2,94,193));
    }

    UINT uID = GetItemData(nIndex);
    POINT pt;
    pt.x = itemRect.left;
    pt.y = itemRect.top; HICON hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(uID),IMAGE_ICON, 64,64,0); //画图标 //dc.DrawIcon(pt,LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(uID))); //画图标        DrawIconEx(dc.m_hDC,pt.x,pt.y,hIcon,64,64,0,NULL,DI_NORMAL);
       /* CDC *pDC = GetDC();  
    CPoint pt(10,10);  
      
    ReleaseDC(pDC);  
    DeleteObject(hIcon); */ // DrawIconEx (lpDrawItemStruct->hDC, pt.x, pt.y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT | DI_DEFAULTSIZE);  itemRect.left += 1; dc.SetBkMode(TRANSPARENT);
    CString str;
    GetLBText(nIndex,str);
    dc.DrawText(str,itemRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); //显示文本
    } dc.Detach();
    }