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);
};
百般找寻也找不到解决办法,于是一气之下把状态栏自绘了。
以下为自绘的状态栏,直接替换原来的,已在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); }
相关文章推荐
- 在mfc中,如何设置一个隐藏菜单栏,工具栏,状态栏,最大化、最小化、关闭按钮的窗体 分类: MFC
- 在mfc中,如何设置一个隐藏菜单栏,工具栏,状态栏,最大化、最小化、关闭按钮的窗体
- MFC在状态栏上面嵌一个组合框
- 在mfc中,设置一个隐藏菜单栏,工具栏,状态栏,最大化、最小化、关闭按钮的窗体
- 一个MFC问题(希望大侠指教)
- VC的一个屏保例子(MFC)
- 一个重绘MFC的文件传输客户端
- MFC中多个子菜单对应同一个消息响应函数
- 如何在MFC工程中加入一个封装好的类
- 使用mfc CWnd 自绘实现一个类似于QQ好友的一个控件
- MFC又踩了一个坑
- 特献上一个基于MFC的VP5的线程例子,大家一起来研究VP5吧
- MFC一个简单的计算器程序
- mfc获取一个进程并前端显示
- MFC 教程【13_MFC工具条和状态栏 】
- 初学MFC——【个人笔记】一个问题的个人感悟
- MFC框体添加菜单栏工具栏状态栏
- MFC学习之二:建立一个对话框程序
- MFC+WinPcap编写一个嗅探器之七(协议)
- MFC社区的一个帖子