1. 程式人生 > >走進windows程式設計的世界-----視窗的註冊及建立

走進windows程式設計的世界-----視窗的註冊及建立

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

一個指向以零結尾的字串的指標,或者指向以前由RegisterClassRegisterClassEx條用建立的原子的指標。這個原子必須是次引數的低位,高位必須是0。如果是一個字串,它指定視窗類的名稱。類名可以是用RegisterClassRegisterClassEx註冊過的任何名稱,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視窗有效,如果它在彈出視窗或者自視窗上被指定,則xy引數被設定為零。

y

指定視窗的初始化垂直位置。對於交疊式視窗或者彈出式視窗,y引數是在螢幕座標上初始的視窗左上角的y座標。對於子視窗,y是和父視窗客戶區左上角相關的初始子視窗左上角的y座標。對於listbox控制元件,y是和父視窗客戶區左上角相關的listbox客戶區初始的左上角的y座標。如果用WS_VISIBLE風格建立一個overlapped視窗並且x引數設定為CW_USEDEFAULT,系統忽略y引數。

nWidth

用裝置單位指定視窗的寬度。對於overlapped視窗,nWidth引數既可以是在螢幕座標上視窗的寬度,也可以是CW_USEDEFAULT.如果nWidthCW_USEDEFAULT,系統選擇一個預設的寬度和高度,這個預設的寬度從初始的x座標到螢幕的右邊緣,預設的高度從y座標到圖示區的頂端。CW_USEDEFAULT僅對overlapped視窗可用,如果對子視窗或者彈出視窗設定了CW_USEDEFAULT,則nWidthnHeight被設定為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 0
	HWND hWnd = CreateWindow(
		"BUTTON","My first button test",
		WS_OVERLAPPEDWINDOW,0,0,100,150,
		NULL,NULL,g_hInst,NULL);
#else
	HWND hWnd = CreateWindow(
		"EDIT","My first button test",
		WS_OVERLAPPEDWINDOW,0,0,100,150,
		NULL,NULL,g_hInst,NULL);
#endif
	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 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;
}

注:上面程式中存在一個問題,就是程式關閉後,並沒有完全退出,還在後臺執行,問了解決這個問題,需要在視窗處理函式做以下的修改:

/*視窗處理函式*/
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM iParam)
{
	switch(nMsg){
	case WM_DESTROY:
		/*增加這個程式可以正常的退出*/
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hWnd,nMsg,wParam,iParam);
}

1.1.1視窗類風格

CS_HREDRAW 視窗水平變化,重新繪製視窗。

CS_VREDRAW 視窗垂直變化,重新繪製視窗。

CS_DBCLICK 視窗可以接收滑鼠雙擊訊息

CS_GLOBALCLASS 建立應用程式全域性視窗類。

CS_BYTEALIGNWINDOW 視窗對齊方式,以8的倍數對齊

CS_BYTEALIGNCLIENT 視窗客戶區對齊方式,以8的倍數對齊

 CS_CLASSDC 所有這種型別的視窗使用同一個DC(裝置描述表,繪圖使用)

 CS_OWNDC 每個視窗擁有自己的DC

CS_PARENTDC 使用父視窗的DC

            CS_SAVEBITS是用點陣圖儲存視窗介面,可以提高視窗介面的重新整理效能CS_NOCLOSE 禁止關閉命令

1.1.2視窗類的附加資料 cbClsExtra

在視窗類的資料資訊中可以新增自己的資訊

cbClsExtra 用於新增資訊的記憶體的大小。

SetClassLong 將資訊儲存到記憶體中

GetClassLong 將資訊從記憶體中取出

1.1.3視窗附加資料cbWndExtra

在視窗的資料資訊中可以新增自己的資訊

cbWndExtra 用於新增資訊的記憶體的大小。

SetWindowLong 將資訊儲存到記憶體中

GetWindowLong 將資訊從記憶體中取出

下面程式碼示例:

/*File : winreg.cpp
 *Auth : sjin
 *Date : 20140619
 *Mail : [email protected]
 */

/*視窗的建立的練習*/

#include <Windows.h>
#include <WinNT.h>
#include <stdio.h>

HINSTANCE g_hInst = NULL; 

