有一种按键,看起来是一幅完整的图片,当鼠标移到按键区域时,图片的一部分凸现,形成一个按键,当鼠标移走时又恢复原来状态。
最近,看了一些关于浮动按键的代码,其原理大致上跟CBitmapButton差不多,用数幅位图代表按键的各个状态,响应鼠标的各种消息来设置按键的状态,实现按键的浮动显示,但是这样的按键却不能和周围的背景混和成一幅图片。
为了实现“透明”按键,可以简单地做个试验:先在对话框中加入一个BUTTON,通过属性框选“Owner Draw”风格,再加入一个PICTURE,并加入图片,将BUTTON移到PICTURE上。运行结果发现,按键没有显示出来,但在按键区域按下鼠标时,该按键仍然能发出WM_COMMAND消息,这样一个纯透明的按键建立了。显然,这个按键是毫无使用意义的,因为用户不知道按键的位置,必须让用户容易觉察到按键的位置,可以把这个按键改造一下:
(首先从CButton派生出一个新类CDrawButton)
·把按键的标题显示出来
这个实现起来比较简单,我们可以重载CButton类的成员函数DrawItem(),
void CDrawButton::DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC dc; CRect rect=lpDrawItemStruct->rcItem;//得到按键区域 CString sCaption; dc.Attach(lpDrawItemStruct- >hDC); //得到设备环境CDC VERIFY(lpDrawItemStruct- >CtlType==ODT_BUTTON); GetWindowText(sCaption);//得到按键的标题 dc.SetBkMode(TRANSPARENT);//透明显示 CFont* m_pOldFont=dc.SelectObject(m_pFont); dc.DrawText(sCaption,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); dc.SelectObject(m_pOldFont); }
其中的m_pFont是成员变量,它保存了对话框的字体指针,为了按键的标题风格与对话框的字体风格一致,在初始化时调用对话框的成员函数GetFont()即可得到指向对话框字体的CFont类指针。
·使按键浮动显示
要通过自绘来表示按键的各种状态,可填写DRAWITEMSTRUCT来通知DrawItem()函数需要做什么,我们先了解一下DRAWITEMSTRUCT:
typedef struct tagDRAWITEMSTRUCT{ UINT CtlType; // 控件类型 UINT CtlID;// 控件的ID号 UNIT itemID;//菜单项的索引 UINT itemAction;// 绘图操作 UINT itemState; // 状态 HWND hwndItem; // 控件的窗口句柄 HDC hDC; // 相关的设备环境 RECT rcItem;//控件的范围 DWORD itemData;//指定与菜单项相联系的应用程序定义的32位值 }DRAWITEMSTRUCT;
利用这个结构先做一个按键状态设置函数: void CDrawButton::SetButtonMode(UINT action, UINT mode) { // TODO: Add your message handler code here and/or call default DRAWITEMSTRUCT DIS; DIS.CtlType = ODT_BUTTON; DIS.CtlID = GetDlgCtrlID(); DIS.itemAction = action; DIS.itemState = mode; DIS.hwndItem = GetSafeHwnd(); DIS.hDC = GetDC()- >GetSafeHdc(); GetClientRect(&(DIS.rcItem)); SendMessage(WM_DRAWITEM,(WPARAM) GetSafeHwnd(),(LPARAM)&DIS); ReleaseDC(CDC::FromHandle(DIS.hDC)); }
这样,我们可以响应鼠标的各种消息来设置按键的各种状态: void CDrawButton::OnMouseMove (UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CRect rect; GetClientRect(&rect); if(rect.PtInRect(point)){ if (mBtnStats==BTN_NORMAL){ SetButtonMode(ODA_SELECT, ODS_FOCUS); SetCapture(); } } else{ //AutoLoad(GetDlgCtrlID(),GetParent()); SetButtonMode(ODA_DRAWENTIRE,ODS_DEFAULT); ReleaseCapture(); }
CButton::OnMouseMove(nFlags, point); }
这里,mBtnStats是个UINT类型的成员变量,它可以有三种自定义状态: BTN_NORMAL 正常状态 BTN_UP 鼠标移入按键区域或释放鼠标 BTN_DOWN 按下鼠标 (可以再加一种DISABLE状态)
当在按键区域释放鼠标时,必须发送WM_COMMAND消息: void CDrawButton::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CRect rect; GetClientRect(&rect); if(rect.PtInRect(point)){ if (mBtnStats==BTN_DOWN) GetParent()- >SendMessage(WM_COMMAND, MAKELPARAM(GetDlgCtrlID(),BN_CLICKED), (LPARAM)GetSafeHwnd()); SetCapture(); } else{ SetButtonMode(ODA_DRAWENTIRE,ODS_DEFAULT); ReleaseCapture(); }
CButton::OnLButtonUp(nFlags, point); } <  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
1/2 1 2 下一页 尾页 |