5739|10

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

自绘的位图按钮,焦点切换时,位图更新,按钮会闪烁,该怎么解决? [复制链接]

自绘的位图按钮,焦点切换时,位图更新,按钮会闪烁,该怎么解决?

自己拦截了DRAWITEM消息,在DRAWITEM函数里面根据情况换图,但按钮用的位图很大时,就会闪烁.

最新回复

不懂 看上去好高深 期待能早日弄懂  详情 回复 发表于 2008-11-4 10:42
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
可以试一下
SetRedraw(FALSE)

//绘图


SetRedraw(TRUE)


,
,

*****************************
深圳友坚恒天科技最新推出UT-S3C2440开发板,仅售700元RMB
史上做工最精致、性价比最高的2440开发板
详尽的文档、丰富的实验例程,ARM软、硬件开发入门最佳选择!
详情请登录:www.urbetter.com
联系电话:0755-26423815  符先生
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
使用DC的内存缓冲技术
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

4
 
用MFC?
OnDraw 重新填充,先在内存里画,在一次填充到系统给的DC
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
void CBitmapBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
        // TODO: Add your code to draw the specified item
        UINT uStyle = DFCS_BUTTONPUSH;

  // This code only works with buttons.
  ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);


/*// If drawing selected, add the pushed style to DrawFrameControl.
  if (lpDrawItemStruct->itemState & ODS_SELECTED)
    uStyle |= DFCS_PUSHED;

  // Draw the button frame.
  ::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem,
    DFC_BUTTON, uStyle);
*/
  // Get the button's text.
  CString strText=L"";
//  TCHAR strbuf[100];
  GetWindowText(strText);
//  GetDlgItemText(GetDlgCtrlID(),strbuf,100);

  // Draw the button text using the text color red.


//2007--9--13  xqh  按钮要显示就会进这个函数,通过向串口输出这条消息,可以进行追踪!
//RETAILMSG(1,(TEXT("++++CCCC::Entrying CBitmapBtn::DrawItem(  )----the control ID is %d \r\n"),lpDrawItemStruct->CtlID));


        BITMAP bm;
       
        HDC hdc;
        HDC hdc1;
        HBITMAP hbmp;
        COLORREF crOldColor;
        crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, mTextColor);



        if (lpDrawItemStruct->itemState  & ODS_DISABLED)
        {
                hbmp=thbmpdis[hindex];
                crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, crTextBk);
        }
        else if (lpDrawItemStruct->itemState  & ODS_SELECTED)
        {
                if(lpDrawItemStruct->itemAction & ODA_SELECT)
                {
       
                        hbmp=thbmpsel[hindex];
                }
        //        hbmp=hbmpsel;
        }
        else if (lpDrawItemStruct->itemState  & ODS_FOCUS)
        {
                hbmp=thbmpfoucs[hindex];
        }
        else
        {
                ::PostMessage(GetParent()->m_hWnd,WM_KILLFOCUS,(WPARAM)lpDrawItemStruct->hwndItem,0);
                hbmp=thbmpup[hindex];
        }

//===========================================
        if((lpDrawItemStruct->itemAction & ODA_FOCUS) && (lpDrawItemStruct->itemState  & ODS_FOCUS))
        {
                hbmp=thbmpfoucs[hindex];
        }

        if (hbmp==NULL)
        {
                hbmp=thbmpup[hindex];
        }




        GetObject(hbmp,sizeof(BITMAP),&bm);
                hdc=CreateCompatibleDC(NULL);
                SelectObject(hdc,hbmp);
               
               
                hdc1=::GetDC(GetParent()->m_hWnd);

//2007--9--12  xqh  指到控件的窗体,这样坐标也就以前的能够对上了,
//这样坐标问题也解决了

        BitBlt(lpDrawItemStruct->hDC,0,0,bm.bmWidth,bm.bmHeight,hdc,
                        0,0,SRCCOPY);

               
                DeleteObject(hdc);
                DeleteObject(hdc1);
               
                SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
                ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
                        &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
                ::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
               
}


这样处理还是不行,我已经用了双缓冲,小按钮没这个现象,大按钮很明显的.
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
xqhrs232 :你的代码并不是二级缓存代码。
二级缓存:根据实际DC,创建两个不同的兼容DC1,DC2,将所有要画的object选到DC1中并画到DC2中,最后从兼容DC2画到实际DC当中去。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
因为我的这个不需要再画什么,就一张位图,一张已知的位图,所以不需要DC2,有DC1就OK了,直接贴过去就OK了。我这个应该是双缓冲技术了。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

8
 
Invalidate()窗体时,使用FALSE,不要用默认的,因为默认的是TRUE。
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

9
 
我只是几个按钮间的焦点切换,某一时刻只有一个按钮被选中(处于得到焦点的状态),我通过ENABLEWINDOW( )函数来做,这个函数触发DRAWITEM消息,然后在DRAWITEM函数里面做处理.
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

10
 
我在PC上面这样做就没有问题啊!在网上看到PC因为运行速度更快,所以看不出来,有没遇到这个问题的人啊?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
不懂 看上去好高深 期待能早日弄懂
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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