当前位置:编程学习 > VC++ >>

在Visual C++中透明浮动按键的实现

 

 

有一种按键,看起来是一幅完整的图片,当鼠标移到按键区域时,图片的一部分凸现,形成一个按键,当鼠标移走时又恢复原来状态。

最近,看了一些关于浮动按键的代码,其原理大致上跟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 = Ge

补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,