初学mfc


本科の时に翔兄がそこでMFCをかじっているのを见て、感じは本当にとても厚くて、1册の本を読んで、どのくらい彼がどんな段阶的な成果をかじっているのを见ていないで、私はずっとMFCに抵抗する心理を抱いています.
結局今は仕方がありません.実験の準備部分で、デスクトップで画像時計を走ります.matlabを使うのは便利だが、効率が悪く、数十ミリ秒のフレームに加速できない.そこでボスが口を開いたので、C++でやりましょう...じゃあopenglで作ろう...学友はこれがmfcでとても简単だと言います....まあ、実は本当に簡単ですが、mfcを全く触ったことがない私にとって、やはり3日間振り回してやっただけです...途中でいろいろ遅延して時間を無駄にしましょう.
今こそ初めて技術を学び、すぐに応用しなければならないときの卵の痛みを本当に感じています.本当に他の人は数時間で済むので、調べながら書くのは長い間振り回されますが、どうにか記録しておけば、後で時間を無駄にすることはありません.mfcの基礎知識....まず1つ貼りますhttp://fl2012.blog.51cto.com/5207998/891572
そしてメインの2つのポイント、1つはタイマーを設定するので簡単です.もう一つは絵を描くことですが、実は簡単です!しかし、このような簡単な2つのものは私を2日以上振り回しました!!タイミングリフレッシュに点滅の問題があります.調べてみると、主にバックグラウンドの再描画の問題で、OnEraseBkgnd関数を再ロードし、そのままtrueに戻り、その後点滅の問題はありません~最初はダブルバッファの方法で解決しようと思っていました....しばらくやっても分からず、いっそやらないで、OnEraseBkgndを直接リロードするのが簡単です.そのビットマップのつづりもはっきりしていない.そうしましょう....
// TimeGeneratorDlg.h :    
//

#pragma once
#include "DigitalClock.h"

// CTimeGeneratorDlg    
class CTimeGeneratorDlg : public CDialogEx
{
private:
	double sTime,eTime,time;
	int m_timeNum[9];
	int m_hour,m_minute,m_second,m_mSecond;
	CRect m_timeRect;
//   
public:
	CTimeGeneratorDlg(CWnd* pParent = NULL);	//       

//      
	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 OnTimer(UINT nIDEvent);//2012.9.19     
	afx_msg void OnSize(UINT nType,int cx, int cy);//2012.9.19

	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnStnClickedStatic1();

private:
	void TimeShow();
public:
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);//         ,       
};
// TimeGeneratorDlg.cpp :     
//

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

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


//       “  ”     CAboutDlg    

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

//      
	enum { IDD = IDD_ABOUTBOX };

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

//   
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CTimeGeneratorDlg    




CTimeGeneratorDlg::CTimeGeneratorDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CTimeGeneratorDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);


	sTime = eTime = 0;
	m_hour = m_minute = m_second = m_mSecond = 0;
	m_timeRect.bottom = 350;
	m_timeRect.top = 240;
	m_timeRect.left = 40;
	m_timeRect.right = 700;
}

void CTimeGeneratorDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);

	//DDX_Control(pDX, IDC_STATIC1, m_DigClock);//2012.9.19
}

BEGIN_MESSAGE_MAP(CTimeGeneratorDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()//2012.9.19
	ON_WM_SIZE()//2012.9.19
	ON_WM_ERASEBKGND()
END_MESSAGE_MAP()


// CTimeGeneratorDlg       

BOOL CTimeGeneratorDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	ShowWindow(SW_MAXIMIZE);//     
	//  “  ...”           。

	// IDM_ABOUTBOX           。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	//          。              ,     
	//       
	SetIcon(m_hIcon, TRUE);			//      
	SetIcon(m_hIcon, FALSE);		//      

	// TODO:             
	//this-> ShowWindow(SW_SHOWMAXIMIZED);
	GetClientRect(&m_rect);
	SetTimer(1,30,NULL);//2012.9.19   30       
	return TRUE;  //           ,     TRUE
}

void CTimeGeneratorDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();//  about   
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

