框架可能框住了我們自由思想,當然也可以通過研究框架而得到更多東西。不過,我學習mfc是因為特殊的原因而必須為之,所以講究的是開發速度了,不過如果
學習windows編程還是要從sdk做起比較好,不過體力活較多罷了。
不過很顯然,框架很方便。就從框架入手吧。我入門一般都是從高開始跳樓,這樣覺得速度可能會快點,個人的學習方法問題。
呵呵。這僅僅是筆記,給自己看的,高手繞行~
- mfc只是框架,它有WinMain函數,它藏在APPMODUL.CPP文件中,函數原型為
- extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)
- {
- return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
- }
- 有些函數之所以可以在WinMain之前執行,是因為有全局構造。
- 然后它還需要init。
- mfc在創建單文檔程序的時候會自動生成三個類,分別由CDialog,CFrameWnd,CWinApp,CDocument,CView派生出來。
- CFrameWnd類中負責菜單欄。
- CView中負責用戶部分。
- 其它略。
- 關于CView
- 在窗口發生重繪的時候會激發OnDraw()函數
- 增加成員變量可以直接在類右鍵Add Variable,比較方便
- 增加事件可以直接右鍵Add Windows Message Handle,詳細查看msdn就可以了
- 一些類與結構和函數..
- HDC : Handle to a device context (DC). >> MFC中有封裝了的CDC,使用后需要ReleaseDC()
- sdk中獲取hdc句柄為GetDC(m_hWnd)
- 代碼段
- sdk典型畫線
- hdc = ::GetDC(m_hWnd);
- MoveToEx(hdc,dw_Point.x,dw_Point.y,NULL);
- LineTo(hdc,point.x,point.y);
- ::ReleaseDC(m_hWnd,hdc);
- 封裝的CDC畫線
- CDC *pdc = GetDC();
- pdc->MoveTo(dw_Point);
- pdc->LineTo(point);
- ReleaseDC(pdc);
- mfc委托畫線,析構函數包含ReleaseDC
- CClientDC cdc(this);
- cdc.MoveTo(dw_Point);
- cdc.LineTo(point);
- 這個類似上面,但是比較無敵
- CWindowDC cdc(GetDesktopWindow()); //GetDesktopWindow()對于不同的DC可以獲取對此畫圖
- cdc.MoveTo(dw_Point);
- cdc.LineTo(point);
- 這個是有顏色的
- CPen pen(PS_DASH,1,RGB(255,0,0)); //創建畫筆
- CClientDC cdc(this);
- CPen *oldpen =
- cdc.SelectObject(&pen); //選擇這個畫筆對象
- cdc.MoveTo(dw_Point);
- cdc.LineTo(point);
- cdc.SelectObject(oldpen);//選回
- 從資源獲取位圖,再用繪圖畫出的矩形
- CBitmap bitmap;
- bitmap.LoadBitmap(IDB_BITMAP1);
- CBrush cbh(&bitmap);
- cdc.FillRect(CRect(dw_Point,point),&cbh);
- cdc.Rectangle(CRect(dw_Point,point));
- 定位光標
- SetCaretPos(point); //point定位光標
- 光標函數
- CClientDC cdc(this);
- TEXTMETRIC tmc; //定義TEXT公制結構體
- cdc.GetTextMetrics(&tmc); //導入到結構體
- CreateSolidCaret(tmc.tmAveCharWidth/8,tmc.tmHeight); //生成光標的函數
- ShowCaret();
- ondraw下
- void CMfc_DRAWView::OnDraw(CDC* pDC)//每次重繪時調用.. 已經有dc
- {
- CMfc_DRAWDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- CString str;//字符串
- str.LoadString(IDS_MYTEXT); //獲得字符串在資源
- pDC->TextOut(0,200,str); //0,200的地方寫入字符
- }
- 常規sdk直接api編程基礎
- #include <windows.h>
- #include <stdio.h>
- LRESULT CALLBACK Winpro( //回調函數
- HWND hwnd, // handle to window
- UINT uMsg, // message identifier
- WPARAM wParam, // first message parameter
- LPARAM lParam // second message parameter
- )
- {
- switch(uMsg) //消息循環
- {
- case WM_CHAR: //鍵盤按下事件
- char szchar[20];
- sprintf(szchar,"char is %d",wParam); //格式化字符
- MessageBox(hwnd,szchar,"mrzenix'first", 0); //彈出
- break;
- case WM_LBUTTONDOWN: //左鍵按下事件
- MessageBox(hwnd,"mouse click!","mrzenix'first",0);
- HDC hdc;
- hdc = GetDC(hwnd);
- TextOut(hdc,0,50,"mrzenix的第一個win程序!!",strlen("mrzenix的第一個win程序!!")); //輸出到hdc設備區域
- ::ReleaseDC(hwnd,hdc);//釋放dc
- break;
- case WM_PAINT: //重繪
- HDC hDC;
- PAINTSTRUCT ps;
- hDC = BeginPaint(hwnd,&ps); //返回dc
- TextOut(hDC,0,0,"MRZENIX",strlen("MRZENIX"));
- break;
- case WM_CLOSE: //關閉按鈕事件
- if(IDYES==MessageBox(hwnd,"Right?","Exit",MB_YESNO))
- {
- DestroyWindow(hwnd); //發送銷毀事件
- }
- break;
- case WM_DESTROY: //銷毀事件
- PostQuitMessage(0); //退出
- break;
- default:
- return DefWindowProc(hwnd,uMsg,wParam,lParam); //默認事件驅動
- }
- return 0;
- }
-
-
-
- int WINAPI WinMain(
- HINSTANCE hInstance, // handle to current instance
- HINSTANCE hPrevInstance, // handle to previous instance
- LPSTR lpCmdLine, // command line
- int nCmdShow // show state
- )
- {
- WNDCLASS wndcls; //窗口類
- wndcls.cbClsExtra = 0;
- wndcls.cbWndExtra = 0;
- wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
- wndcls.hCursor = LoadCursor(NULL,IDC_CROSS);
- wndcls.hIcon = LoadIcon(NULL,IDI_APPLICATION);
- wndcls.hInstance = hInstance;
- wndcls.lpfnWndProc = Winpro;
- wndcls.lpszClassName = "MRZENIX";
- wndcls.lpszMenuName = NULL;
- wndcls.style = CS_HREDRAW|CS_VREDRAW; //樣式
- RegisterClass(&wndcls); //注冊窗口
-
- HWND hwnd;
- hwnd= CreateWindow("MRZENIX","MRZENIX",WS_OVERLAPPEDWINDOW,
- 0,0,800,600,NULL,NULL,hInstance,NULL); //創建窗口然后返回句柄
- ::ShowWindow(hwnd,SW_SHOWNORMAL); //顯示
- ::UpdateWindow(hwnd); //...
-
- MSG msg; //定義消息結構
- while(GetMessage(&msg,NULL,0,0)) //捕獲消息
- {
- TranslateMessage(&msg); //翻譯消息
- DispatchMessage(&msg); //發出.
- }
- return 0;
-
- }
其實,MSDN是無敵的。以上只是典故,故有節外生枝的空間,所以,好好利用才是王道。