这次主要弄明白了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