15,978
社区成员
发帖
与我相关
我的任务
分享
/ CWEComboBox
IMPLEMENT_DYNAMIC(CWEComboBox, CComboBox)
CWEComboBox::CWEComboBox()
{
m_bmpDownBtn.LoadBitmap(IDB_BITMAP5);
m_stateDownBtn = NORMAL;
}
CWEComboBox::~CWEComboBox()
{
}
void CWEComboBox::DrawPicture(CDC* pDC, int nState, CRect rect)
{
CBitmap *pOldBitmap;
CDC* pMemDC = new CDC;
//读位图到内存
pMemDC->CreateCompatibleDC(pDC);
pOldBitmap = pMemDC->SelectObject(&m_bmpDownBtn);
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), pMemDC, rect.Width()*nState, 0, SRCCOPY);
pMemDC->SelectObject(pOldBitmap);
//释放内存
ReleaseDC(pMemDC);
delete pMemDC;
}
void CWEComboBox::DrawShowText(CDC* pDC)
{
//获取显示文字
TCHAR strText[MAX_PATH+1];
::GetWindowText(m_hWnd, strText, MAX_PATH);
if (strText==NULL)
return;
CFont* hOldFont = pDC->SelectObject(GetFont());
CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
int nMode = pDC->SetBkMode(TRANSPARENT);
CPoint pt(2, 2);
pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
pDC->SelectObject(hOldFont);
pDC->SetBkMode(nMode);
}
BEGIN_MESSAGE_MAP(CWEComboBox, CComboBox)
ON_WM_PAINT()
//ON_WM_MOUSEMOVE() //屏蔽映射鼠标移动消息
//ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
//ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_CONTROL_REFLECT(CBN_SELCHANGE, OnCbnSelchange)
END_MESSAGE_MAP()
// CWEComboBox 消息处理程序
void CWEComboBox::OnPaint()
{
CPaintDC dc(this);
CRect rectCombo;
CBrush brushInser, brushOuter;
COMBOBOXINFO comboInfo;
CString strShow;
//获取控件信息
GetWindowText(strShow);
comboInfo.cbSize = sizeof(COMBOBOXINFO);
GetComboBoxInfo(&comboInfo);
if(comboInfo.stateButton==8)
{
m_stateDownBtn = DOWN;
}else if(m_stateDownBtn!=OVER)
{
m_stateDownBtn = NORMAL;
}
//设置重绘区域
GetClientRect(rectCombo);
//创建画刷
//brushInser.CreateSolidBrush(RGB(0, 0, 0)); // 内部区域颜色
brushOuter.CreateSolidBrush(RGB(0, 0, 0)); // 边框矩形颜色
//重绘
//dc.FillRect(rectCombo, &brushInser); //鼠标移动到控件上时,此处会在光标的y坐标,生成一条直线
dc.FrameRect(rectCombo, &brushOuter);
DrawPicture(&dc, m_stateDownBtn, comboInfo.rcButton);
DrawShowText(&dc);
}
void CWEComboBox::OnCbnSelchange()
{
CRect rc;
GetWindowRect(&rc);
ScreenToClient(&rc);
RedrawWindow(rc);
//Invalidate();
//UpdateWindow();
}
CWEComboBox m_comboBox;
HBRUSH CLaunchDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if (nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT); //设置背景透明
pDC->SetTextColor(RGB(255,255,255)); //字体颜色设置为白色
hbr = (HBRUSH)GetStockObject(NULL_BRUSH);
}
else if (pWnd->GetDlgCtrlID() == IDC_COMBO1)
{
//去除边框
CRect rect;
this->m_comboBox.GetClientRect(rect);
HRGN hRgn=::CreateRectRgn(rect.left + 2, rect.top + 2, rect.Width()-2, rect.Height()-2);
::SetWindowRgn(this->m_comboBox.m_hWnd, hRgn, true);
pDC->SetBkColor(TRANSPARENT);
pDC->SetTextColor(RGB(255,237,134));
hbr = (HBRUSH)GetStockObject(NULL_BRUSH);
}
else if (nCtlColor == CTLCOLOR_LISTBOX) //启动模式下拉列表颜色背景
{
pDC->SetBkColor(RGB(0,0,0));
pDC->SetTextColor(RGB(255,237,134));
hbr = (HBRUSH)GetStockObject(BLACK_BRUSH);
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}