创建了对话框的程序,对话框上导入背景图片,放置一个组合框控件,实现下拉。
现要实现下拉前面导入图标,且是大图标,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的。
现要实现下拉前面导入图标,且是大图标,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的。
解决方案 »
- API Hook CreateFile将返回值替代后为什么不能正常使用?
- 无模式对话框中可以在重载的OnOK函数中删除对话框对象吗?
- 设计一个界面 将G代码转换成c语言程序
- CMyEdit继承CEdit,怎样显示红背景,黄字体?
- WebBrowser控件编程 网页访问成功什么事件?好像访问失败,也都会触发那几个Complete事件的
- SDI程序改变一个对话框里的参数怎么去改变view类里的参数??
- error C2011: "class"类型重定义,求帮助,谢谢
- 如何屏蔽键盘上的Win键?让我的程序接收后就直接消灭它?
- 怎么样得到一台机算机对应的一个机器码?
- 高分相求---------->if(满足)一定给分!!!
- 控件同步响应问题
- m_pConnection->Execute((LPCTSTR)strSQL,NULL,-1);这句话哪写错了?
可以指定画出的尺寸
直接使用API函数吧:
HICON hIcon=LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(uID));
::DrawIconEx(dc.m_hDC,pt.x,pt.y,64,64);
{
// 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();
}
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
);
1.好像不能使选中的放到Combobox框中。。
2.文字不能测试成功,都是乱码。。
GetLBText()获取的是乱码。。
这样的写法也不对吧! error C2660: “DrawIconEx”: 函数不接受 8 个参数
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();
}