您的位置:首页 > 其它

MFC一个双缓冲的状态栏CStatusBarCtrl

2014-01-04 11:29 239 查看
现在,本人在开发的MFC项目,不知道那个为什么状态栏在不断的闪烁,把哥的钛合金狗眼给亮瞎了。。

百般找寻也找不到解决办法,于是一气之下把状态栏自绘了。

以下为自绘的状态栏,直接替换原来的,已在VS2012测试中没有问题。

#pragma once
#include "afxcmn.h"
class CNoFlashStatusBarCtrl :
public CStatusBarCtrl
{
public:
CNoFlashStatusBarCtrl(void);
virtual ~CNoFlashStatusBarCtrl(void);
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};

#include "stdafx.h"
#include "NoFlashStatusBarCtrl.h"

CNoFlashStatusBarCtrl::CNoFlashStatusBarCtrl(void)
{
}

CNoFlashStatusBarCtrl::~CNoFlashStatusBarCtrl(void)
{
}

BEGIN_MESSAGE_MAP(CNoFlashStatusBarCtrl, CStatusBarCtrl)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

void CNoFlashStatusBarCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
CDC dcMem;                                                                           //用于缓冲作图的内存DC
dcMem.CreateCompatibleDC(&dc);                                                       //依附窗口DC创建兼容内存DC
CRect rect;
GetClientRect(&rect);
CBitmap bitTemp;
dcMem.SetBkMode(TRANSPARENT);
bitTemp.CreateCompatibleBitmap( &dc, rect.Width(), rect.Height() );
dcMem.SelectObject(&bitTemp);
dcMem.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(241,237,236));             //设置绘图区域
CPen pen(PS_SOLID ,1,RGB(0x8e, 0x8e, 0x8e));                                          //以下开始重画状态栏
CPen *oldpen = dcMem.SelectObject(&pen);
dcMem.MoveTo(rect.left, rect.top);
dcMem.LineTo(rect.right, rect.top);
dcMem.SelectObject(oldpen);
int nPart = this ->GetParts(0,NULL);
for ( int i = 0; i < nPart; i++)
{
CRect rect;
this->GetRect(i,&rect);
CFont ft;
LOGFONT logft;
memset(&logft, 0, sizeof(LOGFONT));
CFont::FromHandle((HFONT )GetStockObject(DEFAULT_GUI_FONT))->GetLogFont(&logft);
lstrcpy(logft.lfFaceName, _T ("微软雅黑"));
ft.CreateFontIndirect(&logft);
CFont *of = dcMem.SelectObject(&ft);
rect.left += 10;
dcMem.DrawText(this->GetText(i),&rect, DT_VCENTER | DT_SINGLELINE);
dcMem.SelectObject(&of);
CPen pen(PS_SOLID ,1,RGB(0xD3,0xD3,0xD3));
CPen *oldpen = dcMem.SelectObject(&pen);
dcMem.MoveTo(rect.right, rect.top + 2);
dcMem.LineTo(rect.right, rect.bottom - 2);
dcMem.SelectObject(oldpen);

}
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0, SRCCOPY );                         //将内存的内容复制出来
bitTemp.DeleteObject();
dcMem.DeleteDC();
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CStatusBarCtrl::OnPaint()
}

BOOL CNoFlashStatusBarCtrl::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return true;             //屏蔽背景刷新
//return CStatusBarCtrl::OnEraseBkgnd(pDC);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息