awItemStruct->itemstate & ODS-SELECTED
) &&
(lpDrawItemStruct->itemAction &
(ODA-SELECT | ODA-DRAWENTIRE))) { //选中了本控
制===>高亮边框
COLORREF fc=RGB(255-GetRvalue(m-color), 255-GetG
Value(m-color), 255-GetBValue(m-color));
CBrush brush(fc);
dc.FrameRect(&(lpDrawItemStruct->rcItem),&brush
);
} if (!(lpDrawItemStruct->itemState & ODS-SELECT
ED) &&
(lpDrawItemStruct->itemAction & ODA-SELECT)){
//控制的选中状态结束===>去掉边框
CBrush brush(m-color);
dc.FrameRect(&lpDrawItemStruct->rcItem,&brush);
} dc.Detach();
} //用于改变颜色的成员函数
void CColorButton::ChangeColor(COLORREF color) { CR
ect rect;
m-color=color;
GetClientRect(&rect);
}
m-colorChangeColor(COLORREF color)color,WM-DRAWITEM
上面代码中数据成员m-color和来保存按钮的颜色。ChangeColo
r(COLORREF color)函数负责改变按钮颜色值为color,然后通过使
控制的客户区无效而激发WM-DRAWITEM消息。现在这个按钮控制类就
算搭好了。下面我们把它加入到对话框中来试验一下(中)
用VC++实现自绘按钮控制
1.首先通过AppWizard创建一个单文档的应用。
2.紧接着启动AppStadio创建一个对话框。添加一个按钮控制,
并将其ID设置为 IDC-COLORBUTTON。最后一定要记住将push Button
Properties对话框中的Owner Draw检查框置上检查标志。
3.在AppStadio内运行ClassWizzand来产生CTestDialog类。然
后在CTestdialog类中加入数据成员,在CTestDialog类说明加入如下
的private型数据成员:
private:
ccolorButton m-ColorButton;
4.现在剩下的
问题是到底要怎样才能使m-ColorButton的DrawI
tem函数能响应系统发往ID值为IDC-COLORBUTTON的按钮控制的WM-D
RAWITEM消息。这时就要用到CWnd类的成员函数BOOL CWnd::Subcla
ssDlgItem(UINT nID,CWnd *pParent)。通过调用这个函数,我们
可以动态地接管从对话框
模板产生的控制,并把它隶属于CWnd对象。
即用当前的CWnd对象接管发向隶属于pParent的ID号为nID的控制的一
切消息。对于按钮控制而言,它把当前的按钮控制的位置和大小也清
成和nID对应的按钮控制一样。于是我们对CTestDialog的源文件进行
如下的编辑:
BOOL CTestDialog::OnInitDialog()
{ CDialog::OnInitDialog();
//TODO:Add extra initialization here
m-ColorButton.SubclassDlgtem(IDC-COLORBUTTON,this)
;//接管消息
m-ColorButton.ChangeColor(RGB(255,0,0);//设置为
红色(可设为任何颜色)
return(TRUE);
}
接着通过ClassWizzard在CTestDialog中加入一个响应鼠标点击I
DC-COLORBUTTON按钮的消息的函数:
void CTestDialog::OnColerbutton()
{ //TODO:Add your control notification handler code
here
int r=int(((float)rand()/RAND-MAX)*255
int g=int(((float)rand()/RAND-MAX)*255
int b=int(((float)rand()/RAND-MAX)*255
m-ColorButton.ChangeColor(RGB(r,g,b));
}
5.最后,利用ClassWizzard为View加入一个响应WM-LBUTTONDO
WN的函数,以便激活对话框。请按如下代码对其进行编辑。
void CTestView::OnLButtonDown(UINT nflags,POINT po
int)
{ CTestDialog dlg;
dlg.Domodal();
}
6.编译并测试该
程序。当鼠标在落视窗中时,按下鼠标左键应能
弹出一个对话框。在对话框中的红色矩形区域内按下鼠标左键就会使
其边框变成高亮状态,若在这块区域内释放左键则这城区域就会改变
颜色且颜色是随机的。
只需更改DrawI