WEB开发网
开发学院软件开发VC 用VC++实现自绘按钮控制 阅读

用VC++实现自绘按钮控制

 2008-11-13 19:31:12 来源:WEB开发网   
核心提示: 其中itemAction 和 itemState决定了需要的绘图操作.itemAction 说明需要的绘图操作,可为下列值中的一个或多个;值 含 义ODA_DRAWENTIRE 需要重来全部控制时ODA_FOCUS 获得或失去输入焦点ODA_SELECT 选择状态改变itemState指明

其中itemAction 和 itemState决定了需要的绘图操作.itemAction 说明需要的绘图操作,可为下列值中的一个或多个;

值 含 义

ODA_DRAWENTIRE 需要重来全部控制时

ODA_FOCUS 获得或失去输入焦点

ODA_SELECT 选择状态改变

itemState指明当前绘图动作发生之后,项的可见状态.下面是状态标志:

值 含 义

ODS_CHECKD 只用于菜单中

ODS_DISABLE 该项被屏蔽

ODS_FOCUS 该项具有输入焦点

ODS_GRAYED 只用于菜单中

ODS_SELECT 该项处于被选中状态

(上) □成都 曾志

用VC++实现自绘按钮控制

利用VC++编程会发现,当按钮控制接收到WM-DRMAWITEM消息时会调用Cbotton类的DrawItem函数.因此我们要做的就是利用C++的多态性通过重载CButton类的Drawitem函数来响应MW-DRAWITEM消息.

下面我们就实际构造一个CColorButton类.

class ccolorButton:public CButton
{ private:
COLORREF m-color:
public:
CColorButton():CButton(),m-color(0){}; //构造函数
void ChangeColor(COLORREF color); //改变颜色
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct
);//重载的函数
};
//重载的虚函数
void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawIt
emtruct)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC); //得到绘制的设备环境CDC
VERIFY( lpDrawItemStruct->CtlType==ODT-BUTTON);
if (lpDrawItemStruct->itemAction & ODA-DRAWENTIRE)
{
//重绘整个控制
CBrush brush(m-Color);
dc.FillRect(&(lpDrawItemstruct->reItem),&brush)
;
} if ((lpDrawItemStruct->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);
}

Tags:VC 实现 按钮

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接