Win32 Windows編程
1 Windows編程基礎
2 Windows文字的編碼
3 窗口程序
4 窗口消息
5 菜單和加速鍵
6 繪圖
7 對話框
8 基本控件
.....
一 Windows編程基礎
1 Win32應用程序的基本類型
1.1 控制檯程序
不需要完善的Windows窗口,可以使用DOS窗口
的方式顯示。
1.2 Win32窗口程序
包含窗口的程序。可以通過窗口與程序進行交互。
1.3 Win32庫程序
提供已有的代碼,供其他程序使用。
動態庫:DLL 是在執行的時候可以加載的程序。
靜態庫:LIB 是在編譯鏈接時使用的程序。
1.4 對比
1.4.1 程序的入口函數不同
控制檯:main
Win32窗口程序:WinMain
動態庫DLL:DllMain
靜態庫LIB:無
1.4.2 編譯鏈接後存在的形式不同
控制檯和Win32窗口程序:EXE文件,可以執行
動態庫DLL:DLL文件,無法執行
靜態庫LIB:LIB文件,無法執行
1.4.3 執行結果不同
控制檯:使用DOS窗口,自己沒有窗口。
Win32窗口程序:會產生自己的窗口,
可以將結果輸出或者從窗口接受輸入。
動態庫DLL:自己無法執行,提供可以執行
的代碼,當EXE等程序執行時,可以使用
這些代碼.執行時,該庫必須在指定的路徑.
靜態庫LIB: 自己無法執行,提供給程序在
編譯鏈接時使用,將庫中的代碼嵌入到
程序當中.執行時,不需要該庫存在.
二 Win32窗口程序和編譯環境
2.1 開發和編譯環境
VC1.5 - VC6.0(2008) - VC10.0(2010)
2.1.1 編譯器 CL.EXE
將源代碼編譯目標代碼. OBJ文件.
2.1.2 鏈接器 Link.EXE
將OBJ文件和庫函數鏈接.生成EXE.
2.1.3 資源編譯器 rc.exe
將資源腳本編譯成可以鏈接的文件(RES).
2.2 頭文件和庫
2.2.1 頭文件 windows.h包含了windows
常用的定義等.其他,還包含了一些其他的
頭文件:
windef.h - 定義了各種的數據類型
winbase.h- 定義了kernel的相關函數
wingdi.h - 定義了繪圖和文字
winuser.h- 窗口 控件等函數
winnt.h - 提供Unicode支持
2.2.2 庫
kernel32.lib - 提供進程/線程/內存等等
API函數支持
user32.lib - 包括窗戶/界面等等.
gdi32.lib - 提供繪圖/文字等。
2.3 Hello World程序
2.3.1 入口函數
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pszCmdLine, int nShowCmd )
hInstance - 應用程序的實例句柄
hPrevInstance - 該應用程序的前一個實例句柄
pszCmdLine - 命令行參數
nShowCmd - 窗口的顯示方式
2.3.2 MessageBox
2.4 編譯環境的準備
在VC98的BIN目錄下VCVARS32.BAT
2.5 編譯CL.EXE
CL的常用選項
/c 只編譯不鏈接
/TC 編譯C文件
/TP 編譯C++文件
如果不指定,CL會根據文件類型自動區分
/I 頭文件所在路徑
字符大小寫敏感
2.6 鏈接LINK.EXE
LINK常用選項:
/out:文件名,鏈接成指定文件名的程序
/LIBPATH:LIB文件存放的路徑, /LIBPATH:"E:\XXX"
/SUBSYSTEM: CONSOLE/WINDOW
字符大小寫不敏感
2.7 執行
正常執行或帶參數執行
三 第一個窗口程序
3.1 入口函數WinMain
3.2 窗口處理函數
當窗口處理消息事件時,系統調用該函數
LRESULT CALLBACK WindowProc( HWND hwnd, // 窗口的句柄 UINT uMsg, // 消息的ID號 WPARAM wParam, // 消息所對應的參數 LPARAM lParam // 消息所對應的參數 );
3.3 註冊窗口類型
typedef struct _WNDCLASS { UINT style; //窗口類的風格 WNDPROC lpfnWndProc; //窗口處理函數 int cbClsExtra; //窗口類附加數據大小 int cbWndExtra; //窗口附加數據大小 HANDLE hInstance; //當前應用程序的實例句柄 HICON hIcon; //窗口圖標 HCURSOR hCursor; //窗口的鼠標 HBRUSH hbrBackground; //窗口的背景畫刷 LPCTSTR lpszMenuName; //菜單 LPCTSTR lpszClassName; //類型名稱 } WNDCLASS;
註冊函數 RegisterClass
3.4 創建窗口
HWND CreateWindow( LPCTSTR lpClassName, //窗口類型名稱 LPCTSTR lpWindowName, //窗口名稱 DWORD dwStyle, //窗口類型 int x, //窗口的左上角X坐邊 int y, //窗口的左上角X坐邊 int nWidth, //窗口的寬度 int nHeight, //窗口的高度 HWND hWndParent, //父窗口句柄 HMENU hMenu, //窗口菜單句柄 HANDLE hInstance, //應用程序的實例句柄 LPVOID lpParam //創建的參數,一般爲NULL );
3.5 顯示窗口
ShowWindow 顯示窗口
BOOL ShowWindow( HWND hWnd, //顯示的窗口句柄 int nCmdShow //顯示的方式 );
UpdateWindow 刷新窗口
3.6 消息處理
GetMessage 獲取消息
DispatchMessage 派發消息
3.7 程序退出
窗口銷燬時,退出程序。在WndProc中實現。
WM_DESTROY: 當窗口銷燬時,會調用WndProc
傳遞給使用者。
PostQuitMessage:發送一個退出消息
View Code
#include <windows.h>
HINSTANCE g_hInst = NULL;
//2. 窗口處理函數
LRESULT CALLBACK WndProc(
HWND hWnd,
UINT nMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(nMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, nMsg, wParam, lParam);
}
//3. 註冊窗口類型
BOOL MyRegister(LPSTR pszClassName)
{
WNDCLASS wc = {0};
ATOM nAtom = 0;
wc.style = CS_VREDRAW|CS_HREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = g_hInst;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE);
wc.lpszMenuName = NULL;
wc.lpszClassName = pszClassName;
nAtom = RegisterClass(&wc);
if(0 == nAtom)
{
MessageBox(NULL, "Register Failed", "Error", MB_OK|MB_ICONWARNING);
}
else
{
MessageBox(NULL, "Register Succeeded", "Succeeded", MB_OK);
}
return TRUE;
}
//4. 窗口創建
HWND MyCreate(LPSTR pszClassName)
{
HWND hWnd = CreateWindow(pszClassName,
"Hello Windows",
WS_OVERLAPPEDWINDOW,
,
,
,
,
NULL,
NULL,
g_hInst,
NULL);
if(NULL == hWnd)
{
MessageBox(NULL, "CreateWnd Failed", "Error", MB_OK);
}
else
{
MessageBox(NULL, "CreateWnd Succeeded", "Succeeded", MB_OK);
}
return hWnd;
}
//5. 顯示窗口
void DisplayWnd(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
//6. 消息處理
void Message()
{
MSG msg = {0};
while(GetMessage(&msg, NULL, 0, 0))
{
DispatchMessage(&msg);
}
}
//1. 入口函數
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR pszCmdLine,
int nShowCmd)
{
HWND hWnd = NULL;
g_hInst = hInstance;
MyRegister("MyWnd");
hWnd = MyCreate("MyWnd");
DisplayWnd(hWnd);
Message();
return 0;
}
四 資源的處理
4.1 資源和資源腳本
資源:ICON/CUSRUR/BITMAP/MENU......
資源腳本: 擴展名爲rc文件。
4.2 編譯資源
使用rc.exe編譯資源,生成RES文件
4.3 鏈接資源
使用link.exe將RES文件鏈接到程序當中
4.4 ICON的使用
LoadIcon從指定程序中加載ICON資源。
五 NMAKE和Makefile
1 NMAKE - 命令解釋器
Makefile - 腳本語言定義的文件