主要的步骤有:
1. 首先在属性设为OwerDraw,这是运行的话,按钮并不会显示。
2. 重载PreTranslateMessage和OnDrawItem函数在按钮所在的对话框中
3.实现重绘的代码 ;
void CDockBotton::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (nIDCtl == IDC_BUTTON_SCANPure
|| IDC_BUTTON_DYNAMICPure
|| IDC_BUTTON_3DSHOWPure
|| IDC_BUTTON_DPSHOWPure) //checking for the button
{
CDC dc;
RECT rect;
dc.Attach(lpDrawItemStruct->hDC); // Get the Button DC to CDC
rect = lpDrawItemStruct->rcItem; //Store the Button rect to our local rect.
dc.Draw3dRect(&rect, RGB(100, 100, 100), RGB(0, 0, 0));
dc.FillSolidRect(&rect, RGB(50, 50, 50));//Here you can define the required color to appear on the Button.
dc.SetTextColor(RGB(255, 0, 0));
UINT state = lpDrawItemStruct->itemState; //This defines the state of the Push button either pressed or not.
if ((state & ODS_SELECTED))
{
dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT);
}
else
{
dc.DrawEdge(&rect, EDGE_RAISED, BF_RECT);
}
switch (m_Style)
{
case 0:
{
dc.SetBkColor(RGB(50, 50, 50)); //Setting the Text Background color
dc.SetTextColor(RGB(255, 0, 0)); //Setting the Text Color
}
break;
case 1:
{
dc.Draw3dRect(&rect, RGB(0, 0, 0), RGB(255, 255, 255));
dc.FillSolidRect(&rect, RGB(0, 205, 0));
dc.SetBkColor(RGB(50, 50, 50)); //Setting the Text Background color
dc.SetTextColor(RGB(255, 0, 0)); //Setting the Text Color
UINT state = lpDrawItemStruct->itemState; //This defines the state of the Push button either pressed or not.
if ((state & ODS_SELECTED))
{
dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT);
}
else
{
dc.DrawEdge(&rect, EDGE_RAISED, BF_RECT);
}
}
break;
case 2:
{
dc.Draw3dRect(&rect, RGB(0, 0, 0), RGB(255, 255, 255));
dc.FillSolidRect(&rect, RGB(255, 255, 255));
dc.SetBkColor(RGB(125, 125, 125)); //Setting the Text Background color
dc.SetTextColor(RGB(255, 0, 0)); //Setting the Text Color
UINT state = lpDrawItemStruct->itemState; //This defines the state of the Push button either pressed or not.
if ((state & ODS_SELECTED))
{
dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT);
}
else
{
dc.DrawEdge(&rect, EDGE_RAISED, BF_RECT);
}
}
break;
}
TCHAR buffer[MAX_PATH]; //To store the Caption of the button.
ZeroMemory(buffer, MAX_PATH); //Intializing the buffer to zero
::GetWindowText(lpDrawItemStruct->hwndItem, buffer, MAX_PATH); //Get the Caption of Button Window
dc.DrawText(buffer, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//Redraw the Caption of Button Window
dc.Detach(); // Detach the Button DC
CPaneDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
}
HBRUSH CDockBotton::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr;
pDC->SetTextColor(RGB(255, 255, 255));
pDC->SetBkMode(OPAQUE);
pDC->SetBkColor(RGB(50, 50, 50));
hbr = CreateSolidBrush(RGB(50, 50, 50));
return hbr;
}
BOOL CDockBotton::PreTranslateMessage(MSG* pMsg)
{
if (WM_KEYDOWN == pMsg->message)
{
m_Style = 1;
}
if (pMsg->message == WM_KEYUP)
{
m_Style = 2;
}
return CPaneDialog::PreTranslateMessage(pMsg);
}
按钮中字体大小格式修改 :
CFont * f; f = new CFont; f->CreateFont(36, // nHeight 0, // nWidth 0, // nEscapement 0, // nOrientation FW_BOLD, // nWeight TRUE, // bItalic FALSE, // bUnderline 0, // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily _T("Arial")); // lpszFac GetDlgItem(IDC_BUTTON1)->SetFont(f);