网站首页 > 技术教程 正文
1 窗口分类及关系
GDD中窗口分为三大类:桌面窗口、主窗口、控件。
桌面窗口是整个系统唯一的一个全局根窗口,它在系统启动时,由系统自动创建,如果用户要对桌面窗口进行操作,可以先通过GetDesktopWindow获得桌面窗口句柄。可以使用相应的窗口API函数集对其进行操作。
主窗口由用户创建,是用户图形窗口程序必须创建的第一个窗口。是所有控件的载体,也负责整个用户窗口程序的消息事件收集与派发。
控件是在主窗口创建之后,由用户创建。控件不是必须的,一个窗口系统必须至少有一个主窗口,而控件则是用户按实际应用情况,是否使用;控件和主窗口一样,都是使用CreateWindow函数来创建它,与创建主窗口不同的是:当需要创建的窗口为控件时,必须指定该窗口为WS_CHILD风格,需要指明控件所属的父窗口,以及为每个控件指定一个同级窗口中的唯一ID,具体请参考CreateWindow: 创建窗口。GDD提供了一些常用标准控件给用户使用,如按钮、复选框、单选框等。
三种不同类型窗口示例如图 2-1所示:
2 窗口的客户区与非客户区
窗口区域分为客户区与非客户区两部分。在一个窗口中,标题栏,边框就是窗口的非客户区,中间区域称为客户区。它们的关系如图 2-2所示:
3 坐标系统
GDD的所有坐标都是像素数坐标,有三种坐标系统,相互之间是可以转换的,这三种坐标系统分别是:屏幕坐标,窗口坐标,客户坐标。
屏幕坐标以屏幕左上角为坐标原点,水平方向为X值,垂直方向为Y值构成坐标系。
窗口坐标以窗口左上角为坐标原点,水平方向为X值,垂直方向为Y值构成坐标系。
客户坐标以窗口客户区左上角为坐标原点,水平方向为X值、垂直方向为Y值构成坐标系。
三种坐标关系示意图 2-3如下:
4 窗口句柄与窗口ID的作用与区别
在窗口程序中,用户会经常和窗口句柄,窗口ID打交道,窗口句柄是由系统自动分配的,无需用户干预,对窗口操作访问,都只能通过句柄进行;而窗口ID,是在创建窗口时,由用户指定的一个任意32位数,一般用于对同级窗口(兄弟窗口)间的标识区分,同级窗口间,它们的ID需由用户创建窗口时保证唯一性,对于不同父窗口下的子窗口,它们的ID是可以重复的;例如一个窗口A和窗口B,它们都可以创建一个指定ID为1的子窗口,这是合法的,另外补充一点,窗口ID是针对来标识子窗口的,因此,桌面窗口及所有主窗口是没有ID标识的概念的,当用户创建一个主窗口时,系统会忽略CreateWindow函数的ID参数值,具体请参数 CreateWindow 函数。
5 窗口的关闭、销毁、退出过程
这个步骤流程如下:
1.发送MSG_CLOSE消息,该消息可以由系统产生(比如用户点击窗口的” ×” 按钮,也可以是用户主动发送MSG_CLOSE消息(使用SendMessage函数)。
2.用户在窗口过程函数中响应MSG_CLOSE消息,在这一步中,用户还能决定是否继续真正关闭和销毁窗口,如果不需要,则直接丛该消息响应过程中返回,否则,用户需调用DestroyWindow函数来继续销毁窗口。
3.响应MSG_DESTROY消息,该消息是由DestroyWindow函数产生的,到了这里,窗口关闭、销毁已经是“无可挽回”的地步,用户可以在这里做一些资源释放工作,如果销毁的是主窗口,用户必须要在MSG_DESTROY消息响应过程中调用PostQuitMessage函数,如果是子窗口,则不需要调用,子窗口关闭、销毁过程也至此结束。
4.如果是主窗口,由于在MSG_DESTROY中调用了PostQuitMessage函数,该函数会产生一条MSG_QUIT消息,当主窗口消息循环中的GetMessage函数获得到MSG_QUIT消息时,会在该函数返回前销毁主窗口,并返回FALSE,如是,整个窗口消息循环至此结束。
6 API说明
6.1 ScreenToClient: 屏幕坐标转换为客户区坐标
BOOL ScreenToClient(HWND hwnd,POINT *pt,s32 count);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
pt: 需要转换的坐标点,该参数兼作为转换的输入和输出参数。
count: 需要转换的坐标点数量。
返回值:
TRUE:成功; FALSE:失败。
说明:
如果函数返回失败,原因可能是窗口句柄无效,参数pt指针为NULL;另外,该函数不关心需要转换的坐标是否在窗口可视范围内。
??????6.2 ClientToScreen: 客户区坐标转换为屏幕坐标
BOOL ClientToScreen(HWND hwnd, POINT *pt, s32 count);
头文件:
gdd.h
参数:
Hwnd: 窗口句柄。
pt: 需要转换的坐标点,该参数兼作为转换的输入和输出参数。
count: 需要转换的坐标点数量。
返回值:
TRUE:成功; FALSE:失败。
说明:
如果函数返回失败,原因可能是窗口句柄无效,参数pt指针为NULL;另外,该函数不处理需要转换的坐标是否在窗口可视范围内。
???????6.3 ScreenToWindow:屏幕坐标转换为窗口坐标
BOOL ScreenToWindow(HWND hwnd,POINT *pt,s32 count);
头文件:
gdd.h
参数:
hwnd: 窗口句柄.
pt: 需要转换的坐标点,该参数兼作为转换的输入和输出参数。
count: 需要转换的坐标点数量。
返回值:
TRUE:成功; FALSE: 失败。
说明:
如果函数返回失败,原因可能是窗口句柄无效,参数pt指针为NULL;另外,该函数不处理需要转换的坐标是否在窗口可视范围内。
???????6.4 WindowToScreen: 窗口坐标转换为屏幕坐标
BOOL WindowToScreen(HWND hwnd,POINT *pt,s32 count);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
pt: 需要转换的坐标点,该参数兼作为转换的输入和输出参数。
count: 需要转换的坐标点数量。
返回值:
TRUE:成功; FALSE:失败。
说明:
如果函数返回失败,原因可能是窗口句柄无效,参数pt指针为NULL;另外,该函数不处理需要转换的坐标是否在窗口可视范围内。
???????6.5 GetDesktopWindow: 获得桌面窗口句柄
HWND GetDesktopWindow(void);
头文件:
gdd.h
参数: 无。
返回:
桌面窗口句柄。
???????6.6 GetWindowRect: 获得窗口矩形
BOOL GetWindowRect(HWND hwnd,RECT *prc);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
prc: 矩形缓冲区。
返回值:
TRUE:成功; FALSE:失败。
说明:
该函数获得窗口边界在屏幕上的矩形位置,以屏幕坐标表示。
???????6.7 GetClientRect: 获得窗口客户区矩形
BOOL GetClientRect(HWND hwnd,RECT *prc);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
prc: 矩形缓冲区。
返回值:
TRUE:成功; FALSE:失败。
说明:
该函数获得窗口客户区矩形,以客户区坐标表示,所以获得的矩形左上角坐标恒为0,0;矩形右下角坐标所指示的为客户区宽度和高度。
???????6.8 GetClientRectToScreen: 取窗口客户区矩形的屏幕坐标
BOOL GetClientRectToScreen(HWND hwnd,RECT *prc);
头文件:
gdd.h
参数:
hwnd: 窗口坐标。
prc: 矩形缓冲区。
返回值:
TRUE:成功; FALSE:失败。
说明:
该函数获得窗口客户区边界在屏幕上的矩形位置,以屏幕坐标表示。
???????6.9 GetWindowDC: 获得窗口绘图上下文
HDC GetWindowDC(HWND hwnd);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
返回值:
窗口绘图上下文句柄。
说明:
该函数获得的绘图上下文,可以在整个窗口范围内(非客户区+客户区)绘图。绘图上下文的原点坐标(0,0)为窗口边界最左上角,在结束绘图后,需调用ReleaseDC来释放该绘图上下文。
6.10 GetDC:获得窗口客户区绘图上下文
HDC GetDC(HWND hwnd);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
返回值:
窗口客户区绘图上下文句柄。
说明:
该函数获得的绘图上下文,只能在窗口客户区范围内绘图,绘图上下的原点坐标(0,0)为窗口客户区边界最左上角,在结束绘图后,需调用 ReleaseDC 来释放该绘图上下文。
6.11 ReleaseDC: 释放一个绘图上下文
BOOL ReleaseDC(HWND hwnd,HDC hdc);
头文件:
gdd.h
参数::
hwnd: 绘图上下文所属的窗口句柄。
hdc: 需要释放的绘图上下文句柄。
返回值:
TRUE:成功; FALSE:失败。
说明:
该函数只能释放由 GetWindowDC,GetDC 所返回的绘图上下文句柄。
6.12 BeginPaint: 开始绘图
HDC BeginPaint(HWND hwnd);
头文件:
gdd.h
参数:
hwnd: 需要开始绘图的窗口句柄。
返回值:
绘图上下文句柄。
说明:
该函数只在窗口过程函数的 MSG_PAINT 消息中使用,指示客户区开始绘图;该函数返回的绘图上下文句柄,只能在窗口客户区范围内绘图, 原点坐标(0,0)为窗口客户区边界最左上角, 在结束绘图后,需调用 EndPaint 来释放该绘图上下文。
6.13 EndPaint: 结束绘图
BOOL EndPaint(HWND hwnd,HDC hdc);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
hdc: 需要结束绘图的绘图上下文句柄。
返回值:
TRUE:成功; FALSE:失败。
说明:
该函数只在窗口过程函数的 MSG_PAINT 消息中与 BeginPaint 成对使用,指示绘图结束并释放由BeginPaint所返回的绘图上下文句柄。
6.14 CreateWindow: 创建窗口
HWND CreateWindow(WNDPROC *pfWinProc,LPCWSTR Text,u32 Style,
s32 x, s32 y, s32 w, s32 h,HWND hParent,u32 WinId,const void *pdata);
头文件:
gdd.h
参数:
pfWinProc: 窗口过程函数地址。
Text: 窗口标题文字。
Style: 窗口风格属性标记,高16位为窗口公共风格属性标记,所有窗口适用;低16位窗口私有的风格属性标记,代表窗口的私有行为或外观,对于不同类型的窗口,私有风格属性值所代表的含义,仅作用于本身,不可以用于其它不同类型的窗口;不管是公共还是私有风格属性,系统都定义了相关的宏常量供用户使用,对于窗口公共风格属性,可以是以下值的组合:
WS_CHILD: 设定该标志,则创建为子窗口/控件;
WS_VISIBLE: 设定该标志,则窗口为可见的;
WS_DISABLE: 设定该标志,刚窗口为禁止状态,将不会响应外部的输入消息,如键盘,鼠标消息等等;
WS_BORDER: 设定该标志,则窗口会包含并显示外边框;
WS_DLGFRAME: 设定该标志,则窗口会包含并显示内边框;
WS_CAPTION: 设定该标志,刚窗口会包含并显示标题栏;
私有风格属性有以下定义,详情见gdd.h。
// 按钮风格
BS_TYPE_MASK: 类型掩码;
BS_NORMAL: 常规按钮;
BS_HOLD: 自锁按钮;
BS_RADIO: 单选按钮;
BS_SURFACE_MASK: 外观掩码;
BS_NICE: 美观风格;
BS_SIMPLE: 简朴风格;
BS_FLAT: 平面风格;
BS_PUSHED: 按钮按下;
// 复选框风格
CBS_SELECTED: 复选框选中。
x,y,w,h: 指示窗口的位置和大小,位置是相对于该窗口所属的父窗口的客户区偏移量,即使用的是客户区坐标表示。大小表示窗口的水平和垂直方向所占的像素数量。
hParent: 父窗口句柄,如果是创建主窗口(没有指定WS_CHILD属性),该参数设为NULL。
WinId: 用户指定的窗口ID,如果是主窗口,该参数会被忽略; 如果是同一级子窗口,则需要为每个指定为不同ID,如果指定了一个已有的同级窗口ID,该函数将创建窗口失败,返回NULL。
pData: 用户自定义的窗口私有数据,该参数会传入窗口过程的MSG_CREATE消息的param1中,如果不需要窗口私有数据,可以将该参数设为NULL。
返回值:
新创建的窗口句柄;如果创建失败,该函数返回NULL。
6.15 DestroyWindow: 销毁窗口
void DestroyWindow(HWND hwnd);
头文件:
gdd.h
参数:
hwnd: 需要销毁的窗口句柄。
说明:
该函数用来销毁一个窗口,除了销毁窗口本身,也会销毁窗口所属的所有子窗口和定时器,如果用户不调用该函数来销毁所创建的子窗口,当主窗口退出时,也会自行销毁所有子窗口和定时器,如果所销毁的窗口是焦点窗口,那么它所在的父窗口的焦点窗口对象会被设为NULL。
6.16 MoveWindow: 移动窗口位置
BOOL MoveWindow(HWND hwnd,s32 x, s32 y);
头文件:
gdd.h
参数:
hwnd: 需要移动的窗口句柄。
x,y: 移动后,新的坐标位置。
返回值:
TRUE:成功; FALSE:失败。
说明:
该函数使用的坐标是相对于父窗口的客户区位置,即父窗口的客户区坐标。如果移动一个窗口并超出它所属的父窗口客户区范围,那么,超出的部分是会被裁剪的(不可见).如图2-4所示:
6.17 OffsetWindow: 偏移窗口位置
BOOL OffsetWindow(HWND hwnd,int dx,int dy);
头文件:
gdd.h
参数:
hwnd: 需要偏移的窗口句柄。
dx,dy: 水平,垂直方向的偏移量。
返回值:
TRUE:成功; FALSE:失败。
说明:
当dx为负数时,窗口向左偏移,否则向右偏移;当dy为负数时,窗口向上偏移,否则向下偏移。
6.18 IsWindowVisible: 判断窗口是否可见
BOOL IsWindowVisible(HWND hwnd);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
返回值:
TRUE:窗口可见; FALSE:窗口不可见。
说明:
如果一个窗口为不可见,那么它所属的所以子窗口也都为不可见,即便子窗口设置了WS_VISIBLE标记。更多的内容,请参考ShowWindow函数说明。
6.19 InvalidateWindow: 设置窗口为无效状态
BOOL InvalidateWindow(HWND hwnd,BOOL bErase);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
bErase:是否重绘窗口背景。
返回值:
TRUE:成功; FALSE:失败。
说明:
设置窗口为无效状态,即意味着窗口需要进行重绘,该函数会给指定的窗口产生一条异步方式的窗口绘制消息:MSG_PAINT,MSG_PAINT是属于低优先级处理的消息,只有当其它消息处理完成后(MSG_TIMER除外,这个优先级更低),才会处理窗口绘制操作,如果系统因繁忙导致前面的绘制消息未能及时处理,系统将对后续重复的同一个窗口的多个绘制消息合并为一个,以减少系统负担,以过滤掉不必要的多余的绘制过程。当bErase参数为TRUE时,窗口过程将会在执行MSG_PAINT前,发送一条MSG_ERASEBKGND消息,用于窗口背景重绘,用户可以在窗口过程函数中,响应MSG_ERASEBKGND消息来实现窗口背景的绘制工作。
6.20 ShowWindow: 设置窗口为显示或隐藏状态
BOOL ShowWindow(HWND hwnd,BOOL bShow);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
bShow: 显示标记,当为TRUE时,设置窗口为显示状态(可见状态);为FALSE时,将设置窗口为隐藏状态。
返回值:
TRUE: 成功; FALSE:失败。
说明:
该函数为设置窗口是否显示或隐藏,即设置或清除窗口的WS_VISIBLE标记,需要注意的是:如果该窗口所属的父窗口为隐藏状态(不可见),那么它的所有子窗口都不会被显示,即便子窗口设置为显示状态(WS_VISIBLE);改变父窗口的显示状态标志时,并不会改变它所属的子窗口显示状态标志。例如,假设起先一个父窗口A和它的一个子窗口B都为隐藏状态(不可见,无WS_VISIBLE标记),这时,如果将父窗口设置为显示状态(可见,设置了WS_VISIBLE标记),那么此时,它的子窗口B仍然不会显示出来。总结来说,一个窗口真正可见,除了窗口本身具备可见属性(WS_VISIBLE)之外,还必须它的所有上级父窗口同时都具备可见属性。
6.21 EnableWindow: 设置窗口为使能或禁止状态
BOOL EnableWindow(HWND hwnd,BOOL bEnable);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
bEnable: 标记状态,当为TRUE时,设置窗口为使能状态;为FALSE时,设置窗口为禁止状态。
返回值:
TRUE:成功; FALSE:失败。
说明:
该函数为设置窗口是否使能或禁止,即设置或清除窗口的WS_DISABLE标记,当窗口为禁止状态(设置了WS_DISABLE标记)时,它将不能接收到外部输入事件产生的消息,如键盘,鼠标/触摸屏产生的消息,但如果用户通过SendMessage/PostMessage函数强制向窗口发送这类消息,窗口是可以正常接收到的;一个窗口只有当他的上级所有父窗口及窗口本身都使能时,该窗口才真正允许接收到外部输入事件产生的消息,这种关系与ShowWindow函数类似。需要注意的是禁止状态的窗口是可见的并且能绘制。
6.22 GetParent: 获得父窗口句柄
HWND GetParent(HWND hwnd);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
返回值:
父窗口句柄。
6.23 GetWindow: 获得与指定窗口有特定关系的窗口句柄
HWND GetWindow(HWND hwnd,int nCmd);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
nCmd: 说明指定窗口与要获得句柄的窗口之间的关系,该参数值可以是下列之一:
GW_CHILD: 获得z序顶端的子窗口。
GW_HWNDPREV: 获得z序上一个同级窗口。
GW_HWNDNEXT: 获得z序下一个同级窗口。
GW_HWNDFIRST: 获得z序顶层的同级窗口。
GW_HWNDLAST: 获得z序底层的同级窗口。
返回值:
特定关系的窗口句柄。
6.24 GetDlgItem: 获得窗口中指定ID的子窗口的句柄
HWND GetDlgItem(HWND hwnd,u32 id);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
id: 所属子窗口ID。
返回值:
子窗口句柄。
6.25 SetWindowText:设置窗口文字
void SetWindowText(HWND hwnd,const char *text,s32 max_len);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
text:需要设置的字符串内容。
max_len:最大字符串字节长度,如果该值是负数,则使用整个字符串实际字节长度;如果该值小于实际的字符串字节长度,且大于0,则字符串多余的部分将会被截断;如果该值大于实际的字符串字节长度,则按实际的字符串长度来处理。
返回值:
无。
???????6.26 GetWindowText:获得窗口文字
char* GetWindowText(HWND hwnd,char *text,s32 max_len);
头文件:
gdd.h
参数:
hwnd: 窗口句柄。
text:输出的字符串缓冲区。
max_len:最大字符串字节长度,如果该值是负数,则使用窗口整个字符串实际字节长度;如果该值小于实际的字符串字节长度,且大于0,则字符串多余的部分将会被截断;如果该值大于窗口实际的字符串字节长度,则按实际的字符串长度来处理。
返回值:
字符串指针。
???????6.27 GetWindowFromPoint: 获得指定屏幕坐标位置所在的窗口
HWND GetWindowFromPoint(POINT *pt);
头文件:
gdd.h
参数:
pt: 坐标位置点参数,该坐标值使用屏幕坐标。
返回值:
坐标所在的窗口句柄。
说明:
在多级窗口丛属关系中,该函数返回的窗口句柄,将会是坐标所在位置的最低级别的窗口。
???????6.28 SetFocusWindow:设置当前焦点窗口
HWND SetFocusWindow(HWND hwnd);
头文件:
gdd.h
参数:
hwnd: 新的焦点窗口句柄,如果该值为NULL,则会清除当前焦点窗口。
返回值:
旧的焦点窗口句柄,如果当前无焦点窗口,返回NULL。
说明:
调用该函数时,新的焦点窗口,将会收到MSG_SETFOCUS消息,旧的焦点窗口,将会收到MSG_KILLFOCUS消息。当一个窗口设为当前焦点窗口时,才能收到键盘产生的消息:MSG_KEY_DOWN及MSG_KEY_UP。
6.29 GetFocusWindow:获得当前焦点窗口
HWND SetFocusWindow(HWND hwnd);
头文件:
gdd.h
参数:
无。
返回值:
当前焦点窗口句柄,如果当前无焦点窗口,返回NULL。
???????6.30 IsFocusWindow:判断指定窗口是否为当前焦点窗口
BOOL IsFocusWindow(HWND hwnd);
头文件:
gdd.h
参数:
无。
返回值:
TURE:指定的窗口是当前焦点窗口;FALSE:指定的窗口不是当前焦点窗口。
???????6.31 DefWindowProc: 系统默认的窗口消息处理函数
u32 DefWindowProc(MSG *pMsg);
头文件:
gdd.h
参数:
pMsg: 需要处理的消息。
返回值:
消息处理结果。
说明:
在窗口过程中函数中,对于用户不感兴趣的消息,需调用该函数,交由系统默认处理。
猜你喜欢
- 2024-10-25 Auto CAD 常用系统变量 cad2020系统变量
- 2024-10-25 做开发十年,我总结出了这些开发经验
- 2024-10-25 Windows高级工程师:GDI/GDI+绘图;基础入门大全
- 2024-10-25 菜比手把手教你破解游戏多开(轻喷)
- 2024-10-25 JVM 完整深入解析 jvm解析阶段
- 2024-10-25 Linux打开的文件过多Too many open file
- 2024-10-25 一文看完Oracle数据库之PGA概念、组成、自动管理、参数及视图
- 2024-10-25 JavaScript 中内存泄漏的原因以及对策
- 2024-10-25 史上最全Oracle文件损坏处理办法(附实验步骤)
- 2024-10-25 C++消息循环GetMessage/TranslateMessage/DispatchMessage
你 发表评论:
欢迎- 01-09单因素方差分析+作图
- 01-09描述性统计分析 之 均值分析
- 01-0986:重复性和再现性分析GRR(2)-GRR均值极差分析法和方差分析法
- 01-09SPC如何做方差分析,意义又在哪里?
- 01-09MedSPSS小课堂——多因素方差分析
- 01-09MedSPSS小课堂——双因素方差分析
- 01-09SPSS单因素方差分析的操作步骤及结果解读,陈老师SPSS数据分析
- 01-0914单因素方差分析:One-Way ANOVA
- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)