1. 程式人生 > >《Visual c++從初學到精通》讀書筆記(2)

《Visual c++從初學到精通》讀書筆記(2)

第二部分----從程式碼例子的角度來分析mfc架構及windows程式設計

1、windows api程式設計

<span style="font-size:14px;"><strong>#include <windows.h>
#include <stdio.h>
LRESULT  CALLBACK  WinExample1Proc(		//對視窗過程函式進行宣告
  HWND hwnd,
  UINT uMsg, 
  WPARAM wParam, 
  LPARAM lParam 
);
int WINAPI WinMain(						//Win32應用程式的入口函式
  HINSTANCE hInstance, 
  HINSTANCE hPrevInstance, 
  LPSTR lpCmdLine, 
  int nCmdShow )
{
	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_ERROR);
	wndcls.hInstance=hInstance;
	wndcls.lpfnWndProc=WinExample1Proc;
	wndcls.lpszClassName="example1";
	wndcls.lpszMenuName=NULL;
	wndcls.style=CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&wndcls);					//註冊視窗類
	HWND hwnd; 							//建立視窗,並定義一個視窗控制代碼來唯一標識該視窗
	hwnd=CreateWindow("example1","一個Windows應用程式的視窗",WS_OVERLAPPEDWINDOW,
		0,0,500,500,NULL,NULL,hInstance,NULL);
	ShowWindow(hwnd,SW_SHOWNORMAL); 	//顯示和更新視窗
	UpdateWindow(hwnd);
	MSG msg;							//定義訊息結構體並進行訊息迴圈
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
LRESULT CALLBACK WinExample1Proc(		//編寫視窗過程函式,實現訊息處理;
  HWND hwnd,      
  UINT uMsg,      
  WPARAM wParam,  
  LPARAM lParam   
)
{
	char exChar2[]={"第一個Windows應用程式"};
	switch(uMsg)
	{
	case WM_CHAR:
		char exChar1[40];
		sprintf(exChar1,"鍵盤輸入字元的ASCII值為: %d",wParam);
		MessageBox(hwnd,exChar1,"char",0);
		break;
	case WM_RBUTTONDOWN:
		MessageBox(hwnd,"右鍵被按下","message",0);
		break;
	case WM_CLOSE:
		if(IDYES==MessageBox(hwnd,"要結束嗎?","提示:",MB_YESNO))
		{
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_PAINT:	
		HDC hDC;
		PAINTSTRUCT ps;
		hDC=BeginPaint(hwnd,&ps);
	    RECT rt;
		GetClientRect(hwnd,&rt); 
		DrawText(hDC,exChar2,strlen(exChar2),&rt,DT_CENTER);
		EndPaint(hwnd,&ps);
		break;
	default:
		return DefWindowProc(hwnd,uMsg,wParam,lParam);
	}
	return 0;
}
</strong></span>

可以參考該書章節,可以發現各個API函式的含義,以及形參與實現的含義,最後實現的效果如下圖:


沒什麼多說的,根據API寫函式就可以。
其中值得注意的是它的實現機理,特別是訊息處理機制:




2、MFC程式設計






孫鑫:


前面是將具體1個MFC程式先是怎麼從哪個地方開始執行的,在進入main之前先處理了什麼,下面講進入winmain之後,winmian是怎樣執行的


可以看到與winmain形參一樣



孫鑫:接下來應該是:


這樣winmain函式就完了,接下來是設計視窗類和註冊視窗類了:

孫鑫:











那麼至此,一個空白的MFC的函式執行過程分析就是這樣的。其中裡面有很多類的相互呼叫等。

上述整個流程中,還沒有講解:

1、MFC文件結構檢視的各個類之間的關係、

2、訊息對映機制是怎樣

3、我們自己在這個框架中應該怎樣加自己的程式碼。下面第3部分講解上述3個問題

3、新增一個button










熟悉了上面的winmain中的分析,再新增這麼一個button不難。裡面的軟體截圖是因為自己之前沒有用過vs2010的這些功能。

4、訊息機制:



通過軟體增加新類,會在幾個位置(視訊中3個位置)增加新的程式碼,可以增加訊息相應函式











整個流程其實比較簡單吧,就是一個對照關係,跟前面寫的api的程式一樣,路由到作業系統後再是怎麼處理的就不知道了

總結:

本意是想學習vs2010開發環境,由於主要是針對mfc設計的,加之之前瞭解過,並學習了c++想了解下,並且有些如dll的概念等等。通過這2天的學習,算是入了門吧,對vc程式設計打了個基礎。但是具體的各個部分就不是很清楚了,沒有深入。

另外後面可以學學linux程式設計,vc程式設計一到os就不能深入剖了。vc目前主要還是學習mfc框架。但是linux開源,可以自己選擇各種開源的框架,並能剖os原始碼。

自己應用程式程式設計,沒怎麼真正實踐過,這幾天的mfc學習算是對其的一個理解吧。

                                                                                                                                                                       3-15

                                                                                                                                                               lijiuyang於hust