6726|14

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC 下 CButtonST 类 失去焦点闪烁问题 [复制链接]

从网上 down 了一个 CBottonST 类测试的时候发现 ,按钮失去焦点的时候会闪一下?谁用过这个按钮?这个问题是怎么解决的呢?急!!!!!!!!!!!

最新回复

哈哈,你去问一下作者,估计你是codeproject下的,回复马上给你email的。  详情 回复 发表于 2009-3-14 09:35
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用的是CBITMAPBUTTON类?
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的问题太宽泛了。最好贴一下代码,不过这种问题比较常见,你看看你的ONPAINT被调了几次吧。肯定是有KILLFOCUS一系列的语句被调了。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
初始化

        m_MouseOnButton = FALSE;
       
        m_hIconIn = NULL;
        m_hIconOut = NULL;
       
        //默认不为平按钮
        m_bIsFlat = FALSE;
       
        //默认为平按钮绘画边框
        m_bDrawBorder = FALSE;
       
        // 默认水平绘画图标
        m_nAlign = 0;
       
        //默认显示按钮文本
        m_bShowText = FALSE;
       
        //默认对平按钮不成为焦点
        m_bDrawFlatFocus = FALSE;
        //默认为ICO按钮
        m_bBmpButton=FALSE;
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 
//重绘按钮
void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
        CDC* pDC = CDC::FromHandle(lpDIS->hDC);
       
        TRACE(L"DRAWITEM\r\n");
       


        CPen *pOldPen;
        BOOL bIsPressed  = (lpDIS->itemState & ODS_SELECTED);
        BOOL bIsFocused  = (lpDIS->itemState & ODS_FOCUS);
        BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
       
        CRect itemRect = lpDIS->rcItem;
       
        if ((m_bIsFlat == FALSE) && (m_bDrawBorder == TRUE))
        {
                if (bIsFocused)
                {
                        CBrush br(RGB(0,0,0));  
                        pDC->FrameRect(&itemRect, &br);
                        itemRect.DeflateRect(1, 1);
                }
                //准备绘画,用背景颜色填充背景区域
                COLORREF bgColor;
                if ((m_MouseOnButton == TRUE) || (bIsPressed))
                {
                        bgColor = GetActiveBgColor();
                }
                else
                {
                        bgColor = GetInactiveBgColor();
                }
               
                CBrush br(bgColor);
                pDC->FillRect(&itemRect, &br);
               
                //画按下的按钮
                if(bIsPressed)
                {
                        TRACE(L"PRESSED\r\n");
                        if (m_bIsFlat == TRUE)
                        {
                                if (m_bDrawBorder == TRUE)
                                {
                                        CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_HIGHLIGHT)); // Bianco
                                        CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Grigio scuro
                                       
                                        //话边框
                                        //深灰线
                                        pOldPen = pDC->SelectObject(&penBtnShadow);
                                        pDC->MoveTo(itemRect.left, itemRect.bottom-1);
                                        pDC->LineTo(itemRect.left, itemRect.top);
                                        pDC->LineTo(itemRect.right, itemRect.top);
                                        //白线
                                        pDC->SelectObject(penBtnHiLight);
                                        pDC->MoveTo(itemRect.left, itemRect.bottom-1);
                                        pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
                                        pDC->LineTo(itemRect.right-1, itemRect.top-1);
                                        //恢复画笔
                                        pDC->SelectObject(pOldPen);
                                }
                        }
                        else   
                        {
                                CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
                                pDC->FrameRect(&itemRect, &brBtnShadow);
                        }
                }
                else //画未按下的按钮
                {
                        CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_HIGHLIGHT)); //白
                        CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));       //浅灰
                        CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   //深灰
                        CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); //黑
                       
                        if (m_bIsFlat == TRUE)
                        {
                                if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE)
                                {
                                        //画边框
                                        //白线
                                        pOldPen = pDC->SelectObject(&penBtnHiLight);
                                        pDC->MoveTo(itemRect.left, itemRect.bottom-1);
                                        pDC->LineTo(itemRect.left, itemRect.top);
                                        pDC->LineTo(itemRect.right, itemRect.top);
                                        //深灰线
                                        pDC->SelectObject(penBtnShadow);
                                        pDC->MoveTo(itemRect.left, itemRect.bottom-1);
                                        pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
                                        pDC->LineTo(itemRect.right-1, itemRect.top-1);
                                        //恢复画笔
                                        pDC->SelectObject(pOldPen);
                                }
                        }
                        else
                        {
                                //白线
                                pOldPen = pDC->SelectObject(&penBtnHiLight);
                                pDC->MoveTo(itemRect.left, itemRect.bottom-1);
                                pDC->LineTo(itemRect.left, itemRect.top);
                                pDC->LineTo(itemRect.right, itemRect.top);
                                //浅灰线
                                pDC->SelectObject(pen3DLight);
                                pDC->MoveTo(itemRect.left+1, itemRect.bottom-1);
                                pDC->LineTo(itemRect.left+1, itemRect.top+1);
                                pDC->LineTo(itemRect.right, itemRect.top+1);
                                //黑线
                                pDC->SelectObject(pen3DDKShadow);
                                pDC->MoveTo(itemRect.left, itemRect.bottom-1);
                                pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
                                pDC->LineTo(itemRect.right-1, itemRect.top-1);
                                //深灰线
                                pDC->SelectObject(penBtnShadow);
                                pDC->MoveTo(itemRect.left+1, itemRect.bottom-2);
                                pDC->LineTo(itemRect.right-2, itemRect.bottom-2);
                                pDC->LineTo(itemRect.right-2, itemRect.top);
                                //恢复画笔
                                pDC->SelectObject(pOldPen);
                        }
                }
               
        }
        //读取按钮字符
        CString sTitle;
        GetWindowText(sTitle);
       
        //如果不想显示字符
        if (m_bShowText == FALSE)
        {
                sTitle.Empty();
        }
       
        CRect captionRect = lpDIS->rcItem;
       
        captionRect.top += captionRect.Height()/2-8;
       
        //画图标
        if (m_hIconIn != NULL || m_hBmpIn.m_hObject )
        {
                DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled);
        }

        //如果有的话,写上字符
        if (sTitle.IsEmpty() == FALSE)
        {
                if (bIsPressed)
                {
                        captionRect.OffsetRect(1,1);
                }
               
                if ((m_MouseOnButton == TRUE) || (bIsPressed))
                {
                        pDC->SetTextColor(GetActiveFgColor());
                        pDC->SetBkColor(GetActiveBgColor());
                }
                else
                {
                        pDC->SetTextColor(GetInactiveFgColor());
                        pDC->SetBkColor(GetInactiveBgColor());
                }
                //文本居中
                //CRect centerRect = captionRect;
                //pDC->DrawText(sTitle, sTitle.GetLength(), captionRect, NULL);//DT_SINGLELINE|DT_CALCRECT);
                //captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
                int startx,starty;
                startx=1;
                starty=1;
                if (bIsPressed)
                {
                        startx++;
                        starty++;
                }
                CRect drawRect;
                int nTextAlign=0;
                switch(m_nAlign)
                {
                default:
                case 0:
                        drawRect.left  =startx+m_IconSize.x+1;
                        drawRect.top   =starty+(m_ButtonSize.y-m_nFontHeight)/2;
                        drawRect.right =drawRect.left+m_ButtonSize.x-2;
                        drawRect.bottom=drawRect.top+(m_ButtonSize.y-2);
                        break;
                case 1:
                        drawRect.left  =startx+1;
                        drawRect.top   =starty+m_IconSize.y+1;
                        drawRect.right =m_ButtonSize.x-2;
                        drawRect.bottom=drawRect.top+(m_ButtonSize.y-m_IconSize.y-2);
                        nTextAlign=1;
                        break;
                }
                int nOld=pDC->SetBkMode(TRANSPARENT);
                pDC->DrawText(sTitle, sTitle.GetLength(), drawRect, nTextAlign);
                pDC->SetBkMode(nOld);
        }       
        if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE))
        {
               
                //画焦点边框
                if (bIsFocused && m_bDrawBorder)
                {
                        CRect focusRect = itemRect;
                        focusRect.DeflateRect(3, 3);
                        pDC->DrawFocusRect(&focusRect);
                }
               
        }
}


