首页 > 代码库 > Win32 Windows编程 四

Win32 Windows编程 四

一 窗口注册和窗口创建的过程

1  Win32窗口程序创建步骤

1.1 WinMain入口函数的定义

1.2 WindowsProc 函数的定义

1.3注册窗口

RegisterClass/RegisterClassEx

      1.4创建窗口

CreateWindow /CreateWindowEx

1.5 显示刷新窗口

ShowWindow/UpdateWindow

1.6 消息处理

GetMessage /DisptchMessage

1.7 窗口退出

WM_DESTROY:PostQuitMessage

2  窗口的注册

2.1 窗口的分类

2.1.1 系统全局类按钮 文本框 工具栏 

2.1.2 应用程序全局窗口类,可以在EXE和DLL中使用的窗口。

2.1.3 局部窗口类。只能在本模块中使用的窗口类。

2.2 实现窗口的注册

2.2.1 系统全局的窗口类,无需注册直接使用。使用CreateWindow函数,在CLASSNAME中指定系统已经定义好的窗口类型名称即可

2.2.2 应用程序的全局窗口类,需要用代码实现,在注册时需要增加CS_GLOBALCLASS定义实现方式:

WNDCLASS wc = {  0  };

wc.style = CS_GLOBALCLASS;

.....

RegisterClass( &wc );

2.2.3 局部窗口类,不能增加CS_GLOBALCLASS定义

     使用RegisterClass/RegisterClassEx注册

typedef struct _WNDCLASSEX { 
    UINT       cbSize;   	//结构体大小
    UINT       style; 			
    WNDPROC    lpfnWndProc; 
    int        cbClsExtra; 
    int        cbWndExtra; 
    HINSTANCE  hInstance; 
    HICON      hIcon; 
    HCURSOR    hCursor; 
    HBRUSH     hbrBackground; 
    LPCTSTR    lpszMenuName; 
    LPCTSTR    lpszClassName; 
    HICON      hIconSm; 	//窗口小图标
} WNDCLASSEX, *PWNDCLASSEX; 
   2.2.4 窗口类的风格
	CS_HREDRAW         窗口水平变化,重新绘制窗口
	CS_VREDRAW	   窗口垂直变化,重新绘制窗口
	CS_GLOBALCLASS	   创建应程序全局窗口类
	CS_DBCLICK 	   可以接受鼠标双击消息
	CS_BYTEALIGNCLIENT 客户区对齐方式 以8的倍数对齐
	CS_BYTEALIGNWINDOW 窗口对齐方式
	CS_CLASSDC	所有这种类型的窗口使用容一个DC(设备描述表 绘图使用)
	CS_OWNDC	每个窗口拥有自己的DC
	CS_PARENTDC     使用父窗口的DC
	CS_SAVEBITS 	是用位图保存窗口,可以提高窗口界面的刷新性能
	CS_NOCLOSE	禁止关闭命令
   2.2.5 窗口类的附加数据 cbClsExtra
	在窗口类的数据信息中添加自己的信息
	cbClsExtra 用于添加信息的内存的大小, 一般是4的倍数
	SetClassLong 将信息保存到内存中
	GetClassLong 将信息从内存中取出
	
	DWORD GetClassLong(
  		HWND hWnd,  // handle to window
 		int nIndex  // offset of value to retrieve
		);
   2.2.6 窗口附加数据 
	在窗口的数据信息中添加自己的信息
	cbWndExtra 用于添加信息的内存大小
	SetWindowLong
	LONG SetWindowLong(
  		HWND hWnd,       // handle to window
 		int nIndex,      // offset of value to set
		LONG dwNewLong   // new value
		);
	GetWindowLong
	LONG GetWindowLong(
  	 	HWND hWnd,  // handle to window
 		int nIndex  // offset of value to retrieve
	);

2.3 窗口类相关函数

RegisterClass/RegisterClassEx 注册

UnregisterClass 注销

GetClassInfo/GetClassInfoEx 获取信息

GetClassName 获取窗口类的名称

GetClassLong/SetClassLong 附加数据的设置和获取

GetWindowLong/SetWindowLong 附加数据的设置和获取

2.4 创建窗口时如何定位窗口类

2.4.1 查找应用程序的局部窗口类。如果找到执行2.4.2,否则执行2.4.3

2.4.2 如果找到名称一致的窗口类,比较HINSTANCE的句柄,如果一致,就使用找到的窗口类信息创建窗口,如果不同,继续查找

2.4.3 如果未找到名称一致的窗口类,会继续在应用程序全局窗口类中查找,如果找到执行2.4.4,否则执行2.4.5

2.4.4 全局窗口找到一致的,使用找到窗口类信息创建窗口

       2.4.5 如果未找到,就去系统全局窗口类中查找,如果找到,创建窗口,否则返回失败

3 .窗口创建

3.1 窗口创建函数

CreateWindow/CreateWindowEx

HWND CreateWindowEx(
  DWORD dwExStyle,      // extended window style 窗口的扩展样式
  LPCTSTR lpClassName,  // registered class name
  LPCTSTR lpWindowName, // window name
  DWORD dwStyle,        // window style
  int x,                // horizontal position of window
  int y,                // vertical position of window
  int nWidth,           // window width
  int nHeight,          // window height
  HWND hWndParent,      // handle to parent or owner window
  HMENU hMenu,          // menu handle or child identifier
  HINSTANCE hInstance,  // handle to application instance
  LPVOID lpParam        // window-creation data
);

3.2 窗口风格和扩展风格

窗口风格:WS_XXXX定义的风格,是窗口的基本风格

扩展风格:WS_EX_XXXX定义的风格 是窗口的扩展风格

 扩展风格需要使用CreareWindowEx

WS_OVERLAPPEDWINDOW 层叠式窗口

WS_POPUP 弹出式窗口

WS_CHILD 窗口子窗口


3.3 父窗口和子窗口

3.3.1 CreateWindow时指定父窗口

3,3.2 将窗口的风格增加WS_CHILD

3.3.3 可以使用SetParent 和 GetParent 函数设置和获取指定的父窗

CreateWindow时可以指定父窗口

WS_CHILD

SetParent

GetParent

其他: MoveWindow 移动窗口

3.4 MDI窗口的创建

3.4.1 主窗口

3.4.2 创建一个MDICLINET窗口

3.4.3 创建一个MDI的子窗口