應用程序框架:
同一類型應用程序的結構大致相同,並有很多相同的源代碼,
因此可以通過一個應用程序框架AFX(Application FrameWorks)
編寫同一類型應用程序的通用源代碼。
主要向導:
Datebase Project:創建數據庫項目
MFC ActiveX Control Wizard:創建基於MFC的ActiveX控件
MFC AppWizard[dll]:創建基於MFC的動態鏈接庫
MFC AppWizard[exe]:創建基於MFC的應用程序(最常用)
New Database Wizard:在SQL服務器上創建一個SQL Server數據庫
Win32 Application:創建Win32應用程序,可不使用MFC,采用SDK方法編程
Win32 Console Application:創建DOS下的Win32控制台應用程序,
采用C++或C語言進行編程
Win32 Dynamic-link Library:創建Win32動態鏈接庫,采用SDK方法
Win32 Static Library:創建Win32靜態鏈接庫,采用SDK方法
引入應用程序向導的目的:為了避免程序員重復編寫代碼。
區別於DOS程序,即使一個簡單的Windows程序:
它也必須顯示一個程序運行窗口,需要編寫復雜的程序代碼。
而同一類型應用程序的框架窗口風格是相同的,如相同的菜單欄、工具欄、
狀態欄和用戶區。
基本菜單命令的功能也是一樣的,如相同的文件操作和編輯命令。
編寫一個實現具體功能的MFC應用程序的步驟:
★根據應用程序特性在MFC AppWizard[exe]應用程序向導各步驟對話框中進行選擇,
創建一個應用程序的框架。
★利用資源編輯器為程序編輯或添加資源,如編輯菜單、添加對話框等。
★利用ClassWizard類向導或手工添加類、成員變量和成員函數的聲明。
★根據需要編寫具體的函數代碼。
★編譯、鏈接程序。如果程序有語法錯誤,需要修改源程序。直到沒有編譯、鏈接錯誤,
才能得到可執行程序。
★測試應用程序各項功能,如果程序沒有實現程序設計所要求的功能,啟動Debug調試器
進行調試,找出並修改程序設計中的邏輯錯誤。
我們可以為Visual C++ MFC編程作一個形象的總結:
◇MFC應用程序框架使我們的程序設計工作猶如做填充題。
◇Developer Studio中的集成工具使我們的程序設計工作猶如做選擇題,
程序員猶如軟件集成裝配車間里的技術工人。
Visual C++中通用的文件類型
后綴 類型 說明
dsw 工作區文件 將項目的詳細情況組合到工作區中
dsp 項目文件 存儲項目的詳細情況並替代mak文件
h C++頭文件 存儲類的定義代碼
cpp C++源文件 存儲類的成員函數的實現代碼
rc 資源腳本文件 存儲菜單、工具欄和對話框等資源
rc2 資源文件 用來將資源包含到項目中
ico 圖標文件 存儲應用程序圖標
bmp 位圖文件 存儲位圖
clw 類向導文件 存儲ClassWizard類向導使用的類信息
MFC中資源標識符前綴
標識符前綴 說明
IDR_ 主菜單、工具欄、應用程序圖
標和快捷鍵表
IDD_ 對話框
IDC_ 控件和光標
IDS_ 字符串
IDP_ 提示信息對話框的字符串
ID_ 菜單命令項
應用程序舉例:
例1:創建應用程序框架。
本例的目的在於說明創建Windows應用程序的方法及過程
1 //包含應用程序所需的數據類型和數據結構的定義 2 #include <windows.h> 3 4 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口函數說明 5 6 //----------------------以下初始化窗口類------------------------- 7 int WINAPI WinMain 8 ( 9 HINSTANCE hInstance, 10 HINSTANCE hPrevInst, 11 LPSTR lpszCmdLine, 12 int nCmdShow 13 ) 14 { 15 HWND hw 16 nd; 17 MSG Msg; 18 WNDCLASS wndclass; 19 char lpszClassName[] = "窗口"; //窗口類名 20 char lpszTitle[] = "My_windows"; //窗口標題名 21 22 //------------------窗口類的定義--------------------------- 23 wndclass.style=0; //窗口類型為缺省類型 24 wndclass.lpfnWndProc=WndProc; //定義窗口處理函數 25 wndclass.cbClsExtra=0; //窗口類無擴展 26 wndclass.cbWndExtra=0; //窗口實例無擴展 27 wndclass.hInstance=hInstance; //當前實例句柄 28 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); 29 //窗口的最小化圖標為缺省圖標 30 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ; 31 //窗口采用箭頭光標 32 wndclass.hbrBackground=GetStockObject(WHITE_BRUSH); 33 //窗口背景為白色 34 wndclass.lpszMenuName=NULL; //窗口中無菜單 35 wndclass.lpszClassName=lpszClassName ; //窗口類名為"窗口" 36 37 //------------------以下進行窗口類的注冊------------ 38 if(!RegisterClass(&wndclass))//如果注冊失敗則發出警告 39 { 40 MessgaeBeep(0); 41 return FALSE; 42 } 43 //--------------------創建窗口------------------------- 44 hwnd = CreateWindow 45 ( 46 lpszClassName, //窗口類名 47 lpszTitle, //窗口實例的標題名 48 WS_OVERLAPPEDWINDOW, //窗口的風格 49 CW_USEDEFAULT, 50 CW_USEDEFAULT, //窗口左上角坐標為缺省值 51 CW_USEDEFAULT, 52 CW_USEDEFAULT, //窗口的高和寬為缺省值 53 NULL, //此窗口無父窗口 54 NULL, //此窗口無主菜單 55 hInstance, //創建此窗口的應用程序的當前句柄 56 NULL //不使用該值 57 58 ); 59 //------------------------顯示窗口----------------------- 60 ShowWindow(hwnd,nCmdShow); 61 62 //------------------------繪制用戶區--------------------- 63 UpdateWindow(hwnd); 64 //------------------------消息循環----------------------- 65 while(GetMessage(&Msg,NULL,0,0)) 66 { 67 TranslateMessage(&Msg); 68 DispatchMessage(&Msg); 69 } 70 71 //消息循環結束即程序終止時將消息返回操作系統 72 return Msg.wParam; 73 } 74 75 //---------------------------------窗口函數-------------------- 76 LRESULT CALLBACK WndProc 77 ( HWND hwnd, 78 UINT message, 79 WPARAM wParam, 80 LPARAM lParam 81 ) 82 83 { 84 switch(message) 85 { 86 case WM_DESTROY: 87 PostQuitMessage(0);//調用PostQuitMessage發出VM_QUIT消息 88 default: //缺省時采用系統消息缺省處理函數 89 return DefWindowProc(hwnd,message,wParam,lParam); 90 } 91 return(0); 92 }