首页 > 代码库 > 走进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 : 413977243@qq.com
 */

/*窗口的创建的练习*/

#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 : 413977243@qq.com
 */

/*窗口的创建的练习*/

#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;
}