MFC下双缓冲解决高速绘制刷新闪烁问题+多媒体定时器

       这次主要弄明白了mfc设备上的双缓冲解决方案,基本上解决了闪烁的问题

       再加上上次mfc的onTimer定时器在毫秒级的程度上完全不够准确,因此改成能精确到1ms的多媒体定时器

话不多说,上代码:

// TimeGeneratorDlg.h : 头文件
//

#pragma once
#include "DigitalClock.h"
#include "TimeDlg2.h"
#include <MMSystem.h>

// CTimeGeneratorDlg 对话框
class CTimeGeneratorDlg : public CDialogEx
{
private:
	double sTime,eTime,time;
	bool m_isFirstFrame;
	int m_timeNum[9];
	int m_initTime[4];
	int m_hour,m_minute,m_second,m_mSecond;
	CRect m_timeRectAll;//最外接总的矩形框 在画板上的空间位置
	CRect m_timeRectWH;//双缓冲用的内存设备位图矩形框 主要表示一个时间矩形框的长宽
	int m_marginX,m_marginY,m_patternGap,m_paddingX,m_paddingY,m_markEdge,m_patternEdge;
	CRect m_timeRect[4];//四个时间矩形框 在画板上的空间位置

	UINT m_iTimerId;
	CEdit *showTimer1,*showTimer2;
	int m_index,m_digNum;
	CTimeDlg2 dlg2;
	//CDialogEx dlg2;

// 构造
public:
	CTimeGeneratorDlg(CWnd* pParent = NULL);	// 标准构造函数
	~CTimeGeneratorDlg();
// 对话框数据
	enum { IDD = IDD_TIMEGENERATOR_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持

	DigitalClock m_DigClock;//2012.9.19
	CRect m_rect;//2012.9.19

// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnSize(UINT nType,int cx, int cy);//2012.9.19

	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnStnClickedStatic1();

private:
	void TimeShow();
	void TimeCalculate();
	static void CALLBACK CatchTime(UINT wTimeID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dwb);
	void MarkDraw();
public:
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);//重载屏蔽了这个函数,不进行背景重绘
};


以下是实现:



// TimeGeneratorDlg.cpp : 实现文件
//


#include "stdafx.h"
#include "TimeGenerator.h"
#include "TimeGeneratorDlg.h"
#include "afxdialogex.h"


#pragma comment(lib,"WinMM.lib")


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CTimeGeneratorDlg 对话框


CTimeGeneratorDlg::~CTimeGeneratorDlg()
{
       timeKillEvent(m_iTimerId);//析构掉这个定时器
       timeEndPeriod(1);//析构的时候把多媒体定时器时间最高定时精度恢复到1ms

}


BEGIN_MESSAGE_MAP(CTimeGeneratorDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()//确定函数入口
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()//2012.9.19
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()




// CTimeGeneratorDlg 消息处理程序


BOOL CTimeGeneratorDlg::OnInitDialog()
{
       CDialogEx::OnInitDialog();
       ShowWindow(SW_SHOW);
       //ShowWindo

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值