/*視窗處理函式*/
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM iParam)
{
	switch(nMsg){
	case WM_DESTROY:
		/*增加這個程式可以正常的退出*/
		PostQuitMessage(0);
		break;
	}
	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);
	/*
     * 
     *CS_HREDRAW 視窗水平變化,重新繪製視窗。
     *CS_VREDRAW 視窗垂直變化,重新繪製視窗。
     *CS_DBCLICK 視窗可以接收滑鼠雙擊訊息
     *CS_GLOBALCLASS 建立應用程式全域性視窗類。
     *CS_BYTEALIGNWINDOW 視窗對齊方式,以8的倍數對齊
     *CS_BYTEALIGNCLIENT 視窗客戶區對齊方式,以8的倍數對齊
     *CS_CLASSDC 所有這種型別的視窗使用同一個DC(裝置描述表,繪圖使用)
	 *CS_OWNDC 每個視窗擁有自己的DC
     *CS_PARENTDC 使用父視窗的DC
     *CS_SAVEBITS 是用點陣圖儲存視窗介面,可以提高視窗介面的重新整理效能
     *CS_NOCLOSE 禁止關閉命令.
	 */
	hWnd.style  = CS_VREDRAW | CS_HREDRAW;
	hWnd.lpfnWndProc = WndProc;
	hWnd.cbClsExtra = 100;
	hWnd.cbWndExtra = 100;
	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);
	}
}

/*設定附加資料*/
void SetExtra(HWND hWnd)
{
	SetClassLong(hWnd,1,100);
	SetWindowLong(hWnd,1,200);
}

/*獲取附加資料*/
void GetExtra(HWND hWnd)
{
	DWORD nClass = GetClassLong(hWnd,1);
	DWORD nWnd =  GetWindowLong(hWnd,1);

	char szText[256]= {0};
	sprintf(szText,"CLS:%d WND:%d",nClass,nWnd);
	MessageBox(NULL,szText,"EXTRA",MB_OK);
}
/*入口函式*/
int WINAPI WinMain(HINSTANCE hInst,
				HINSTANCE  hPrevInst,
				LPSTR  pszCmcLine,
				int nShowCmd)
{
	g_hInst = hInst;

	RegisterWnd("MYWIN");

	HWND hwnd = Createwindow("MYWIN");
	HWND hwnd2 = Createwindow("MYWIN");
	SetExtra(hwnd);
	GetExtra(hwnd);
	GetExtra(hwnd2);
	
	DisplayWnd(hwnd);

	Message();
	return 0;
}


1.1建立視窗

1.1.1視窗建立函式

CreateWindow/CreateWindowEx

      HWND CreateWindowEx(

                  DWORD dwExStyle,//視窗的擴充套件樣式

                  LPCTSTR lpClassName,  // pointer to registered class name

                  LPCTSTR lpWindowName, //pointer to window name

                  DWORD dwStyle,        // window style

                  int x,                // horizontal position ofwindow

                  int y,                // vertical position of window

                  int nWidth,           // window width

                  int nHeight,          // window height

                  HWND hWndParent,      // handle to parent or owner window

                  HMENU hMenu,          // handle to menu, or child-windowidentifier

                  HINSTANCE hInstance,  // handle to application instance

                  LPVOID lpParam );     // pointer to window-creation data

1.1.2視窗的風格及擴充套件風格

 視窗風格: WS_XXXX定義的風格,是視窗的基本風格.

 擴充套件風格:WS_EX_XXXXX 定義的風格,是視窗的擴充套件風格.比如: ToolWindow視窗等等。

 在CreateWindow可以使用基本視窗風格,擴充套件的視窗風格,需要使用CreateWindowEx設定.    
 WS_OVERLAPPED視窗,層疊式視窗
   WS_POPUP視窗,彈出式視窗
   WS_CHILD視窗,子視窗

1.1.3子視窗和父視窗

CreateWindow時,指定父視窗

將視窗的風格增加WS_CHILD      

可以使用SetParent和GetParent函式設定和獲取指定視窗的父視窗.

其他: MoveWindow 移動視窗

下面是關於父子視窗的示例

/* File : createWindow.cpp
 * Auth : sjin
 * Date : 20140623
 * Mail : [email protected]
 */

#include <Windows.h>
#include <stdio.h>

HINSTANCE g_hInst = NULL;

/*父視窗處理函式*/
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);
}

/*子視窗處理函式*/
LRESULT CALLBACK ChildProc(HWND hWnd, UINT nMsg, 
                         WPARAM wParam, LPARAM lParam)
{
    return DefWindowProc(hWnd, nMsg, wParam, lParam);
}

