www.pudn.com > 44757463.rar > LineComboBox.cpp
//////////////////////////////////////////////////////////////////////
// CLASS : CLineComboBox
// ABSTRACT : 线条宽度选择组合框
// NOTE : 主要是用在图形的属性设置时的笔宽设置
// CREATE : FNST)handwolf 2004-4-21
// UPDATE :
// :
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "LineComboBox.h"
//################################################################
CLineComboBox::CLineComboBox()
{
//当前鼠标是否在对象上
m_nMouseState = 0;
m_nLineLength = 45;
m_nItemHeight = 20;
m_nMargin=2;
}
//################################################################
CLineComboBox::~CLineComboBox()
{
while(!m_LineWidthList.IsEmpty()){
delete m_LineWidthList.RemoveHead();
}
}
//################################################################
BOOL CLineComboBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
DWORD dw = dwStyle;
//dw |= CBS_OWNERDRAWVARIABLE;
if( !CComboBox::Create(dw, rect, pParentWnd, nID) )
return false;
CFont * font = CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
SetFont(font);
return true;
}
//################################################################
void CLineComboBox::Init()
{
for(int i = 0; i <= 6; i++)
{
LPBSCBITEM lpItem = new BSCBITEM;
CString strText;
strText.Format(" %d",i+1);
lpItem->lpCaption=strText;
lpItem->iIndex = AddString(strText);
lpItem->nLineWidth = i+1;
if(m_LineWidthList.IsEmpty())
m_LineWidthList.AddHead(lpItem);
else
m_LineWidthList.AddTail(lpItem);
}
}
//################################################################
IMPLEMENT_DYNCREATE(CLineComboBox, CComboBox)
BEGIN_MESSAGE_MAP(CLineComboBox, CComboBox)
//{{AFX_MSG_MAP(CLineComboBox)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//################################################################
BOOL CLineComboBox::OnEraseBkgnd(CDC* pDC)
{
ASSERT(pDC->GetSafeHdc());
return false;
}
//################################################################
void CLineComboBox::OnPaint()
{
CPaintDC dc(this);
OnCBPaint(&dc);
}
//################################################################
void CLineComboBox::OnCBPaint(CDC* pDC)
{
ASSERT(pDC->GetSafeHdc());
//绘制客户区
CDC dMemDC;
dMemDC.CreateCompatibleDC(pDC);
dMemDC.SetMapMode(pDC->GetMapMode());
//画动作
CBitmap mNewBmp;
RECT rc;
GetClientRect(&rc);
mNewBmp.CreateCompatibleBitmap(pDC, rc.right - rc.left, rc.bottom - rc.top);
CBitmap* pOldBmp = dMemDC.SelectObject(&mNewBmp);
//子类可以以friend方式来访问父类的protected成员变量和函数
CWnd::DefWindowProc(WM_PAINT, (WPARAM)dMemDC.m_hDC, 0);
pDC->BitBlt(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, &dMemDC,
rc.left ,rc.top, SRCCOPY);
//恢复
dMemDC.SelectObject(pOldBmp);
pOldBmp->DeleteObject();
dMemDC.DeleteDC();
GetWindowRect(&rc);
ScreenToClient(&rc);
pDC->DrawEdge(&rc, (m_nMouseState ? BDR_RAISEDINNER : BDR_SUNKENINNER), BF_RECT);
}
//################################################################
void CLineComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = m_nItemHeight;
}
//################################################################
void CLineComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
ASSERT(lpDIS->CtlType == ODT_COMBOBOX);
//画笔
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
ASSERT(pDC->GetSafeHdc());
//绘制区
RECT rc = lpDIS->rcItem;
CRect rcLine(rc), rcTxt(rc);
//当前的Item索引号
LPBSCBITEM lpItem = GetItem(lpDIS->itemID);
if(lpItem != NULL){
BOOL bSelected =lpDIS->itemState & ODS_SELECTED;
pDC->FillSolidRect(&rcLine,RGB(255,255,255));//察除以前的画面
//如果选中
if(bSelected){
pDC->FillSolidRect(&rcLine,RGB(0,255,255));
}
//画Line
CPen pen,*pOldPen;
pen.CreatePen(PS_SOLID,lpItem->nLineWidth,RGB(0,0,255));
pOldPen=pDC->SelectObject(&pen);
rcLine.right=rcLine.left+m_nLineLength;
rcLine.DeflateRect(m_nMargin,m_nMargin);
pDC->MoveTo(rcLine.left,(rcLine.top+rcLine.bottom)/2);
pDC->LineTo(rcLine.right,(rcLine.top+rcLine.bottom)/2);
pDC->SelectObject(pOldPen);
// pDC->DrawEdge(&rcLine, BDR_RAISEDINNER, BF_RECT);
//开始画文字
int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0, 0, 0));
rcTxt.left = rcLine.right + m_nMargin;
// rcTxt.top = rcLine.top;
pDC->DrawText(lpItem->lpCaption,&rcTxt,DT_VCENTER|DT_END_ELLIPSIS|DT_NOCLIP|DT_SINGLELINE);
pDC->SetBkMode(nOldBkMode);
}
}
//################################################################
LPBSCBITEM CLineComboBox::GetItem(int iIndex)
{
//当前的Item索引号
POSITION pos = m_LineWidthList.FindIndex(iIndex);
if(pos)
{
LPBSCBITEM lpItem = m_LineWidthList.GetAt(pos);
ASSERT(lpItem);
return lpItem;
}
else
return (LPBSCBITEM)NULL;
}
//################################################################
void CLineComboBox::OnMouseMove(UINT nFlags, CPoint point)
{
CComboBox::OnMouseMove(nFlags, point);
}
int CLineComboBox::GetCurLineWidth()
{
int nSel=GetCurSel();
POSITION pos = m_LineWidthList.FindIndex(nSel);
if(pos)
{
LPBSCBITEM lpItem = m_LineWidthList.GetAt(pos);
ASSERT(lpItem);
return lpItem->nLineWidth;
}
else
return 0;
}