MFC_基本知識

1.建立窗口的四大步驟(這是必須掌握的)  總體框架windows

  1.   設計窗口類
  2.   註冊窗口類
  3.   建立窗口
  4.   顯示窗口
#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);*/
相關文章
相關標籤/搜索