/*註冊視窗*/
BOOL RegisterWnd(LPSTR pszClassName,WNDPROC proc,int nBrush)
{
    WNDCLASSEX wce = {0};
    wce.cbSize = sizeof(wce);
    wce.style = CS_VREDRAW|CS_HREDRAW;
    wce.lpfnWndProc = proc;
    wce.cbClsExtra = 100;
    wce.cbWndExtra = 100;
    wce.hCursor = NULL;
    wce.hIcon = NULL;
    wce.hbrBackground = HBRUSH(nBrush);
    wce.lpszClassName = pszClassName;
    wce.lpszMenuName = NULL;
    wce.hInstance = g_hInst;
    ATOM nAtom = RegisterClassEx(&wce);
    if(0 == nAtom)
    {
        MessageBox(NULL, "registerError", "Error", MB_OK);
        return FALSE;
    }
    return TRUE;
}

/*建立視窗*/
HWND CreateWnd(LPSTR pszClassName,HWND hParent,DWORD dwStyle)
{
	HWND hWnd = CreateWindowEx(
		0,                    /*視窗擴充套件風格*/
		//WS_EX_TOOLWINDOW,   /*沒有擴大和隱藏按鈕*/
		//WS_EX_CLIENTEDGE | WS_EX_CONTEXTHELP,
		//WS_EX_PALETTEWINDOW,/**/
		pszClassName,
        "My Wnd",
		dwStyle, 
		CW_USEDEFAULT, 
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
        hParent, NULL, g_hInst, NULL);

    return hWnd;
}

/*顯示視窗*/
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 hPrevInt,
                   LPSTR lpCmdLine,
                   int nShowCmd)
{
    g_hInst = hInst;

	/*註冊父視窗*/
	RegisterWnd("parent",WndProc,COLOR_BTNFACE + 1);

	 /*註冊子視窗*/
	RegisterWnd("Child",ChildProc,COLOR_WINDOW);
	/*註冊子視窗*/
	RegisterWnd("Child1",ChildProc,COLOR_WINDOW);

	/*建立父視窗 
	 * 注意 視窗類的名稱必須和註冊時的名字一樣,否則顯示不了視窗
	 */
	HWND hMyWnd1 = CreateWnd("parent",NULL,WS_OVERLAPPEDWINDOW);

	/*建立子視窗*/
	HWND hChild = CreateWnd("Child",hMyWnd1,WS_CHILD| WS_VISIBLE|WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU);
	HWND hChild1 = CreateWnd("Child1",hMyWnd1,WS_CHILD| WS_VISIBLE|WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU);

	/*移動視窗*/
	MoveWindow(hChild,100,100,100,100,TRUE);
	/*移動視窗*/
	MoveWindow(hChild1,100,200,100,100,TRUE);

    DisplayWnd(hMyWnd1);

    Message();

    return 0;
}

MDI 視窗建立

/* File : mdiWindows.c
 * Auth : sjin
 * Date : 20140625
 * Mail : [email protected]
 */

#include <Windows.h>
#include <stdio.h>

HINSTANCE g_hInst = NULL;
HWND g_hMDIClient = NULL;

/*主視窗處理函式*/
LRESULT CALLBACK MainProc(HWND hWnd,
	UINT nMsg,
	WPARAM wParam,
	LPARAM lParam)
{
	switch(nMsg){
	case WM_DESTROY:

		PostQuitMessage(0);
		return 0;
	}
	return DefFrameProc(hWnd,g_hMDIClient,nMsg,wParam,lParam);
}

/*子視窗處理函式*/
LRESULT CALLBACK ChildProc(HWND hWnd,
							UINT nMsg,
							WPARAM wParam,
							LPARAM lParam)
{

	return DefMDIChildProc(hWnd,nMsg,wParam,lParam);
}

/*視窗註冊函式*/
BOOL RegisterWnd(LPSTR pszClassname,
				WNDPROC Proc,
				int nBrush)
{
	WNDCLASSEX wce = {0};

    wce.cbSize = sizeof(wce);
    wce.style = CS_VREDRAW|CS_HREDRAW;
    wce.lpfnWndProc = Proc;
    wce.cbClsExtra = 100;
    wce.cbWndExtra = 100;
    wce.hCursor = NULL;
    wce.hIcon = NULL;
    wce.hbrBackground = HBRUSH(nBrush);
    wce.lpszClassName = pszClassname;
    wce.lpszMenuName = NULL;
    wce.hInstance = g_hInst;
	wce.hIconSm = NULL;

    ATOM nAtom = RegisterClassEx(&wce);
    if(0 == nAtom)
    {
        MessageBox(NULL, "registerError", "Error", MB_OK);
        return FALSE;
    }
    return TRUE;
}

