走進windows編程的世界-----視窗的註冊及建立

來源:互聯網
上載者:User

標籤:資料   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;}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.