//              ,        
//        。      /      MFC     ,
//           。

void CTimeGeneratorDlg::OnPaint()
{



	if (IsIconic())
	{
		CPaintDC dc(this); //           

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		//             
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		//     
		dc.DrawIcon(x, y, m_hIcon);
		
	}
	else
	{
		TimeShow();
		CDialogEx::OnPaint();
	}
}

//                      
//  。
HCURSOR CTimeGeneratorDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


void CTimeGeneratorDlg::OnTimer(UINT nIDEvent)
{
	double timet;
	sTime = GetTickCount();
	timet = sTime - eTime;
	CTime time=CTime::GetCurrentTime();
	m_hour=time.GetHour();
	m_minute=time.GetMinute();
	m_second=time.GetSecond();
	CString nCSMSecond;
	
	struct _timeb timebuffer;
	_ftime(&timebuffer);
	nCSMSecond.Format("%d",timebuffer.millitm);
	m_mSecond = atoi(nCSMSecond);

	//m_DigClock.SetBkColor(RGB(255,0,0));
	//m_DigClock.SetTextColor(RGB(0,255,0));
	//m_DigClock.SetClock(nHour,nMinute,nSecond,nMSecond);

	{
		m_timeNum[0] = m_hour / 10;
		m_timeNum[1] = m_hour % 10;
		m_timeNum[2] = m_minute / 10;
		m_timeNum[3] = m_minute % 10;

		m_timeNum[4] = m_second / 10;
		m_timeNum[5] = m_second % 10;
		m_timeNum[6] = m_mSecond / 100;
		m_timeNum[7] = (m_mSecond-(m_timeNum[6]*100)) / 10;
		m_timeNum[8] = (m_mSecond % 100) % 10;
	}




	//Invalidate();
	CRect rc;
	rc.bottom = 350;
	rc.top = 240;
	rc.left = 40;
	rc.right = 700;
	InvalidateRect(rc);//
	OnPaint();
	eTime = GetTickCount();
	time = eTime-sTime;

	CDialogEx::OnTimer(nIDEvent);
}

void CTimeGeneratorDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);
	for(int i=1;i<=3;i++)
	{
		CWnd *pWnd;
		pWnd = GetDlgItem(i);//  ID i      ,  “  ”ID 1,“  ”ID 2
		if(pWnd)
		{
			CRect rect;
			pWnd->GetWindowRect(&rect);
			CRect r;
			pWnd->GetClientRect(&r);
			ScreenToClient(&rect);//                  
			
			pWnd->MoveWindow(rect);//      
		}
	}
	//GetClientRect(&m_rect);
}

void CTimeGeneratorDlg::TimeShow()
{

	CPaintDC dc(this);
	CDC *mdc = new CDC;
	CString num;
	mdc->CreateCompatibleDC(&dc);
	CBitmap bitmap[5],bitmapAll;
	CString imgPath;

	for(int i=0;i<5;i++)
	{
		num.Format("%d",m_timeNum[i+4]);//    
		imgPath = ("img\\bmp\\" + num + ".bmp");
		bitmap[i].m_hObject = (HBITMAP)::LoadImageA(NULL,imgPath,IMAGE_BITMAP,90,90,LR_LOADFROMFILE);
	}

	CRect rc;
	GetClientRect(&rc);
	dc.FillSolidRect(&rc,RGB(255,255,255));//        
	//mdc->FillSolidRect(&m_timeRect,RGB(255,255,255));

	int xGap = 90 + 40;
	int x=50,y=250;
	for(int i=0;i<5;i++)
	{
		mdc->SelectObject(bitmap[i]);
		dc.BitBlt(x+xGap*i,y,90,90,mdc,0,0,SRCCOPY);//  
	}


	bitmapAll.DeleteObject();
	delete mdc;
}



BOOL CTimeGeneratorDlg::OnEraseBkgnd(CDC* pDC)
{
	// TODO:              /      

	//return CDialogEx::OnEraseBkgnd(pDC);
	return true;//  true,         
}

実はデスクトップで走っている画像の時計です....勝手に直すことができる