/*建立主視窗*/

HWND createMainWnd(LPSTR pszClassName)
{
	HWND hWnd = CreateWindowEx(0,
		pszClassName,"MainWnd",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		g_hInst,
		NULL);

	return hWnd;
}

/*建立MDICLIENT視窗*/

HWND createMdiClient(HWND hParent)
{
	/*建立時附件的資料
	 * MDICLIENT時必須的
	 */
	CLIENTCREATESTRUCT cs = {'\0'};
	cs.idFirstChild = 1000;/*ID號*/

	HWND hWnd = CreateWindowEx(0,
		"MDICLIENT","MainWnd",
		WS_CHILD|WS_VISIBLE,
		0,
		0,
		500,
		500,
		hParent,
		NULL,
		g_hInst,
		&cs);

	return hWnd;
}

/**/
HWND createChildWnd(HWND hParent,LPSTR pszClassName)
{
	

	HWND hWnd = CreateWindowEx(WS_EX_MDICHILD,
		pszClassName,"ChildWnd",
		WS_CHILD|WS_VISIBLE,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		hParent,
		NULL,
		g_hInst,
		NULL);

	return hWnd;
}


/*顯示視窗*/
void DisplayWnd(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}

/*訊息處理*/
void Message()
{
	MSG msg = {'\0'};
	while(GetMessage(&msg,NULL,0,0)){
		DispatchMessage(&msg);
	}
}

/*main*/
int APIENTRY WinMain(HINSTANCE hInstance,
					HINSTANCE  hPrevINstance,
					LPSTR lpCmdLine,
					int ShowCmd)
{
	/*註冊視窗*/
	RegisterWnd("MainWnd",MainProc,COLOR_BTNFACE + 1);

	RegisterWnd("ChildWnd",ChildProc,COLOR_WINDOW);

	/*建立MDI主視窗*/
	HWND hMain = createMainWnd("MainWnd");

	/*建立MDICLIENT視窗*/
	HWND hMdiClient = createMdiClient(hMain);
	//MoveWindow(hMdiClient,0,0,500,500,TRUE);

	/*建立MDI子視窗*/
	HWND hChild =  createChildWnd(hMdiClient,"ChildWnd");

	/*顯示和訊息處理*/
	DisplayWnd(hMain);
	Message();
	return 0;
}


相關推薦

走進windows程式設計世界-----視窗註冊建立

1   視窗註冊和建立1.1WIN32 視窗程式建立步驟1、WinMain入口函式的定義2、WindowProc函式的定義3、註冊視窗類RegisterClass、RegisterClassEX4、建立視窗CreateWindow、CreateWindowExHWND Cre

Windows程式設計 畫刷使用和建立

填充繪製的封閉的繪製的圖形需要用到畫刷 winAPI自帶畫刷建立: HBRUSH hBrush; HDC hdc; hdc = GetDC(hwnd); hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH); //表示獲取系統灰色畫刷 S

windows程式設計 建立一個新的視窗

#include <windows.h> LRESULT CALLBACK myProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR

Windows程式設計-建立視窗

視窗建立的基本步驟是: 設計視窗類 註冊視窗類 建立視窗 顯示更新視窗 訊息迴圈 編寫回調函式 ——————————帥氣的分割線—————————– 下面我們一步一步進行講解: 1.設計視窗類WNDCLASS 我們檢視MSDN可以知道視窗類的成

走進windows編程的世界-----消息處理函數(4)

rpo 擴展 hinstance adding 3.1 eof client cnblogs set 一 右鍵菜單 1 右鍵菜單 當在窗體點擊鼠標右鍵時,彈出的菜單。 2 右鍵菜單的使用 2.1 創建菜單 CreatePopupMenu 2

走進windows編程的世界-----入門篇

auth popu mod 開發 loadicon log 一個 oid 當前 1 Windows編程基礎 1.1Win32應用程序基本類型 1) 控制臺程序 不須要完好的windows窗體,能夠使用DOS窗體方式顯示 2) Win32窗體程序

通過修改註冊建立Windows自定義協議

