1.建立窗口的四大步驟(這是必須掌握的) 總體框架windows
#include "windows.h"//包含頭文件 LoadCursor,TextOut 等函數 #include "stdio.h"//包含 sprintf,printf 等函數 LRESULT CALLBACK MyProc(...);//聲明回調函數 int WINAPI WinMain() { WNDCLASS wndcls;//設計窗口類 wndcls.hcursor=LoadCursor();//初始化 .... RegisterClass(&wndcls);//註冊窗口類 hwnd=CreateWindow(...);//建立窗口 ShowWindow(..);//顯示窗口 UpdateWindow(..); MSG msg;//定義消息結構體 while(GetMessage(...))//消息循環 { ... } return 0; } LRESULT CALLBACK MyProc(...)//實現回調函數 { switch(uMsg) { case WM_CHAR: break; ... } }
2.基本概念框架
變量的生命週期:能夠認爲出了包含它的大括號,這個變量的生命週期結束。因此全局變量的聲明位於全部大括號以外。可是用 new 聲明的變量和用 static 聲明的變量除外函數
野指針:將指針指向的變量的內存釋放後,此指針即變成野指針!如何避免野指針?答:將此指針指向 NULL 便可。p=NULL;this
#include <xxx.h>與#include "xxx.h"的區別:<>不查找運行時目錄,""查找運行時目錄!spa
3.如何防止類的重複定義?設計
用#inndef Point_H_H
#define Point_H_H
class Point{};
#endif 來防止指針
4.強制類型轉換注意事項code
強制類型轉換。 若是 CFish 從 CAnimal 派生而來。 則能夠將魚的對象轉換爲 CAnimal 的對
象,而反之則不行。從現實中理解也是正常的,魚能夠是動物,而動物卻不是魚。再如 int
能夠強制轉換成 char 型。而反之則出錯對象
5.在 main 或 WinMain 以前,全局變量已經被分配內存並初始化了。blog
6 MFC 大體流程
CTestApp theApp;//構造全局對象 WinMain() { AfxWinMain();//調用下面的函數 } AfxWinMain() { pThread->Initinstance();//初始化工做和註冊窗口類,窗口顯示和更新 pThread->Run();//消息循環 } 而在 BOOL CTestApp::InitInstance()中的代碼 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CTestDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CTestView)); AddDocTemplate(pDocTemplate); 完成了將這三個類關聯起來的工做
7.消息響應
消息響應會在 3 處修改代碼,1 處是在頭文件中,
1 2 //{{AFX_MSG(CDrawView) 3 afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 4 afx_msg void OnLButtonUp(UINT nFlags, CPoint point); 5 afx_msg void OnMouseMove(UINT nFlags, CPoint point); 6 //}}AFX_MSG 7 DECLARE_MESSAGE_MAP() 8 另外一處是 cpp 文件的 begin MessageMap 和 End MessageMap 之間, 9 BEGIN_MESSAGE_MAP(CDrawView, CView) 10 //{{AFX_MSG_MAP(CDrawView) 11 ON_WM_LBUTTONDOWN() 12 ON_WM_LBUTTONUP() 13 ON_WM_MOUSEMOVE() 14 //}}AFX_MSG_MAP 15 // Standard printing commands 16 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 17 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 18 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 19 END_MESSAGE_MAP() 20 最後是要有函數實現的代碼。 21 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 22 { 23 // TOD Add your message handler code here and/or call default 24 m_ptOrigin=m_ptOld=point; 25 m_bDraw=TRUE; 26 CView::OnLButtonDown(nFlags, point); 27 }
8.畫線
2 1)API 函數方法畫線用 HDC
3 2)用 CDC 類成員函數畫線。此時別忘記 ReleaseDC 4 3)用 CClientDC 5 4)用 CWindowDC,用它甚至能夠整個屏幕區域畫線。
1 畫線:定義一個成員變量保存 mouseDown 的點 m_Point 2 1)API 函數方法畫線用 HDC 3 2)用 CDC 類成員函數畫線。此時別忘記 ReleaseDC 4 3)用 CClientDC 5 4)用 CWindowDC,用它甚至能夠整個屏幕區域畫線。 6 下面是上面 4 種方法的代碼 7 /*HDC hdc; 8 hdc=::GetDC(m_hWnd); 9 MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); 10 LineTo(hdc,point.x,point.y); 11 ::ReleaseDC(m_hWnd,hdc);必須成對使用。*/ 12 /*CDC *pDC=GetDC(); 13 pDC->MoveTo(m_ptOrigin); 14 pDC->LineTo(point); 15 ReleaseDC(pDC);必須成對使用。*/ 16 //CClientDC dc(this); 17 /*CClientDC dc(GetParent()); 18 dc.MoveTo(m_ptOrigin); 19 dc.LineTo(point);此處不須要 ReleaseDC,由於 CClientDC 會自動釋放 DC*/ 20 //CWindowDC dc(this); 21 //CWindowDC dc(GetParent()); 22 /*CWindowDC dc(GetDesktopWindow());//此時能夠在整個屏幕上畫線。 23 dc.MoveTo(m_ptOrigin); 24 dc.LineTo(point);*/ 25 /*CPen pen(PS_DOT,1,RGB(0,255,0)); 26 CClientDC dc(this); 27 CPen *pOldPen=dc.SelectObject(&pen); 28 dc.MoveTo(m_ptOrigin); 29 dc.LineTo(point); 30 dc.SelectObject(pOldPen);*/