zoukankan      html  css  js  c++  java
  • VS2010,MFC动态按钮和窗体背景图片,以及是静态文字控件透明,并避免静态文字刷新出现的重叠问题

    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(101,200,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(0,0,rect.Width(),rect.Height(),&memDC,0,0,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);
    //*********************************************************//

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

  • 相关阅读:
    IIS是如何处理ASP.NET请求的
    数据库访问性能优化
    通信交互总结
    数据库集群技术漫谈
    VS2010中出现无法嵌入互操作类型
    正则表达式-更新版
    IIS部署SSL证书后提示不可信的解决方案
    CSS水平居中和垂直居中解决方案
    jQuery get/post区别及contentType取值
    配置Tomcat使用https协议
  • 原文地址:https://www.cnblogs.com/fudong071234/p/5807164.html
Copyright © 2011-2022 走看看