WIN32窗口的制作
- 格式:doc
- 大小:108.00 KB
- 文档页数:9
⽤c语⾔编写⼀个windows窗⼝,Windows窗⼝创建代码(C语⾔)这是⼀个使⽤C语⾔创建空⽩窗⼝的基本框架代码案例。
#include#include//窗体备⽤HWND g_hwnd;HINSTANCE g_hInstance;//过程函数LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){switch (uMsg){case WM_DESTROY://销毁窗体PostQuitMessage(0);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;}//主函数int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow){//定义填充窗⼝WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_VREDRAW | CS_HREDRAW;wcex.lpfnWndProc = WinProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);wcex.lpszMenuName = NULL;wcex.lpszClassName = TEXT("WinApp");wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);//注册窗⼝类if (!RegisterClassEx(&wcex)){return 0;}g_hInstance = hInstance;//创建窗⼝HWND hwnd;if (!(hwnd = CreateWindowEx(0, TEXT("WinApp"), TEXT("HelloWord"), WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL))){return 0;}g_hwnd = hwnd;//显⽰更新窗⼝ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);//消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}。
python和pywin32实现窗⼝查找、遍历和点击Pywin32是⼀个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接⼝、线程以及COM机制等等。
1.通过类名和标题查找窗⼝句柄,并获得窗⼝位置和⼤⼩import win32guiimport win32apiclassname = "MozillaWindowClass"titlename = "百度⼀下,你就知道 - Mozilla Firefox"#获取句柄hwnd = win32gui.FindWindow(classname, titlename)#获取窗⼝左上⾓和右下⾓坐标left, top, right, bottom = win32gui.GetWindowRect(hwnd)2.通过⽗句柄获取⼦句柄def get_child_windows(parent):'''获得parent的所有⼦窗⼝句柄返回⼦窗⼝句柄列表'''if not parent:returnhwndChildList = []win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd), hwndChildList)return hwndChildList#获取某个句柄的类名和标题title = win32gui.GetWindowText(hwnd)clsname = win32gui.GetClassName(hwnd)#获取⽗句柄hwnd类名为clsname的⼦句柄hwnd1= win32gui.FindWindowEx(hwnd, None, clsname, None)3.⿏标定位与点击#⿏标定位到(30,50)win32api.SetCursorPos([30,150])#执⾏左单键击,若需要双击则延时⼏毫秒再点击⼀次即可win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)#右键单击win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)4.发送回车键win32api.keybd_event(13,0,0,0)win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)5.关闭窗⼝win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0)。
很多学C的朋友认为C语言只能写DOS程序,而不能像C#那样写windows窗体的程序,这你可就打错特错了,今天我来简单掩饰下C语言怎么利用windows提供出来的API写windows窗体程序。
开发工具VC6.0,开发平台windows7。
首先第一步,打开VC,新建工程,选择win32 application,如下图然后新建一个C语言源文件,这个就不截图了,如果这也不会的话相信你也不会来看这篇帖子~呵呵建好文件以后把一下代码输入进去。
编译即可~代码讲解会下帖子下方1.#include <windows.h>2.3.LRESULT CALLBACK Windo WP roc(4. HWND hwnd, //handle to window5. UINT uMsg, //message identifier6. WPARAM wParam, //first message parameter7. LPARAM lParam //second message parameter8. );9.10.11.int WINAPI WinMain(HINSTANCE hInstance,12. HINSTANCE hPrevInstance,13. L PS TR lpCmdLine,14. int nShowCmd15. )//入口函数16.{17. WNDCLASS wndclass;18. HWND wndhwnd;19. MSG msg;20. wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//加载图标21. wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//加载鼠标样式22. wndclass.style=CS_VREDRAW | CS_HREDRAW;//窗口样式23. wndclass.lpfnWndProc=WindowProc;//窗口过程回调函数24. wndclass.cbClsExtra=0;//类额外内存25. wndclass.cbWndExtra=0;//窗口额外内存26. wndclass.hInstance=hInstance;//27. wndclass.hbrBackground=(HBRUSH)GetStockObject(SYSTEM_FONT);//窗口颜色28. wndclass.lpszMenuName=NULL;//窗口菜单29. wndclass.lpszClassName="testWindow";//窗口类名30.31. RegisterClass(&wndclass);32. wndhwnd=CreateWindow("testWindow","windows",WS_OVERLAPPEDWINDOW& ~WS_MAXIMIZEBOX,33. CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,34. NULL,NULL,hInstance,NULL);35. ShowWindow(wndhwnd,SW_SHOWNORMAL);36. UpdateWindow(wndhwnd);37. while(GetMessage(&msg,NULL,0,0))38. {39. TranslateMessage(&msg);40. DispatchMessage(&msg);41. }42.43. return 0;44.}45.46.LRESULT CALLBACK WindowProc(47. HWND hwnd, //handle to window48. UINT uMsg, //message identifier49. WPARAM wParam, //first message parameter50. LPARAM lParam //second message parameter51. )52.{53. HDC hdc,hDC;54. PAINTSTRUCT ps;55. char szchar[20];56. static int i=0;57. switch (uMsg)58. {59. case WM_PAINT://窗口重绘消息,窗口加载和重绘的时候产生该消息60. hdc=BeginPaint(hwnd,&ps);61. TextOut(hdc,0,0,"窗口加载完成",strlen("窗口加载完成"));//往窗口输出文本62. //MessageBox(hwnd,"Hello World","Hi",MB_OK);63. EndPaint(hwnd,&ps);64.65. break;66. case WM_CHAR://处理键盘按键消息67. sprintf(szchar,"char is %c",wParam);68. MessageBox(hwnd,szchar,"提示",MB_OK);69. break;70. case WM_LBUTTONDOWN://处理鼠标左键按下消息71. MessageBox(hwnd,"mouse click","提示",MB_OK);72. hDC=GetDC(hwnd);73. TextOut(hDC,0,50,"鼠标事件处理时显示文字",strlen("鼠标事件处理时显示文字"));74. ReleaseDC(hwnd,hDC);75. break;76. case WM_CLOSE://窗口关闭消息77. if(IDYES==MessageBox(hwnd,"你确定要关闭吗?","提示",MB_YESNO))78. DestroyWindow(hwnd);79. break;80. case WM_DESTROY:81. PostQuitMessage(0);82. break;83. default:84. return DefWindowProc(hwnd,uMsg,wParam,lParam);//使用缺省值来调用窗口过程函数85. }86. return 0;87.}复制代码要说明的事,windows程序必须包含的头文件就是windows.h,而程序的入口函数叫做WinMain(dos的入口函数叫main),如果搞不清有几个参数,参数怎么写,可以查阅MSDN,WindowProc函数是窗口过程函数,也就是处理窗口消息的函数;先来看winamin函数内部,首先定义了一个WNDCLASS类型的数据,这个类型是windows 提供出来的结构体,他里面有10个成员。
win32createwindowexw函数`CreateWindowExW`是Windows API中的一个函数,用于创建一个指定类别的窗口。
这个函数在Win32应用程序中广泛使用,以便在屏幕上创建和显示窗口。
以下是该函数的简要说明:函数原型:```c++BOOL CreateWindowExW(DWORD dwExStyle,//扩展样式LPCWSTR lpClassName,//窗口类名LPCWSTR lpWindowName,//窗口标题DWORD dwStyle,//窗口样式int x,//窗口左上角的x坐标int y,//窗口左上角的y坐标int nWidth,//窗口宽度int nHeight,//窗口高度HWND hWndParent,//父窗口句柄(通常是null)HMENU hMenu,//菜单句柄(通常是null)HINSTANCE hInstance,//实例句柄LPVOID lpParam//附加参数(通常是null));```参数说明:-`dwExStyle`:扩展样式,用于指定特殊窗口风格。
-`lpClassName`:窗口类名,通常是自定义的类名或系统预定义的类名(如按钮、文本框等)。
-`lpWindowName`:窗口标题,显示在窗口顶部。
-`dwStyle`:窗口样式,包含普通窗口风格和特殊窗口风格。
-`x`、`y`:窗口左上角的坐标。
-`nWidth`、`nHeight`:窗口的宽度和高度。
-`hWndParent`:父窗口句柄,通常是null。
-`hMenu`:菜单句柄,通常是null。
-`hInstance`:应用程序实例句柄。
-`lpParam`:附加参数,通常是null。
返回值:-如果成功创建窗口,返回新窗口的句柄。
-否则,返回null。
需要注意的是,使用`CreateWindowExW`创建窗口时,需要根据实际需求设置相应的窗口风格和参数。
此外,创建窗口后,还需要处理窗口消息事件,如`WM_DESTROY`(窗口销毁消息),以保证程序的正常运行。
实验一、创建 Win32 应用程序Win32 API(也称为 Windows API)是用于创建 Windows 应用程序的基于 C 的框架,自 Windows 1.0 以来就已存在。
在Windows API中可以找到有关此 API 的大量文档。
在本过程中,我们将创建向窗口显示“Hello, World!”的简单 Win32应用程序。
过程中的步骤对于所有 Win32 应用程序都是相同的。
完成此过程后,您可以将这里创建的代码用作创建任何其他 Win32 应用程序的主干。
创建新的 Win32 项目1.在“文件”菜单上,单击“新建”,然后单击“项目...”。
2.在“项目类型”窗格中,选择“Visual C++”节点中的“Win32”,然后在“模板”窗格中选择“Win32 项目”。
键入项目的名称,如win32app。
您可以接受默认位置、键入一个位置或者导航到要保存项目的目录。
3.在“Win32 应用程序向导”中,选择“下一步”。
4.在“Win32 应用程序向导”中,在“应用程序类型”下选择“Windows 应用程序”。
在“附加选项”下选择不要勾选“空项目”。
原样保留剩余的选项。
单击“完成”创建项目。
5.在“生成”菜单中选择“生成解决方案”。
6.在“调试”菜单中选择“启动调试”。
观察程序的运行效果。
在所给"WinUI.chm"//windows下的标准帮助文件格式文件中查找RegisterClassEx、CreateWindow、ShowWindow等函数的文档,在所给"GDI.chm"中查找UpdateWindow等函数的文档。
并按要求修改源程序。
1、将窗口标题中的字符修改为"这是我的第一个窗口":在资源视图-->String table 中修改IDS_APP_TITLE的内容;2、修改窗口的图标(右上角)和最小化时的图标:在资源视图-->icon文件夹上右键菜单点击插入资源,在弹出窗口中选择icon,然后导入资源,选择两个不相同的图标(ico)文件,在属性窗口中修改资源ID;修改窗口类注册处的两个LoadIcon 函数中的ID,编译运行,观察左上角的图标和最小化的图标。
专业课程实验报告课程名称:windows程序设计开课学期: 2015至2016 学年第1学期专业:计算机科学与技术年级班级:2013级学生姓名:刘敏学号:222013*********实验教师:刘红俊计算机与信息科学学院软件学院wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT2);2.对话框资源及其应用:1)模式对话框:①定义对话框资源:资源文件中如此定义对话框资源:对话框名 DIALOGEX x,y,weight,hightSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION ""FONT 9, ""BEGIN对话框的控件定义END②调用函数DiaLogBox显示对话框;③构造对话框消息处理函数;④关闭对话框。
2)非模式对话框:①定义非模式对话框:STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |WS_SYSMENU|WS_VISIBLE②创建对话框函数:HWND CreateDialog{hInst, MAKEINTRESOURCE(IDD_SHOWBOX),hWnd,(DLGPROC)DlgProc}③消息循环:while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}④关闭对话框:DestroyWindow(hDlg);3)程序加载图标:IDI_WIN32PROJECT2 ICON "Win32Project2.ico"IDI_SMALL ICON "small.ico"(三)程序代码:Win32Project2.cpp// Win32Project2.cpp : 定义应用程序的入口点。
win32 winmain 例子Win32 WinMain 例子什么是 Win32 WinMain?WinMain是一个用于创建 Windows 桌面应用程序的主函数。
它是一个程序的入口点,并负责初始化应用程序的状态,创建和显示主窗口,以及响应系统的消息。
示例 1:创建一个空白的窗口下面是一个简单的示例,演示了如何使用 Win32 API 创建一个空白的窗口:#include <>LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevI nstance, LPSTR lpCmdLine, int nCmdShow){const char CLASS_NAME[] = "Sample Window Class";const char WINDOW_TITLE[] = "Win32 Sample";// 注册窗口类WNDCLASS wc = { };= WndProc;= hInstance;= CLASS_NAME;RegisterClass(&wc);// 创建窗口HWND hwnd = CreateWindowEx(0, // 扩展窗口样式CLASS_NAME, // 窗口类名WINDOW_TITLE, // 窗口标题WS_OVERLAPPEDWINDOW, // 窗口样式CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_ USEDEFAULT, // 窗口位置和尺寸NULL, // 父窗口句柄NULL, // 菜单句柄hInstance, // 应用程序实例句柄NULL // 创建窗口时的额外数据);if (hwnd == NULL) {return 0;}// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return ;}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam){switch (msg){case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, msg, wParam, lParam);}示例 2:处理窗口消息以下是一个稍微复杂一些的示例,演示了如何处理窗口消息:#include <>// 窗口过程函数LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevI nstance, LPSTR lpCmdLine, int nCmdShow){const char CLASS_NAME[] = "Sample Window Class";const char WINDOW_TITLE[] = "Win32 Sample";// 注册窗口类WNDCLASS wc = { };= WndProc;= hInstance;= CLASS_NAME;RegisterClass(&wc);// 创建窗口HWND hwnd = CreateWindowEx(0, // 扩展窗口样式CLASS_NAME, // 窗口类名WINDOW_TITLE, // 窗口标题WS_OVERLAPPEDWINDOW, // 窗口样式CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_ USEDEFAULT, // 窗口位置和尺寸NULL, // 父窗口句柄NULL, // 菜单句柄hInstance, // 应用程序实例句柄NULL // 创建窗口时的额外数据);if (hwnd == NULL) {return 0;}// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return ;}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam){// 自定义窗口消息处理switch (msg){case WM_CREATE:MessageBox(hwnd, "窗口创建", "消息", MB_OK); return 0;case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps);// 绘制文本RECT rect;GetClientRect(hwnd, &rect);DrawText(hdc, "Hello, Win32!", -1, &rect, DT _CENTER | DT_VCENTER | DT_SINGLELINE);EndPaint(hwnd, &ps);return 0;}case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, msg, wParam, lParam);}这个示例演示了如何在窗口创建时显示一个消息框,并在窗口绘制时绘制一段文本。
VS2019使⽤Windows桌⾯应⽤程序模块创建Win32窗⼝本⽂介绍了VS2019使⽤Windows桌⾯应⽤程序模块创建Win32窗⼝,分享给⼤家,具体如下:头⽂件Project1.h:#pragma once#include "resource.h"实现⽂件Project1.cpp:// Project1.cpp : 定义应⽤程序的⼊⼝点。
//#include "framework.h"#include "Project1.h"#define MAX_LOADSTRING 100// 全局变量:HINSTANCE hInst; // 当前实例WCHAR szTitle[MAX_LOADSTRING]; // 标题栏⽂本 16位双字节字符WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗⼝类名// 此代码模块中包含的函数的前向声明:ATOM MyRegisterClass(HINSTANCE hInstance); //返回unsigned short 2字节整数BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //返回long 4字节整数作地址INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); //返回int 4字节整数作地址int APIENTRY wWinMain(_In_ HINSTANCE hInstance, /*typedef void *HINSTANCE;句柄是⼀个⼆级指针*/_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine, /*wchar_t *LPWSTR 指向16位UNICODE宽字符的指针*/_In_ int nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// TODO: 在此处放置代码。
Win32编程⼊门Win32 程序开发的流程message based, event drivenWin32程序是message based, event driven。
也就是说Win32程序的运⾏是依靠外部不断发⽣的事件来驱动的,也就是说,程序不断等待(有⼀个while循环),等待任何可能的输⼊,然后做判断,再做适当的处理。
因此Win32程序只需要做好如下⼏件事情就可以了:1. 定义窗⼝的外观;2. 定义当不同的事件发⽣时,程序做什么样的反应(定义窗⼝处理函数);3. 写⼀个While循环,不断检测新事件的发⽣,并将其发送给不同的窗⼝处理函数程序进⼊点WinMainmain是⼀般C程序的进⼊点:int main( int argc, char *argv[], char *envp[])Win32程序的进⼊点是int CALLBACK WinMain( __in HINSTANCE hInstance, __in HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nCmdShow);当⽤户要执⾏⼀个程序时,⾸先是Windows 的Shell(Explorer)调⽤CreateProcess这个系统调⽤,CreateProcess为这个进程创建虚拟地址,然后将代码和数据载⼊,然后系统再创建⼀个主线程开始执⾏run time startup函数的代码,run time startup 函数会最终调⽤⼊⼝点函数(main, WinMain)。
如果⽤户执⾏的是⼀个Win32程序,那么C startup就会调⽤WinMain并开始执⾏程序。
窗⼝类注册与窗⼝诞⽣如果前⾯所说,Win32的⼀个重要的责任是定义窗⼝外观和窗⼝处理函数。
这是通过窗⼝类注册来完成的。
创建窗⼝可以使⽤CreateWindow来完成,但在调⽤CreateWindow时必须先设定窗⼝的各种属性和⾏为。
Window 窗口层次关系相信在Window 下面编程的很多兄弟们都不是很清楚Window 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下。
下面就说说Window 中桌面(Deskkop)以及顶层窗口,以及子窗口之间的关系。
在Window 的图形界面下,最基本显示信息的元素就是窗口,每一个Window 窗口都管理着自己与其他窗口之间的关系和自身的一些信息,如:是否可见,窗口的所有者,窗口的父/子关系等等信息,当窗口创建、销毁、显示的时候,就会用到这些信息。
在每一个窗口实例中,有四个元素被窗口管理器用来建立窗口管理链表。
∙Child :指向窗口子窗口的句柄∙Parent:指向窗口父窗口的句柄∙Owner:指向窗口所有者的句柄∙Next:指向下一个同属窗口的句柄众所周知当Window 初始化的时候,它创建桌面这个窗口,桌面覆盖着整个窗口,窗口管理器用这个窗口作为窗口链表中第一个元素。
因此桌面在窗口的层次关系中在最上层。
在窗口层次关系中,桌面窗口下一层窗口叫做顶层窗口,顶层窗口就是那些不是子窗口的窗口,顶层窗口不能够有WS_CHILD 属性。
窗口管理器是如何把桌面窗口和顶层窗口联系起来的呢?窗口管理器把顶层窗口都组织到一个链表中,而这个链表的头存储的就是桌面窗口的子窗口句柄,每一个子窗口通过Next 就可以找到链表中下一个窗口了。
这个链表被称为子窗口链表,在同一个子窗口链表中的窗口是互为同属窗口,所有顶层窗口都是同属窗口。
窗口在子窗口链表中的次序,也表明了窗口距离距离桌面窗口的距离。
顶层窗口所形成的子窗口链表构成了一个Z 轴,窗口管理器就是根据Z 序列来觉得窗口的哪一部分是显示的,哪一部分是被遮盖的。
所有顶层窗口的父窗口都是指向桌面窗口的,这样一来顶层窗口就好像是桌面窗口的子窗口,所有顶层窗口构成的链表是桌面窗口的子窗口链表。
当顶层窗口创建的时候,窗口管理器把顶层窗口放在Z 轴的顶上,这样使得整个窗口可见,窗口管理器把窗口插入到桌面窗口子窗口链表的前面。
WS_EX_TOPMOST 这个属性控制着窗口管理器创建顶层窗口,窗口管理器把没有WS_EX_TOPMOST 属性的窗口放在具有WS_EX_TOPMOST 属性的窗口的后面,这样就使得具有WS_EX_TOPMOST 属性的窗口一直显示在前面。
在顶层窗口之间还有另外一直关系,拥有或者属于其他的顶层窗口,属于其他窗口的窗口叫做归属窗口,拥有其他窗口叫做宿主窗口,在Z 轴中,归属窗口一定在他的宿主窗口的前面,如果一个宿主窗口最小化,那么归属他的窗口会隐藏掉,如果宿主窗口隐藏起来,归属他的窗口不会被隐藏掉。
如果有三个窗口A、B、C ,A 拥有B,B 拥有 C ,如果A 最小化,那么B 会隐藏,但是C 还是可见的。
怎么才能够在窗口之间建立所有关系呢?方法是在调用CreateWindow或者CreateWindowEx 创建窗口的时候,指定hwndParent参数。
桌面窗口是在窗口层次中的第一层,顶层窗口在窗口层次中的第二层,子窗口也就是那些创建的时候指定了WS_CHILD 属性的窗口占据了窗口层次的其他层。
窗口和子窗口之间的联系,就像桌面窗口和顶层窗口之间的关系一样。
子窗口显示在其父窗口的客户区域,所有同一个窗口的子窗口同样建立一个Z 轴,这个和顶层窗口是类似的,顶层窗口也是显示在其父窗口――桌面窗口的客户区域。
16 位和32 位窗口系统的区别窗口之间的父子关系、归属所有关系、以及根据Z 轴来显示的这些规则在16 位和32 位窗口系统中都是相同的。
这样可以是在两种窗口系统中高度的兼容。
两种窗口系统的区别在于安全和多线程。
Window Nt 在原有的窗口层次关系中多增加了一层,每一个运行着Window NT 的系统中都有一个Window 工作站对象,这个对象是安全对象的第一层,是所有用户安全对象的继承之源,每一个Window 工作站对象可以拥有一些桌面对象,每一个桌面都拥有上面描述的那样的窗口关系。
Window Nt 用了两个桌面窗口对象,一个是用来处理登陆界面、屏蔽、锁住工作站等,一个是我们登陆之后进来操作的窗口了。
通常用户是不能够创建和删除桌面的,不过那是通常,实际上在Window 下面也可以实现类似Linux 中的多个桌面的效果,每一个桌面都是一个独立的世界。
两种窗口系统还有两位一个区别,在16 位窗口系统中不支持多线程,所以应用程序开发者在创建窗口的时候不必考虑线程的问题了。
而在32 位窗口系统中由于又支持了窗口的父子关系,归属与拥有关系,同一个窗口下面的所有线程都拥有相同的一个输入队列,应用程序开发者应该明白输入队列是共享的,在同一个时刻只能有一个线程处理消息,其他的线程都在等待输入队列一直到GetMessage 或者PeekMessage 返回,而且必须注意的是父窗口和子窗口或者是归属与拥有窗口共用同一个线程。
在32 窗口系统中定义两种新的窗口类型,前台窗口和背景窗口,这两种窗口没有列到窗口的层次关系中,前台窗口就是用户当前操作的窗口,其他的所有窗口都是背景窗口。
32 位窗口系统中支持两个函数来处理前台窗口SetForegroundWindow和GetForegroundWindow。
操作窗口列表下面是窗口列表操作的一些函数:EnumChildWindows使用这个函数得到一个窗口的所有子窗口,包括子窗口的子窗口。
不过在列举的过程中这个函数不能够列出正在创建的或者销毁的窗口。
EnumThreadWindows使用这个函数可以列出所有属于这个线程的窗口。
在这个函数调用之后创建的窗口是不能够被列举出来的。
EnumWindows使用这个函数列举出所有顶层窗口,不能够列举出子窗口,要列出所有的顶层窗口,使用这个函数比GetWindow安全。
使用GetWindow 来列出所有的窗口,可能会导致程序无限循环,因为在调用GetWindow 的过程中,可能一些窗口已经销毁了。
EnumWindows 不能够列举出调用这个函数之后创建的顶层窗口。
FindWindow可以使用这个函数通过类名或者使用窗口的标题来找到顶层窗口,这个函数不能够用来找子窗口,这个函数不区分参数的大小写。
这个函数在Z轴中寻找窗口,找到了之后,就会返回。
GetDesktopWindow得到桌面窗口句柄GetNextWindow使用这个函数得到这个窗口的同属窗口,在16 位窗口系统中GetNextWindow 和GetWindow 是两个不同的函数,在32 位系统中这个函数是通过GetWindow 来实现的。
GetParent如果一个窗口存在父窗口,那么可以通过这个函数得到窗口的父窗口,如果窗口是顶层窗口,则返回其所有者窗口句柄。
GetThreadDesktop这个函数用来得到指定线程的所属的桌面窗口句柄,在win95 和win98 下面由于不支持多桌面,每次调用该函数都返回同一个值。
GetTopWindow可以用这个函数来得到给定窗口的第一个子窗口的句柄,如果传递给函数的参数是NULL 的话,那么这个函数将会返回最上面的顶层窗口。
GetWindow应用程序可以调用这个函数来在窗口列表中导航,这个函数有两个参数,一个是窗口的句柄,另外是要得到的窗口句柄和这个窗口之间的关系。
∙GW_HWNDNEXT:这个函数返回给定窗口的下一个同属窗口∙GW_HWNDFIRST:返回给定窗口的前一个同属窗口∙GW_HWNDLAST:返回给定窗口的最后一个同属窗口∙GW_HWNDPREV:返回给定窗口的第一个同属窗口∙GW_OWNER:返回给定窗口的所有者窗口句柄GW_CHILD:返回给定窗口的第一个子窗口句柄IsChild这个函数有两个参数,两个窗口句柄,判断两个窗口是否存在父子关系窗口的属性当应用程序调用CreateWindow 创建窗口的时候,我们必须为窗口指定属性,下面简要的介绍一下窗口的属性。
WS_OVERLAPPED交迭属性是顶层窗口的一种属性,使用这种属性创建的窗口,会被链接到桌面窗口的子窗口链表中,应用程序通常使用这种属性的窗口作为应用程序的主窗口,具有交迭属性的窗口通常具有有标题栏,即使是WS_CAPTION 这个属性没有指定。
具有交迭属性的窗口通常都是有边框的,具有交迭属性的窗口可以拥有自己的顶层窗口,也可以所属其他的顶层窗口,所有的这类窗口都具有WS_CLIPSIBLINGS 属性,即使是没有给窗口指定这个属性。
WS_POPUP弹出属性也是应用到顶层窗口的一种属性,使用这种属性创建的窗口会被链接到桌面窗口的子窗口链表中,应用程序通常为对话框窗口设置这个属性,弹出属性和交迭属性的主要区别在于具有弹出属性的窗口不是一定要有标题栏的,而具有交迭属性的窗口则是一定要具有标题栏,具有弹出属性的窗口可以没有边框。
和具有交迭属性的窗口一样,具有弹出属性的窗口可以有自己的顶层所属窗口,也可以所属其他的顶层窗口。
所有具有弹出属性的窗口必须具有WS_CLIPSIBINGS 属性,即使是用户没有指定这个属性。
具有弹出属性的窗口在创建的时候,它的大小和位置不能够使用CW_USEDEFAULT 值。
WS_CHILD子窗口必须具有这个属性,子窗口只能够出现在父窗口的客户区域,这是子窗口和具有交迭属性的窗口以及弹出属性的窗口的主要区别,创建子窗口的时候,位置和大小不能够使用CW_USEDEFAULT 这个值,否则是不能够创建窗口的。
WS_CAPTION当窗口被设置这个属性的时候,窗口的最上头会有标题栏,应用程序可以通过SetWindowText 这个函数来改变标题栏的标题,通常具有标题栏的窗口还具有最大、最小、关闭按钮,和系统菜单。
如果一个窗口没有标题栏,那么Window 是不会创建这些东西的,即使是用户指定了这些属性,系统菜单是依赖标题栏窗口的存在而存在的,如果没有标题栏那么是一定不会有系统菜单的存在的。
具有标题栏的窗口通常具有单线的边界具有可以改变窗口大小的属性,通常具有标题栏的窗口是不能具有对话框的边界属性的,除非为窗口设置WS_EX_DLGMODALFRAME 属性。
WS_MINIMIZEBOX当为窗口设置这个属性的时候,窗口的标题栏上会有一个最小化的按钮,其实对于Window 来实现这个属性的时候,只是在标题栏上面放置了一个最小化的位图,当用户点击这个最小化位图的时候,窗口最小化,如果最大化位图最在,那么最小化位图被放置在最大化位图的左边。
没有这个属性的窗口是不能够最小化的。
WS_MAXIMIZEBOX当为窗口设置这个属性的时候,窗口的标题栏的右上会被放置一个最大化的位图,如果窗口设置了这个属性,用户可以点击最大化的位图或者是通过系统菜单来实现窗口的最大化,没有这个属性的窗口是不能够被最大化的。