標籤:資料 callback
1 視窗註冊和建立1.1WIN32 視窗程序建立步驟
1、WinMain入口函數的定義
2、WindowProc函數的定義
3、註冊視窗類別
RegisterClass、RegisterClassEX
4、建立視窗
CreateWindow、CreateWindowEx
HWND CreateWindow(
LPCTSTRlpClassName,//指向登入的視窗類別的名稱的指標
LPCTSTRlpWindowName,//指向視窗名稱的指標
DWORDdwStyle,//視窗的風格
intx,//視窗位置的X座標
inty,//視窗位置的Y座標
intnWidth,//視窗的寬度
intnHeight,//視窗的高度
HWNDhWndParent,//父視窗的控制代碼
HMENUhMenu,//視窗菜單控制代碼
HINSTANCEhInstance,//應用程式使用控制代碼
LPVOIDlpParam//應用程式資料區控制代碼
);
參數:
lpClassName
一個指向以零結尾的字串的指標,或者指向以前由RegisterClass或RegisterClassEx條用建立的原子的指標。這個原子必須是次參數的低位,高位必須是0。如果是一個字串,它指定視窗類別的名稱。類名可以是用RegisterClass或RegisterClassEx註冊過的任何名稱,providedthat themodule that registers the class is also the module thatcreates the window.類名稱也可以是任何預定義的系統類別名稱。
lpWindowName
指向指定視窗名稱的以零結尾的字串的指標。如果視窗的風格指定了一個標題列,則它將會顯示在標題列上。當使用CreateWindow建立控制項時,此參數指定控制項的文字。當用SS_ICON風格建立static控制項時,此參數指定表徵圖的名稱或者標識符。要指定一個標識符,使用”#num”文法。
dwStyle
指定要建立視窗的風格。可以是視窗風格的組合,加上控制項的風格的組合。
x
指定視窗的初始水平位置。對於overlapped或者彈出式視窗,x參數是初始的x座標相當視窗的左上方,在螢幕座標繫上。Fora childwindow, x is the x-coordinate of the upper-left corner ofthe window relative tothe upper-left corner of the parent window‘sclientarea.如果參數值被設定為CW_USEDEFAULT,系統為視窗左上方選擇預設的位置並忽略y參數。CW_USEDEFAULT僅對overlapped視窗有效,如果它在快顯視窗或者自視窗上被指定,則x和y參數被設定為零。
y
指定視窗的初始化垂直位置。對於交疊式視窗或者彈出式視窗,y參數是在螢幕座標上初始的視窗左上方的y座標。對於子視窗,y是和父視窗客戶區左上方相關的初始子視窗左上方的y座標。對於listbox控制項,y是和父視窗客戶區左上方相關的listbox客戶區初始的左上方的y座標。如果用WS_VISIBLE風格建立一個overlapped視窗並且x參數設定為CW_USEDEFAULT,系統忽略y參數。
nWidth
用裝置單位指定視窗的寬度。對於overlapped視窗,nWidth參數既可以是在螢幕座標上視窗的寬度,也可以是CW_USEDEFAULT.如果nWidth是CW_USEDEFAULT,系統選擇一個預設的寬度和高度,這個預設的寬度從初始的x座標到螢幕的右邊緣,預設的高度從y座標到表徵圖區的頂端。CW_USEDEFAULT僅對overlapped視窗可用,如果對子視窗或者快顯視窗設定了CW_USEDEFAULT,則nWidth和nHeight被設定為0。
nHeight
指定視窗的高度用裝置單位。對於overlapped視窗,nHeight是在螢幕座標上視窗的高度。如果nWidth被設定為CW_USEDEFAULT,系統忽略nHeight。
hWndParent
指向被建立視窗的父視窗或者所有者視窗的控制代碼。要建立一個子視窗或者一個被所有的視窗,提供一個有效視窗控制代碼。這個參數對於彈出式視窗是可選的。
hMenu
菜單控制代碼,或者指定一個依靠視窗風格的子視窗標識符。對於overlapped視窗或者彈出式視窗,hMenu識別視窗要使用的菜單。可以是NULL如果使用類的菜單。對於子視窗,hMenu指定自視窗的標識符,一個用來通知父視窗對話方塊控制項的事件的整數。程式決定子視窗的標識,他對於相同父視窗的所有子視窗必須是唯一的。
hInstance
Windows95/98/Me: 和這個視窗有關係的模組的執行個體控制代碼。
WindowsNT/2000/XP: 此值被忽略。
lpParam
[in]Pointer to a value to be passed to the window through theCREATESTRUCT structurepassed in the lpParam parameter theWM_CREATE message. 如果一個程式通過調用CreateWindow建立多重文件介面的客戶視窗。lpParam必須指向一個CLIENTCREATESTRUCT結構。
5、視窗的顯示和重新整理
ShowWindow、 UpdateWindow
6、訊息處理
GetMessage、 DispatchMessage
7、視窗退出
WM_DESTROY、
1.2視窗的註冊1.2.1視窗類別的分類
1、 系統全域視窗類別,比如按鈕(BUTTOn),文本編輯框(EDITed)等
2、 應用程式的全域視窗類別。可以在一個應用程式中EXE、DLL等所有模組中使用的視窗類別。
3、 局部視窗類別。只能在本模組中使用的視窗類別。
1.2.2實現視窗類別的註冊
1、 系統全域的視窗類別,無需註冊直接使用
使用CreateWindow函數,在CLASSNAME中指定系統已經定義好的視窗類別型名稱即可。
下面建立一個BUtton或者EDIt視窗
/*File : botton.cpp *Auth : sjin *Date : 20140618 *Mail : [email protected] *//*視窗的建立的練習*/#include <Windows.h>#include <WinNT.h>HINSTANCE g_hInst = NULL; /*視窗處理函數*/LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM iParam){return DefWindowProc(hWnd,nMsg,wParam,iParam);}/*建立BUTTON*/HWND CreateButton(){/*BUTTOn */#if 0HWND hWnd = CreateWindow("BUTTON","My first button test",WS_OVERLAPPEDWINDOW,0,0,100,150,NULL,NULL,g_hInst,NULL);#elseHWND hWnd = CreateWindow("EDIT","My first button test",WS_OVERLAPPEDWINDOW,0,0,100,150,NULL,NULL,g_hInst,NULL);#endifreturn hWnd;}/*註冊*/BOOL RegisterWnd(LPSTR pszClassName){WNDCLASSEX hWnd = {‘\0‘};hWnd.cbSize = sizeof(hWnd);hWnd.style = CS_VREDRAW | CS_HREDRAW;hWnd.lpfnWndProc = WndProc;hWnd.cbClsExtra = 0;hWnd.cbWndExtra = 0;hWnd.hCursor = NULL;hWnd.hIcon = NULL;hWnd.hbrBackground = HBRUSH(COLOR_BTNFACE +1);hWnd.lpszClassName = pszClassName;hWnd.hInstance = g_hInst;ATOM nAtom = RegisterClassEx(&hWnd);if( 0 == nAtom) {return FALSE;}return TRUE;}/*顯示視窗*/void DisplayButton(HWND hwnd){ShowWindow(hwnd,SW_SHOW);UpdateWindow(hwnd);}void Message(){MSG msg = {0};while(GetMessage(&msg,NULL,0,0)){/*文字框可輸入*/TranslateMessage(&msg);DispatchMessage(&msg);}}/*入口函數*/int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR pszCmcLine,int nShowCmd){g_hInst = hInst;HWND hwnd = CreateButton();RegisterWnd("");DisplayButton(hwnd);Message();return 0;}
2、 應用程式全域視窗類別,需要用代碼實現註冊,在註冊時需要增加CS_CLOBALCLASS(各個模組中都能夠使用的)定義的實現方式:
WNDCLASS wc = {‘\0‘};
wc.style = CS_CLOBALCLASS |CS_HREARAW;
RegisterClass(&wc);
下面的例子基本都是一樣的
3、 局部視窗類別,不是增加CS_CLOBALCLASS定義
使用RegisterClass、RegisterClassEX來註冊
/*File : winreg.cpp *Auth : sjin *Date : 20140619 *Mail : [email protected] *//*視窗的建立的練習*/#include <Windows.h>#include <WinNT.h>HINSTANCE g_hInst = NULL; /*視窗處理函數*/LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM iParam){return DefWindowProc(hWnd,nMsg,wParam,iParam);}/*建立window*/HWND Createwindow(LPSTR pszClassName){HWND hWnd = CreateWindow(pszClassName,"My first wondow test",WS_OVERLAPPEDWINDOW,0,0,100,150,NULL,NULL,g_hInst,NULL);return hWnd;}/*註冊*/BOOL RegisterWnd(LPSTR pszClassName){WNDCLASSEX hWnd = {‘\0‘};hWnd.cbSize = sizeof(hWnd);hWnd.style = CS_VREDRAW | CS_HREDRAW;hWnd.lpfnWndProc = WndProc;hWnd.cbClsExtra = 0;hWnd.cbWndExtra = 0;hWnd.hCursor = NULL;hWnd.hIcon = NULL;hWnd.hbrBackground = HBRUSH(COLOR_BTNFACE +1);hWnd.lpszClassName = pszClassName;hWnd.hInstance = g_hInst;ATOM nAtom = RegisterClassEx(&hWnd);if( 0 == nAtom) {return FALSE;}return TRUE;}/*顯示視窗*/void DisplayWnd(HWND hwnd){ShowWindow(hwnd,SW_SHOW);UpdateWindow(hwnd);}void Message(){MSG msg = {0};while(GetMessage(&msg,NULL,0,0)){/*文字框可輸入*/TranslateMessage(&msg);DispatchMessage(&msg);}}/*入口函數*/int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR pszCmcLine,int nShowCmd){g_hInst = hInst;RegisterWnd("MYWIN");HWND hwnd = Createwindow("MYWIN");DisplayWnd(hwnd);Message();return 0;}