height install ict 所有 cee 新建 gpo ogr 編輯 引言 本文主要介紹註冊表的概念與其相關根項的功能,以及瀏覽器如何通過連接調用自定義協議並與客戶端進行數據通信。文中講及如何通過C#程序、手動修改、安裝項目等不同方式對註冊表進行修改。其中通過安

windows程式設計 程序的建立銷燬和分析

Windows程式設計:程序程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動,在Windows程式設計環境下,主要由兩大元素組成:• 一個是作業系統用來管理程序的核心物件。作業系統使用核心物件來存放關於程序的核心資訊。• 另一個是地址空間,在地址空間囊括了所有可執行模組和動態連結庫的程式碼和資料

Windows網路程式設計(四):建立UDP連線和收發訊息

UDP訊息的傳送和接收需要UDP連線,所以,上面的TCP連線已經不適用了,具體的區別主要有: 建立Socket時引數不同建立服務端時不需要listen和accept操作建立客戶端時不需要connect操作伺服器需要bind操作,客戶端不需要。 傳送和接收UDP訊息要用到sendt

Windows網路程式設計(三):建立TCP連線和收發訊息

先看服務端: // ConsoleApplication3.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #define _WINSOCK_DEPRECATED_NO_WARNINGS //這個宣告要在stdafx.h的後面,但要

Windows——Node.js安裝配置+Vue安裝建立Vue專案

  Node.js安裝 安裝環境 Windows 10 Enterprise-X64 node-v10.13.0-x64.msi 安裝步驟 下載對應你係統的Node.js版本——選安裝目錄進行安裝——環境配置——測試 簡介

Java併發程式設計原理與實戰一(執行緒狀態建立執行緒的多種方式)

一、為什麼要學習併發程式設計 1.發揮多處理的強大能力 2.建模的簡單性 3.非同步事件的簡化處理 4.響應更加靈敏的使用者介面 二、併發的缺點 1.安全性問題 多執行緒環境下 多個執行緒共享一個資源 對資源進行非原子性操作 2.活躍

windows程式設計 顯示一個視窗

#include <windows.h> HINSTANCE hinst; LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance,

(Windows程式設計)視窗的誕生

    相對於DOS程式的main函式,Windows應用程式也有一個入口點函式--WinMain。當作業系統啟動一個程式時,它將呼叫程式的WinMain函式開始執行程式碼;當WinMain函式返回時

windows應用程式【二】建立視窗

我們在建立視窗時需要的過程  關於訊息迴圈 因為處理器同時只能執行一個程式 因此我們需要作業系統去排程程式 因此我們只是將訊息傳給作業系統 等待迴應從而由作業系統來顯示我們需要的視窗 wndproc() 視窗過程負責用來響應某一類視窗收到的各種Windows訊息

Directx3D9學習之二:Windows程式設計之最簡單視窗程式

Window style 視窗的風格,定義了一些視窗外觀和表現的標誌組合,WS_OVERLAPPEDWINDO是幾個標誌結合的位或,包含最小化,最大化按鈕,邊框,標題欄等等 第五個引數: Size and position 位置和大小 CW_USEDEFAULT 使用預設值 第六個引數: Parent

windows程式設計的偏門概念: 會話(Session), 視窗站(Window Station), 桌面

想實現向linux那樣的多個虛擬桌面麼?想知道讓服務程式顯示介面麼?那麼就認證看一下下面的說明吧。 1. 遠端桌面會話 當一個使用者登入到一個開啟了遠端桌面的機器時,便會開始一個該使用者的會話。每個會話使用一個唯一的會話ID來標識。由於每個登入到遠端桌面連線的客戶端都得

談談Windows程式設計中的父視窗和所有者視窗

一、概念和區別     在windows系統中,每個視窗物件都對應有一個數據結構,形成一個list連結串列。系統的視窗管理器通過這個list來獲取視窗資訊和管理每個視窗。這個資料結構中有四個資料用來構建list,即child、sibling、parent、owner四個域。    所以我們可以看到,視窗之間

C#獲得windows工作列視窗控制代碼一些操作(放大、縮小、關閉、隱藏……)

需呼叫API函式 需在開頭引入名稱空間using System.Runtime.InteropServices; 1、通過視窗名字查詢 [DllImport("user32.dll", EntryPoint = "FindWindow")] public static extern In

EurekaServer服務註冊中心建立微服務註冊進Eureka服務

                         EurekaServer服務註冊中心建立及微服務註冊進Eureka服務   目錄 一、Eure