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);
//*********************************************************//

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

原文地址:https://www.cnblogs.com/fudong071234/p/5807164.html