- 浏览: 14072 次
最新评论
Button图片按钮
2011年11月11日
VC自定义图片按钮控件的实现 ――转载自百度文档
以前编写过五子棋程序的框架,整个程序的背景都是我用photoshop画的,当然也包括几个按钮。
说是按钮,其实就是图片上的按钮,跟vc的按钮控件是完全不同,但是当时我想让画的按钮也响应鼠标动作比如鼠标移动到按钮上,鼠标单击等,方法很笨,就是在主对话框中对鼠标的移动和单击动作进行检测,如果发生位置位于按钮区,就在“按钮”区另贴一幅图,以实现鼠标在其上的效果,单击类似。
对于多个按钮,就要检测多个区域,程序十分复杂,而且性能很差。
于是想改写vc的CButton类,来实现我的功能。在网上查了很多资料,都是说怎么在按钮上显示一副图片,能显示但是还有着原来按钮的边框,虚线。还得自己动手写。
要求:
1.动态生成一个图片按钮,函数输入两幅图片的ID,及按钮坐标和大小,最为重要的是指定单击它要向父窗口传递的消息值(自定义)
2.当鼠标在经过按钮上时图片按钮变为另外一幅图,跟正常状态下的图像形成对比
3.当鼠标单击这个按钮,父窗口得到初始化时给这个窗口指定的消息值,以便在有多个按钮存在时进行区分响应
过程:
1.从CButton类派生CMyBtn类,增加如下变量:
enum {STATE_MOUSEON, STATE_NORMAL}; // 定义按钮状态
CBitmap m_pBmp1, m_pBmp2;//Load两幅图片
CRect m_Rc; //保存按钮客户区
int m_State; // 按钮所处状态 为enum的两个值,代表鼠标在按钮上和正常情况下
BOOL m_IsTimerOn; // 定时器开否,用于判断鼠标跟按钮的相对位置
POINT m_CursorPos; // 鼠标位置
2.因为在动态创建自定义按钮的时候,要指定图片ID、及按钮坐标大小、消息值,所以重载CButton类的Create函数。
BOOL CMyBtn::Create(UINT IDBITMAPNOMAL, UINT IDBITMAPMOUSEON, UINT msg,
LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
// 重载Create,指定按钮所处两种状态应显示的图片,及单击时向父窗口传递的消息
{
// TODO: Add your specialized code here and/or call the base class
m_pBmp1.LoadBitmap(IDBITMAPNOMAL);
m_pBmp2.LoadBitmap(IDBITMAPMOUSEON);
// 变量初始化
m_IsTimerOn = FALSE;
m_State = STATE_NORMAL;
m_message = msg;
return CButton::Create(lpszCaption, dwStyle, rect, pParentWnd, nID);
}
3.要想重绘按钮要设定按钮类型为BS_OWNERDRAW,重载PreSubclassWindow函数
void CMyBtn::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
ModifyStyle(0, BS_OWNERDRAW|BS_PUSHBUTTON);
CButton::PreSubclassWindow();
}
4.然后对按钮进行重绘,重载DrawItem函数
void CMyBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
GetClientRect(&m_Rc); // 得到按钮窗口的有效矩形区域
CDC *pDc = CDC::FromHandle(lpDrawItemStruct->hDC); // 取得按钮控件客户区域的设备变量指针
CDC MemDc;
MemDc.CreateCompatibleDC(pDc);
CBitmap * pBmp = NULL;
if(STATE_NORMAL == m_State)
{
pBmp = MemDc.SelectObject(&m_pBmp1);
}
if(STATE_MOUSEON == m_State)
{
pBmp = MemDc.SelectObject(&m_pBmp2);
}
pDc->BitBlt(m_Rc.left, m_Rc.top, m_Rc.right, m_Rc.bottom, &MemDc, 0, 0, SRCCOPY);
pBmp = MemDc.SelectObject(pBmp);
}
5.判断鼠标是否在按钮区域内的方法是,如果鼠标在按钮区域移动,则设定一个计时器,对鼠标位置进行跟踪检测,如果在则设定m_State为STATE_MOUSEON,否则设为STATE_NORMAL。然后无效整个客户区进行重绘。
void CMyBtn::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(!m_IsTimerOn)
{
SetTimer(10000, 100, NULL);
m_IsTimerOn = TRUE;
}
CButton::OnMouseMove(nFlags, point);
}
void CMyBtn::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetWindowRect(&rect); // 得到按钮客户区域的屏幕坐标位置
GetCursorPos(&m_CursorPos); // 得到鼠标的屏幕坐标位置
if(rect.PtInRect(m_CursorPos)) // 如果鼠标在按钮的客户区内
{
if(STATE_MOUSEON != m_State)
{
m_State = STATE_MOUSEON;
Invalidate();
}
}
else // 鼠标离开按钮客户区
{
if(STATE_NORMAL != m_State)
{
m_State = STATE_NORMAL;
Invalidate();
}
KillTimer(nIDEvent);
m_IsTimerOn = FALSE;
}
CButton::OnTimer(nIDEvent);
}
6.响应单击操作,向父窗口传递m_message消息,其值在Create时由父窗口指定。
void CMyBtn::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
GetParent()->PostMessage(m_message);
CButton::OnLButtonUp(nFlags, point);
}
附:VC自定义消息响应的实现
第一步:定义消息。开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}
第三步:在类头文件的AFX_MSG块中说明消息处理函数:
class CMainFrame:public CMDIFrameWnd
{
...
// 一般消息映射函数
protected:
// {{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
如果用户需要一个整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。
发表评论
-
评论 (
2012-01-20 12:03 552评论 ( 2011年10月04日 初中英语教学予中考 ... -
安师大附中2012届高三第一
2012-01-20 12:03 744安师大附中2012届高三第 ... -
2012届高三语文每日一练
2012-01-20 12:03 11052012届高三语文每日一练 ... -
VB中实现系统托盘图标实例
2012-01-19 16:53 1085VB中实现系统托盘图标实例 2011年04月19日 新建 ... -
SubClassWindow,SubClassDlgItem
2012-01-19 16:53 778SubClassWindow,SubClassDlgItem ... -
钩子程序解释说明都要注意小心钩子哦
2012-01-19 16:53 380钩子程序解释说明都要 ... -
windows消息机制
2012-01-19 16:53 511windows消息机制 2011年04月21日 一 W ... -
Do it
2012-01-17 06:36 570Do it 2011年12月10日 网站开发工程师 申请 ... -
汽车英语词汇 (2012了 大家抓紧学习)
2012-01-17 06:36 668汽车英语词汇 (2012了 大家抓紧学习) 2012年0 ... -
win7电脑配置
2012-01-17 06:36 964win7电脑配置 2011年12月30日 ------- ... -
AS3 编程易犯盲点――绝对对您有帮助,新手们都来看看吧
2012-01-17 06:35 644AS3 编程易犯盲点――绝对对您有帮助,新手们都来看看吧 2 ... -
使用 WebBrowser 控件如何防止某些网页强行最大化
2012-01-16 05:18 681使用 WebBrowser 控件如何防止某些网页强行最大化 ... -
webbrowser模拟确定窗口对话框
2012-01-16 05:18 1221webbrowser模拟确定窗口对 ... -
使用Webbrowser的一点心得体会
2012-01-16 05:18 977使用Webbrowser的一点心得体会 2009年06月29 ... -
WebBrowser控件使用详解
2012-01-16 05:18 648WebBrowser控件使用详解 2010年09月29日 ... -
WebBrowser控件使用代理服务器(vb.net)
2012-01-16 05:18 1748WebBrowser控件使用代理服务器(vb.net) 20 ...
相关推荐
button按钮图片素材
一些精美的button按钮图片 还有类似于win7窗口的按钮图片
WPF按钮图片触发事件,image button,资源加载,样式可以自己更改,高清矢量按钮图集
本图片按钮控件实现了按图片效果显示按钮(支持透明),效果不错!
1.ExtJS自定义组件,图片按钮为例. 2.此图片按钮背景完全为图片,没有边框,需要使用者提供2张图片,一张初始化用,一张点击后用,可在'imgPaths:'属性里填写,格式为'01.jpg~02.jpg' 3.解压后请将所有附件放置您extjs...
Revit二次开发——Ribbon菜单的创建以及各种不同的button(按钮)的代码总结
在这个程序中,将实现两个按钮:普通按钮和图片按钮,当用户点击不同的按钮时,在其下方的文本框中显示点击的次数。 参考链接:http://blog.csdn.net/qq_36631076/article/details/78052252
简单的实现了图片按钮,美化界面的实用代码
images-开发使用的button图片,有用的button小图片
WPF自定义图片按钮[ImageButtonWPF] 更多资源: http://cleopard.download.csdn.net
下面通过多种方法给大家介绍微信小程序 button 的样式设置为图片,具体内容如下所示: 方法一:button 与 image 重叠 将button设为 opacity:0 然后定位放在那副图片的上边。 方法二:background-image background-...
安卓按钮图片,立体感特别强,美化你的android程序,高清gif按钮图标
Android-Material-circular-button图片切换和按钮联动效果, 添加按钮button可以根据ImageView获取当前显示的图片的颜色值来动态设置按钮颜色, 过渡效果非常好,
实现了ListView添加图片、按钮并添加了ListView跟Button 的双监听,Button实现的是Activity的跳转
为减少页面空间占用,将图片按钮放置在input输入框中,兼容火狐、谷歌和IE,图片自行替换
对于一个按钮,获取焦点 鼠标移动点击时分别显示不同的背景图片,可以任意设置按钮的字体颜色
Delphi按钮控件TButton源代码(包括PNG图片按钮)
一个form上面有一个按钮即一个图片显示框。 点击按钮后,实例化一个openFileDialog 类对象,然后打开用户选中的图片。 并且可以根据图片的大小调节button的长度以及窗口的大小
本文实例讲述了Android自定义Button并设置不同背景图片的方法。分享给大家供大家参考,具体如下: 1、自定义MyButton类 public class MyButton extends Button { //This constructormust be public MyButton...
在VB6中验证通过,支持图片\文字。 属性与COMMAND相同,仅支持CLICK事件。