void CButtonST::DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled)
{
        CRect iconRect = rcItem;
       
        switch (m_nAlign)
        {
        default:
    case 0:
               
                if (title->IsEmpty())
                {
                        //图标水平居中
                        iconRect.left += ((iconRect.Width() - m_IconSize.x)/2);
                }
                else
                {
                        iconRect.left += 3;  
                        captionRect->left += m_IconSize.x+ 3;
                }
                //图标竖直居中
                iconRect.top += ((iconRect.Height() - m_IconSize.y)/2);
                break;
    case 1:
                //图标水平居中
                iconRect.left += ((iconRect.Width() - m_IconSize.x)/2);
                if (title->IsEmpty())
                {
                        //图标竖直居中
                        iconRect.top += ((iconRect.Height() - m_IconSize.y)/2);           
                }
                else
                {
                        captionRect->top += m_IconSize.y;
                }
                break;
        }
   
        //如果按钮按下,图标也要按下
        if (IsPressed)
        {
                iconRect.OffsetRect(1,1);
        }
        //Ole
        if(!m_bBmpButton)
        {
                pDC->DrawIcon(iconRect.TopLeft().x,
                        iconRect.TopLeft().y,
                        (m_MouseOnButton == TRUE || IsPressed) ? m_hIconIn : m_hIconOut);
                AfxMessageBox(L"test");
        }
        else
        {

       
                CDC* pMemDC = new CDC;
                pMemDC -> CreateCompatibleDC(pDC);
                int startx,starty;
                startx=2;
                starty=2;
                if (IsPressed)
                {
                        startx++;
                        starty++;
                }
                //保存旧对象
                CBitmap * pOldBitmap;
                if(m_MouseOnButton == TRUE || IsPressed||IsDisabled)
                        pOldBitmap = pMemDC -> SelectObject(&m_hBmpIn);
                else
                        pOldBitmap = pMemDC -> SelectObject(&m_hBmpOut);

                CString strText;
                GetWindowText(strText);
                if(m_bShowText&&!strText.IsEmpty())
                {
                        switch(m_nAlign)
                        {
                        default:
                        case 0:
                                pDC->BitBlt(startx,starty,m_ButtonSize.x,m_ButtonSize.y,pMemDC,0,0,SRCCOPY);
                                break;
                        case 1:
                                pDC->BitBlt(startx+(m_ButtonSize.x-m_IconSize.x)/2,starty+1,m_ButtonSize.x,m_ButtonSize.y,pMemDC,0,0,SRCCOPY);
                                break;
                        }
                }
                else
                        pDC->BitBlt(starty,starty,m_ButtonSize.x,m_ButtonSize.y,pMemDC,0,0,SRCCOPY);
                pMemDC -> SelectObject(pOldBitmap);
                delete pMemDC;
        }

}
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
这是我在程序中调用的代码:       
m_bmpButton1.SetBitmapButton(IDB_BITMAP2,IDB_BITMAP2,L"",0);
        m_bmpButton2.SetBitmapButton(IDB_BITMAP2,IDB_BITMAP2,L"",0);

