框架可能框住了我們自由思想,當(dāng)然也可以通過研究框架而得到更多東西。不過,我學(xué)習(xí)mfc是因?yàn)樘厥獾脑蚨仨殲橹灾v究的是開發(fā)速度了,不過如果
學(xué)習(xí)windows編程還是要從sdk做起比較好,不過體力活較多罷了。
不過很顯然,框架很方便。就從框架入手吧。我入門一般都是從高開始跳樓,這樣覺得速度可能會(huì)快點(diǎn),個(gè)人的學(xué)習(xí)方法問題。
呵呵。這僅僅是筆記,給自己看的,高手繞行~
- mfc只是框架,它有WinMain函數(shù),它藏在APPMODUL.CPP文件中,函數(shù)原型為
- extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)
- {
- return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
- }
- 有些函數(shù)之所以可以在WinMain之前執(zhí)行,是因?yàn)橛腥謽?gòu)造。
- 然后它還需要init。
- mfc在創(chuàng)建單文檔程序的時(shí)候會(huì)自動(dòng)生成三個(gè)類,分別由CDialog,CFrameWnd,CWinApp,CDocument,CView派生出來。
- CFrameWnd類中負(fù)責(zé)菜單欄。
- CView中負(fù)責(zé)用戶部分。
- 其它略。
- 關(guān)于CView
- 在窗口發(fā)生重繪的時(shí)候會(huì)激發(fā)OnDraw()函數(shù)
- 增加成員變量可以直接在類右鍵Add Variable,比較方便
- 增加事件可以直接右鍵Add Windows Message Handle,詳細(xì)查看msdn就可以了
- 一些類與結(jié)構(gòu)和函數(shù)..
- 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委托畫線,析構(gòu)函數(shù)包含ReleaseDC
- CClientDC cdc(this);
- cdc.MoveTo(dw_Point);
- cdc.LineTo(point);
- 這個(gè)類似上面,但是比較無敵
- CWindowDC cdc(GetDesktopWindow()); //GetDesktopWindow()對(duì)于不同的DC可以獲取對(duì)此畫圖
- cdc.MoveTo(dw_Point);
- cdc.LineTo(point);
- 這個(gè)是有顏色的
- CPen pen(PS_DASH,1,RGB(255,0,0)); //創(chuàng)建畫筆
- CClientDC cdc(this);
- CPen *oldpen =
- cdc.SelectObject(&pen); //選擇這個(gè)畫筆對(duì)象
- 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));
- 定位光標(biāo)
- SetCaretPos(point); //point定位光標(biāo)
- 光標(biāo)函數(shù)
- CClientDC cdc(this);
- TEXTMETRIC tmc; //定義TEXT公制結(jié)構(gòu)體
- cdc.GetTextMetrics(&tmc); //導(dǎo)入到結(jié)構(gòu)體
- CreateSolidCaret(tmc.tmAveCharWidth/8,tmc.tmHeight); //生成光標(biāo)的函數(shù)
- ShowCaret();
- ondraw下
- void CMfc_DRAWView::OnDraw(CDC* pDC)//每次重繪時(shí)調(diào)用.. 已經(jīng)有dc
- {
- CMfc_DRAWDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- CString str;//字符串
- str.LoadString(IDS_MYTEXT); //獲得字符串在資源
- pDC->TextOut(0,200,str); //0,200的地方寫入字符
- }
- 常規(guī)sdk直接api編程基礎(chǔ)
- #include <windows.h>
- #include <stdio.h>
- LRESULT CALLBACK Winpro( //回調(diào)函數(shù)
- HWND hwnd, // handle to window
- UINT uMsg, // message identifier
- WPARAM wParam, // first message parameter
- LPARAM lParam // second message parameter
- )
- {
- switch(uMsg) //消息循環(huán)
- {
- 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的第一個(gè)win程序!!",strlen("mrzenix的第一個(gè)win程序!!")); //輸出到hdc設(shè)備區(qū)域
- ::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: //關(guān)閉按鈕事件
- if(IDYES==MessageBox(hwnd,"Right?","Exit",MB_YESNO))
- {
- DestroyWindow(hwnd); //發(fā)送銷毀事件
- }
- break;
- case WM_DESTROY: //銷毀事件
- PostQuitMessage(0); //退出
- break;
- default:
- return DefWindowProc(hwnd,uMsg,wParam,lParam); //默認(rèn)事件驅(qū)動(dòng)
- }
- 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); //注冊(cè)窗口
-
- HWND hwnd;
- hwnd= CreateWindow("MRZENIX","MRZENIX",WS_OVERLAPPEDWINDOW,
- 0,0,800,600,NULL,NULL,hInstance,NULL); //創(chuàng)建窗口然后返回句柄
- ::ShowWindow(hwnd,SW_SHOWNORMAL); //顯示
- ::UpdateWindow(hwnd); //...
-
- MSG msg; //定義消息結(jié)構(gòu)
- while(GetMessage(&msg,NULL,0,0)) //捕獲消息
- {
- TranslateMessage(&msg); //翻譯消息
- DispatchMessage(&msg); //發(fā)出.
- }
- return 0;
-
- }
其實(shí),MSDN是無敵的。以上只是典故,故有節(jié)外生枝的空間,所以,好好利用才是王道。