No MFC,Only API (轉)
No MFC,Only :namespace prefix = o ns = "urn:schemas--com::office" />
在DOS中,養成了喜歡把所有東西都搞清楚的習慣,轉化到程式設計仍喜歡把事情的方方面面都弄清楚,起初選擇了VC6,但由於MFC的聲勢浩大,讓我認為Windows程式設計就是MFC程式設計,學習了一段時間後,發現MFC並不是初學者的好工具,因為MFC是建立在類的基礎上的,運用類的性質隱藏了許多東西,讓初學者搞不清從何處開始,怎樣傳遞訊息,怎樣過程。但同時不可否認,如果你是C++高手,清楚瞭解OO思想,那麼使用MFC開發工程一定會使你的工作顯著提高。如果你的情況不是這樣,就不要試圖開始使用MFC,它會把你搞得糊里糊塗,工作沒有進展。
拋開MFC,一樣能寫出優秀的應用程式——使用API。
許多人不願意直接使用API,他們認為API太低階,數量龐大,不易掌握。但據我的學習所得API雖然龐大,但不是大的不可學。經過一定的練習,使用API一樣能使你的工作很出色。
以下講解從使用最基本的API建立簡單的WIN32程式開始,如果你有興趣那麼就跟緊我。
範例1:建立一個“HELLO WORLD”視窗程式
因為是第一次接觸使用WIN32 API程式設計,所以需要介紹一下如何開始你的程式,以及怎樣你的Visual C++環境。
首先,新建一個工程,選擇Win32 Application選項,這是開始WIN32 API的必要開端,然後,輸入工程名進入下一步,在這一步只要選擇A simple Win32 Application就好。下面到了編碼階段,需要配置你的工程,開啟Project選單,settings選項,選中Link標籤,看你在程式中include的頭的相應 .lib是否被列進來,如果沒有就把它新增進來,這樣就確保了不會出現LINK錯誤。
開始工程時,由於選擇了“A simple Win32 Application”選項,工程的基礎檔案已經建立好,可以直接向WinMain中填寫程式碼,源程式提供如下:
#define WIN32_LEAN_AND_MEAN //說明這不是一個MFC程式
#include "stdafx.h" //包含相應標頭檔案
//申明此為由Windows呼叫的處理視窗的過程
LRESULT CALLBACK MainProc(HWND,UINT,WPARAM,LPARAM);
//定義應用程式名及類名
char szAppName[]="Begin";
int APIENTRY WinMain(HINSTANCE hInstance, //應用程式控制程式碼
HINSTANCE hPrevInstance,
LPSTR lpCmdLine, //命令列引數
int nCmdShow) //視窗顯示方式
{
MSG msg; //訊息變數
HWND hWnd; //主視窗控制程式碼
WNDCLASSEX wc;
//WNDCLASSEX 結構初始化
wc.cbClsExtra =0;
wc.cbSize =sizeof(WNDCLASSEX);
wc.cbWndExtra =0;
wc.hbrBackground =(HBRUSH)GetStock(WHITE_BRUSH);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wc.hIconSm =0;
wc.hInstance =hInstance;
wc.lpfnWndProc =(WNDPROC)MainProc;
wc.lpszClassName =szAppName;
wc.lpszMenuName =NULL;
wc.style =CS_HREDRAW | CS_VREDRAW |
CS_LCLKS | CS_OWNDC;
//註冊視窗類
RegisterClassEx(&wc);
//建立主視窗
hWnd=CreateWindowEx(0,szAppName,szAppName,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
//顯示主視窗
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
//進入事件迴圈
while(GetMessage(&msg,NULL,0,0))
{//翻譯並分發訊息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//程式結束時返回給Windows以下值
return msg.wParam;
}
//該函式由Windows呼叫,用來處理訊息
LRESULT CALLBACK MainProc(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
HDC hdc;//在視窗客戶區繪製任何,都要使用該控制程式碼(handle device context)
PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE://視窗被建立時,傳送此訊息
return 0;
case WM_PAINT://視窗恢復被遮蓋區域,移動,改變大小等出現無效區時傳送此訊息
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,0,0,"HELLO WORLD",11);
EndPaint(hWnd,&ps);
return 0;
case WM_CLOSE://選擇了關閉視窗的動作
PostQuitMessage(0);
return 0;
}
//用預設函式處理訊息
return DefWindowProc(hWnd,message,wParam,lParam);
}
基於視窗的Win32 API程式的結構就是這樣,至於選單,工具欄,狀態列,工具欄提示等等視窗,我會在後面一一道來。
範例2:基於對話方塊的“HELLO WORLD”程式
對話方塊及其控制元件的建立有兩種方法:一,在資源編輯器中建立;二,由程式執行時動態產生;第一種方法很簡單,所有工作在 Visual 環境下的程式設計師,都對這一點稱奇,它改變了傳統設計介面的方法,只要用滑鼠控制就能做出令人稱讚的介面。我要介紹一下第二鍾方法,源程式如下:
#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include "re.h" //包含定義控制元件識別符號的標頭檔案
//處理對話方塊訊息的函式
BOOL WINAPI MainDlg(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hIns; //全域性應用程式控制程式碼,方便各程式訪問
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
hIns=hInstance;
//建立對話方塊
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG),
NULL,(DLGPROC)MainDlg);
//進入訊息迴圈
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//對話方塊訊息處理函式
BOOL WINAPI MainDlg(HWND hDlg,UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
//初始化對話方塊
CreateWindow("STATIC","HELLO WORLD",WS_CHILD | WS_VISIBLE,
160,100,200,50,hDlg,NULL,hIns,NULL);
return TRUE;
case WM_COMMAND:
switch(LO(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog(hDlg,0); //結束對話方塊
PostQuitMessage(0);
break;
}
return TRUE;
}
return FALSE;
}
資原始檔中有以下內容
IDD_DIALOG DIALOG DISCARDABLE 0, 0, 188, 98
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 10, "System"
BEGIN
DEFPUSHBUTTON "OK",IDOK,25,80,40,9
PUSHBUTTON "Cancel",IDCANCEL,65,80,40,9
END
對話方塊中控制元件的動態建立就是用函式CreateWindow來實現的,以後還會看到其他控制元件的建立和使用。
當對話方塊函式處理了某一訊息後應返回TRUE,反之,返回FALSE。
這一講內容講述了簡單Win32程式設計框架,並無涉及太多艱難知識,如果你能接受並喜歡這種Windows程式設計方法,就請和我一起學習吧。
有任何意見,建議請 e:y_h_zhang@sohu.com.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004664/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- No MFC,Only API——選單的建立和使用 (轉)API
- 對MFC封裝Windows通訊API的研究 (轉)封裝WindowsAPI
- mfc程式流程 (轉)C程式
- 初學MFC(2) (轉)
- 初學MFC(1) (轉)
- Visual C++/MFC 指南(4):MFC 簡要指點 (轉)C++
- NO MFC - 使用 .log 除錯程式 (轉)除錯
- VC++/MFC 教程1(英文) (轉)C++
- VC++/MFC 教程2(英文) (轉)C++
- VC++/MFC 教程3(英文) (轉)C++
- VirtualBox Host-only Adapter,Failed to create the host-only adapter 轉APTAI
- C Runtime Library來歷, API, MFC, ATL關係API
- MFC技術內幕簡結 (轉)
- 簡述MFC程式生與死 (轉)C程式
- MFC下CSocket程式設計詳解(轉)程式設計
- MFC登入介面,跳轉到功能介面
- VC++/MFC 教程4&5(英文) (轉)C++
- VC++/MFC 教程6&7(英文) (轉)C++
- 用MFC構造DirectX應用框架 (轉)框架
- MFC架構下的DirectX8 (轉)架構
- MFC訊息響應機制分析 (轉)
- mfc中的訊息的應用 (轉)
- 005-blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]BloCORBIndexdeleteAPI
- MFC 捕獲按鈕 按下和抬起 (轉)
- MFC對COM介面編寫的支援分析 (轉)
- 使用MFC編寫internet查詢程式 (轉)
- Visual C++/MFC指南(1):幕後 (轉)C++
- mfc接收器實現深度歷險 (轉)
- 擴 展Visual c++ MFC 類 庫 (轉)C++
- MFC中OnDraw與OnPaint的區別 (轉載)AI
- 基於MFC文件/視/框架程式之利劍 (轉)框架
- MFC中使用者介面元素更新原理 (轉)
- MFC框架框架
- MFC打包
- Error: Invoke-customs are only supported starting with Android O (--min-api 26)ErrorAndroidAPI
- 《深入淺出MFC》讀書筆記(一,二) (轉)筆記
- 讀深入淺出MFC的一節筆記 (轉)筆記
- mfc版本及其對應vc版本一覽表 (轉)