加载的时候没什么问题,就是按钮失去焦点的时候会闪一下!很明显。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
推荐不使用CCeButtonST

可以用CBitmapButton,或者自定义一个自己适用的类。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
在点击后马上设置成非焦点状态.这样就不是很明显.

其实CCeButtonST类不好用,占用内存大,刷新速度慢.

最好自绘.
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
在点击后马上设置成非焦点状态.这样就不是很明显.

其实CCeButtonST类不好用,占用内存大,刷新速度慢.

最好自绘.
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
看看擦除背景的消息,直接返回TRUE,不要处理它。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
借空间用一下,我在使用CBitmapButton 时候出了一点问题,大家给分析一下。
CBitmapButton m_BTN_F1;

        m_BTN_F1.AutoLoad(IDC_BTN_F1,this);
        m_BTN_F1.LoadBitmaps(IDB_SDCZ_F1UP, IDB_SDCZ_F1DOWN, IDB_SDCZ_F1UP,IDB_SDCZ_F1DOWN);
        m_BTN_F1.SizeToContent();

我想在程序中根据其它条件动态改变按钮图片。
实现方法:
        //f1
        if(CCSeries::auchByte[113] == 2)
        {

           //m_BTN_F1.AutoLoad(IDC_BTN_F1,this);
           m_BTN_F1.LoadBitmaps(IDB_SDCZ_F1DOWN, IDB_SDCZ_F1UP,IDB_SDCZ_F1DOWN, IDB_SDCZ_F1UP);
           m_BTN_F1.SizeToContent();

        }
        else
        {

           //m_BTN_F1.AutoLoad(IDC_BTN_F1,this);
           m_BTN_F1.LoadBitmaps(IDB_SDCZ_F1UP, IDB_SDCZ_F1DOWN, IDB_SDCZ_F1UP,IDB_SDCZ_F1DOWN);
           m_BTN_F1.SizeToContent();

        }
发现有的图片可以实现这个功能。有的图片却不可以。这是怎么回事呢?想了好长时间都没想明白!请高手指教。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
CBitmapButton,我在ce上用感觉也会闪烁。

后来就自己写个类似CButton的类,全部用贴图方式去做。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 
友情up
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
友情up
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
哈哈,你去问一下作者,估计你是codeproject下的,回复马上给你email的。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表