1、动态按钮的四种动作

  1)正常

  2)按下

  3)滑过

  4)失效

在MFC中,4个动作对应着四种位图bmp,

首先,将代表四种状态的位图加载入资源中,将对应的按钮设置为BitmapButton

第二,在OnInitDialog()函数中添加如下两行代码

这里需要注意的是使用的按钮类型为 bitmapButton类型,也就是位图按钮。并且需要将此按钮的Owner Draw属性设置为true,如果不这样做是没有效果的。

//在不同的动作下 按钮显示不同的效果

//在不同的动作下 按钮显示不同的效果

    m_btnStart.LoadBitmaps(IDB_BITMAPUBT,IDB_BITMAPDOWNBT,IDB_BITMAPMOUSEBT,IDB_BITMAPWORKBT);   //载入  //注意的是这里要用BitmapButton
m_btnStart.SizeToContent(); //使按钮适应图片大小
SetTimer(,,NULL);//当鼠标滑动过后进行动态显示

m_btnStart.LoadBitmaps()

第一个参数为正常情况下的位图,IDB_BITMAPUBT为使用的位图的ID;

第二个参数为当鼠标进行点击时候的位图ID

第三个参数为当鼠标进行停留的时候使用的位图ID

第四个参数为当按钮进行锁定的时候的位图ID,这里按钮图片只能使用位图来进行也就是*.bmp格式的图片

在因为鼠标滑过需要进行焦点的选取,这时候使用定时器进行焦点选取即可,并对OnTimer()函数进行编辑,我这里选取的时间ID为101 ,时间为200毫秒就够了,所以如上面所示。

在OnTimer()添加如下代码:

            POINT p;                                                 //设置位置参数
GetCursorPos(&p); //获取位置参数
CWnd *hwnd; //得到位置的窗口信息
hwnd = WindowFromPoint(p);
CWnd *hwnd2 = GetDlgItem(IDC_BUTTON_START); //得到按钮的窗口信息
if(hwnd2==hwnd) //鼠标位置在按钮上
{
if(GetFocus()!=hwnd2) //焦点不在按钮上 设置焦点
hwnd2->SetFocus();
}
else //鼠标不在按钮上
{
if(GetFocus()==hwnd2)
GetDlgItem(IDC_BUTTON_CLEAR)->SetFocus(); //去焦点,这里的意思是将焦点移至别的地方,达到去焦点的目的。
}

在窗体进行消息处理的时候,也就是OnInitDialog()中,加入SetTimer(101,200,NULL),既可以出现滑动过按钮出现动态效果。

设置定时器的目的就是为了让焦点设置在按钮上,使得按钮进行相关的变色。

2、窗体设置背景图片

首先,加入位图到工程的资源里面,并设置好ID,这里因为是背景图,所以设置为:IDB_BITMAPBACKGROUND

第二:在OnPaint()响应事件中else后加入如下代码

        //*************设置窗体背景图片*******************//
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);//获取客户端的大小 CDC memDC;
CBitmap cBitmap;
CBitmap* pOldMemBmp = NULL;
cBitmap.LoadBitmap(IDB_BITMAPBACKGROUND); memDC.CreateCompatibleDC(&dc);
pOldMemBmp = memDC.SelectObject(&cBitmap); BITMAP bmp;
cBitmap.GetBitmap(&bmp); SetStretchBltMode(dc,STRETCH_HALFTONE);//据说能减少失真 dc.StretchBlt(,,rect.Width(),rect.Height(),&memDC,,,bmp.bmWidth,bmp.bmHeight,SRCCOPY); memDC.SelectObject(pOldMemBmp); CDialogEx::OnPaint();

3、由于设置了背景图片,静态文字控件会显示出背景颜色,因此需要将此背景颜色进行隐藏掉

在***Dlg.h中加入:

    //设置静态文本控件透明也就是文本透明
afx_msg HBRUSH OnCtlColor(CDC *pDc,CWnd *pWnd,UINT nCtrcolor);
CBrush m_brush;

在***Dlg.cpp中加入:、

1、消息响应函数

2、加入消息列表

  1:

HBRUSH CLoginDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
/*HBRUSH hbr = CLoginDemoDlg::OnCtlColor(pDC, pWnd, nCtlColor); if( nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT); //设置背景透明
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
return hbr; */
HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT); return (HBRUSH)::GetStockObject(NULL_BRUSH); //return hBrush = (HBRUSH)(m_brush.GetSafeHandle());
}
return hBrush;
}

  2:

ON_WM_CTLCOLOR()

4、由于静态文字进行刷新的过程中,隐藏了背景,导致了再刷新过程中会出现文字重叠的现象,解决方法如下:

  在你进行静态文字刷新的地方,加入以下两种代码的任意一种即可解决问题:

  1:

//以下两行代码是为了不让时间在显示的时候出现重叠问题,但是又带来了相应区域闪烁的问题,不过还好,不是很明显
GetDlgItem(IDC_Report)->ShowWindow(SW_HIDE);
       GetDlgItem(IDC_Report)->ShowWindow(_T("xxx");
       GetDlgItem(IDC_Report)->ShowWindow(SW_SHOW);

  2、

//**********************************************************//

            CRect rc;
GetDlgItem(IDC_Report)->GetWindowRect(&rc);
//转换为相对坐标
ScreenToClient(&rc);
//刷新指定区域,注意第2个参数为真,即刷新背景
InvalidateRect(&rc,TRUE);
//*********************************************************//

当然了效果是第二种稍微好点。

VS2010,MFC动态按钮和窗体背景图片,以及是静态文字控件透明,并避免静态文字刷新出现的重叠问题的更多相关文章

  1. java中的swing设计界面时怎么加上背景图片。而不覆盖其他控件?

    通过以下方式设置下背景就可以了: import java.awt.Container; import javax.swing.ImageIcon; import javax.swing.JFrame; ...

  2. VS2010 / MFC + OpenCV 2.4.1打开图片

    Windows 7 x64,VS2010 / MFC + OpenCV 2.4.1打开图片显示到Picture控件中. OpenCV 2.2.OpenCV 2.3同样适用. 工具/原料 WinXP / ...

  3. JAVA GUI学习 - 窗体背景图片设置方法:重写paintComponent(Graphics g)方法

    public class BackgroundImage extends JFrame { public BackgroundImage() { this.setTitle("窗体背景图片设 ...

  4. VS2010 MFC的按钮风格改变

    改变VS2010 MFC的按钮风格 VS2010建的MFC工程按钮默认的风格类似VC6.0(直角矩形),如想美观按钮改为WIN7的按钮风格(圆角矩形),只需在代码中找到头文件"stdafx. ...

  5. MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)

    惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...

  6. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  7. Android自定义控件:图形报表的实现(折线图、曲线图、动态曲线图)(View与SurfaceView分别实现图表控件)

    图形报表很常用,因为展示数据比较直观,常见的形式有很多,如:折线图.柱形图.饼图.雷达图.股票图.还有一些3D效果的图表等. Android中也有不少第三方图表库,但是很难兼容各种各样的需求. 如果第 ...

  8. [.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 & 大型控件的ImageField)

    [.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 & 大型控件的ImageField) http://www.dotblogs.c ...

  9. 安卓ImageView.src设置图片拉伸、填满控件的方法

    代码改变世界 安卓ImageView.src设置图片拉伸.填满控件的方法 需要给你的ImageView布局加上Android:adjustViewBounds="true"

随机推荐

  1. Docker 镜像上传到docker hub仓库

    1 先创建docker hub 帐号 ,并创建仓库 https://hub.docker.com/ 首先你需要一个docker hub 帐号,记住username,password,email .后面 ...

  2. 反射API(一)

    <?php function classData(ReflectionClass $class) { echo '<hr>'; $details = '当前文件:'; $detail ...

  3. 【洛谷p1319】压缩技术

    (许久不见,甚是想念) 压缩技术[传送门] 洛谷上滴算法标签: 然而这是一道入门难度的题.(不管不管,就写它了) 好的先说一下思路吧wait!我忘记了咋做的当时. 首先做题第一道坎儿,如何输入若干个( ...

  4. Spring AOP实现Mysql数据库主从切换(一主多从)

    设置数据库主从切换的原因:数据库中经常发生的是“读多写少”,这样读操作对数据库压力比较大,通过采用数据库集群方案, 一个数据库是主库,负责写:其他为从库,负责读,从而实现读写分离增大数据库的容错率.  ...

  5. 2018"百度之星"程序设计大赛 - 资格赛 A/B/E/F

    调查问卷  Accepts: 505  Submissions: 2436  Time Limit: 6500/6000 MS (Java/Others)  Memory Limit: 262144/ ...

  6. Leetcode 869. 重新排序得到 2 的幂

    869. 重新排序得到 2 的幂  显示英文描述 我的提交返回竞赛   用户通过次数102 用户尝试次数134 通过次数103 提交次数296 题目难度Medium 从正整数 N 开始,我们按任何顺序 ...

  7. Java序列化的作用和反序列化

    1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ...

  8. 【转】Entity Framework教程(第二版)

    源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...

  9. hosts.allow和hosts.deny支持哪些服务

    一.背景简介 在linux上多用iptables来限制ssh和telnet,编缉hosts.allow和hosts.deny感觉比较麻烦比较少用. aix没有iptables且和linux有诸多不同, ...

  10. stream.map示例

    引用1:https://blog.csdn.net/sanchan/article/details/70753645 引用2:https://www.ibm.com/developerworks/cn ...