因为项目需要,这段时间对VC中对话框稍微研究学习了一下,其中碰到一个问题,关于按钮背景色设置的问题。
搜索资料,发现很多提到的是新建一个继承自CBUTTON的按钮类,然后重载OnDrawItem函数,再在自己的对话框中实例化此类,并绑定到自己的按钮控件上。实验后发现,不知是哪里的问题,按钮显示为灰色,字体没有。此方法失败。
随后发现一个大神提供了一种简单的方法,在对话框类中添加ON_WM_DRAWITEM消息,然后在添加以下代码
void CMyDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//checking for the button
if(nIDCtl==IDC_Sign)
{
CDC dc;
RECT rect;
// Get the Button DC to CDC
dc.Attach(lpDrawItemStruct ->hDC);
//Store the Button rect to our local rect.
rect = lpDrawItemStruct->rcItem;
dc.Draw3dRect(&rect,RGB(255,255,255),RGB(0,0,0));
//Here you can define the required color to appear on the Button.
dc.FillSolidRect(&rect,RGB(100,100,255));
//This defines the state of the Push button either pressed or not.
UINT state=lpDrawItemStruct->itemState;
if((state & ODS_SELECTED))
{
dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);
}
else
{
dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
}
//Setting the Text Background color
dc.SetBkColor(RGB(100,100,255));
//Setting the Text Color
dc.SetTextColor(RGB(255,0,0));
//To store the Caption of the button.
TCHAR buffer[MAX_PATH];
//Intializing the buffer to zero
ZeroMemory(buffer,MAX_PATH );
//Get the Caption of Button Window
::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
//Redraw the Caption of Button Window
dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
dc.Detach(); // Detach the Button DC
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
结果证明可行,注意在控件属性中选择OwnerDraw。