如何用VC++处理ComboBox中加入颜色、线形等选项(如Word中的一样)?

yuanhaili 2000-06-08 02:10:00
加精
如何用VC++处理ComboBox中加入颜色、线形等选项(如Word中的一样)?
请大侠拔刀相助!
...全文
350 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sutao 2000-06-13
  • 打赏
  • 举报
回复
关注.
softdoctor 2000-06-08
  • 打赏
  • 举报
回复
要自绘才行
如下是一个我写的ColorComboBox的原码
看吧!
class CColorComboBox : public CComboBox
{
// Construction
public:
CColorComboBox();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CColorComboBox)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
virtual int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
//}}AFX_VIRTUAL

// Implementation
public:
void SetColor(UINT nID);
UINT m_iColorFrom;
BOOL Create(UINT nID,CRect rc,CWnd * pWnd);
void InitColor(BOOL bFront=TRUE,UINT iColorFrom=0,UINT iColorCount=16);
COLORREF GetColor(UINT nID);
UINT m_iColorCount;
virtual ~CColorComboBox();

// Generated message map functions
protected:
//{{AFX_MSG(CColorComboBox)
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
private:
BOOL m_bFront;
};


CColorComboBox::CColorComboBox()
{
}

CColorComboBox::~CColorComboBox()
{
}


BEGIN_MESSAGE_MAP(CColorComboBox, CComboBox)
//{{AFX_MSG_MAP(CColorComboBox)
ON_WM_DRAWITEM()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CColorComboBox message handlers

COLORREF CColorComboBox::GetColor(UINT nID)
{
ASSERT(nID >= 0);
ASSERT(nID < m_iColorCount);
if (nID == 0)
{
if(m_bFront)
return ::GetSysColor(COLOR_WINDOWTEXT);
else return ::GetSysColor(COLOR_WINDOW);
}
else
{
CPalette* pPal = CPalette::FromHandle( (HPALETTE) GetStockObject(DEFAULT_PALETTE));
ASSERT(pPal != NULL);
PALETTEENTRY pe;
if (pPal->GetPaletteEntries(nID, 1, &pe) == 0)
return ::GetSysColor(COLOR_WINDOWTEXT);
else
return RGB(pe.peRed,pe.peGreen,pe.peBlue);
}
}

void CColorComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
UINT id = lpDrawItemStruct->itemID;
static iPreSel = 0;
if(id<0 and and id>=m_iColorCount)
return;
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
CRect rc(lpDrawItemStruct->rcItem);
COLORREF cr=GetColor(id);
rc.DeflateRect(3,3);
if(lpDrawItemStruct->itemState & ODS_SELECTED and and lpDrawItemStruct->itemAction & ODA_SELECT )
{
if(iPreSel!=id)
{
CRect rcPre = rc;
rcPre.InflateRect(3,3);
rcPre.OffsetRect(0,-(id-iPreSel)*rcPre.Height());
dc.FillSolidRect(rcPre,GetSysColor(COLOR_WINDOW));
rcPre.DeflateRect(4,4);
dc.FillSolidRect(rcPre, GetColor(iPreSel));
iPreSel=id;
}
dc.Rectangle(rc);
}
if(lpDrawItemStruct->itemState&ODS_COMBOBOXEDIT )
dc.Rectangle(rc);
rc.DeflateRect(1,1);

CBrush brushFill(cr);
dc.FillRect(&rc, &brushFill);
dc.Detach();
}

void CColorComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
ASSERT(lpMeasureItemStruct->CtlType==ODT_COMBOBOX);
UINT id = lpMeasureItemStruct->itemData;
if(id<0 and and id>=m_iColorCount)
return;
CRect rc;
GetClientRect(&rc);
lpMeasureItemStruct->itemWidth = rc.Width();
lpMeasureItemStruct->itemHeight = 20;

}

void CColorComboBox::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CComboBox::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CColorComboBox::InitColor(BOOL bFront,UINT iColorFrom,UINT iColorCount)
{
m_bFront=bFront;
m_iColorFrom=iColorFrom;
m_iColorCount=iColorCount;
for (UINT i=0;i<iColorCount;i++)
{
AddString("");
SetItemData(i,i);
}
}

BOOL CColorComboBox::Create(UINT nID, CRect rc, CWnd * pWnd)
{
return CComboBox::Create(WS_VSCROLL and CBS_DROPDOWNLIST and WS_CHILD and WS_VISIBLE and CBS_OWNERDRAWFIXED and CBS_SORT and WS_TABSTOP,rc,pWnd,nID);
}

int CColorComboBox::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
// TODO: Add your code to determine the sorting order of the specified items
// return -1 = item 1 sorts before item 2
// return 0 = item 1 and item 2 sort the same
// return 1 = item 1 sorts after item 2
//return 1;
return 0;
}

void CColorComboBox::SetColor(UINT nID)
{
ASSERT(nID<m_iColorCount);
SetCurSel(nID);
}
bigjim 2000-06-08
  • 打赏
  • 举报
回复
CComboBox中如果不是标准的文字,就要设置Owner Draw属性,而且要重载一些函数来完成描绘自身的功能。你提到的加入颜色框、线条样式等问题,在CSDN上有很多例子。
http://red.east.net.cn/~develop/Visual%20C/index.htm查阅组合框

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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