标签:这一 ges wow ast 系统资源 parameter activate 替换 所有应用
窗口
在图形化的基于win32的应用程序,窗口是屏幕的矩形区域,应用程序显示输出并接收来自用户的输入,因此,一个图形化基于win32的应用程序的首要任务之一就是创建一个窗口。
窗口与其它窗口共享屏幕,[本事]包括来自其它应用程序的窗口,每次只有一个窗口可以接收来自用户的输入,用户可以使用鼠标、键盘或其它输入设备与此窗口以及拥有该窗口的应用程序进行交互。
关于窗口
这个概述描述了应用程序用来创建和使用窗口的编程单元;管理窗口之间的关系;以及大小、移动、和显示窗口;概述包括以下主题:
当你启动系统时,它自动创建桌面窗口。桌面窗口时一个系统定义的窗口,它描绘了屏幕的背景,并作为所有应用程序显示的所有窗口的基础。
桌面窗口使用位图来描绘屏幕的背景。由位图创建的图案成为桌面墙纸。默认情况下,桌面窗口使用位图来自在注册表中指定的a.BMP作为桌面壁纸。
一个系统配置应用程序,例如一个控制面板小程序,使用GetDesktopWindow函数返回桌面窗口的句柄。使用SystemParametersInfo函数通过wAction参数设置为SIP_SETDESKWALLPAPER和lpvParam参数指定一个位图文件名改变桌面墙纸。SystemParametersInfo然后从指定的文件中加载位图,使用位图来绘制屏幕的背景,并在注册表输入新的文件名。
每个图形化的基于win32应用程序至少创建一个窗口,成为主窗口,它充当用户和应用程序之间的主要接口。大部分应用程序也或直接或间接地创建其它窗口,以执行与主窗口相关的任务。每个窗口在显示输出和接收来自用户的输入起作用。
当你启动一个应用程序,系统还会将一个任务栏按钮与应用程序关联起来。任务栏按钮包含程序图标和标题。当应用程序处于活动状态时,它的任务栏按钮以推送状态显示。
本节包含以下主题:
应用程序窗口的组件
应用程序窗口包括元素,像标题栏,菜单栏,窗口菜单(以前成为系统菜单),最小化按钮,最大化按钮,恢复按钮,关闭按钮,大小边框,客户区域,水平滚动条,和垂直滚动条。一个应用程序的主窗口通常包括所有这些组件。下面的插图显示了在一个典型的主窗口的这些组件。
标题栏显示一个应用程序定义的图标和文本行;通常,文本指定应用程序的名称或表示窗口的目的。在创建窗口时,应用程序指定图标和文本。标题栏也让用户使用鼠标或者其它指针设备来移动窗口。
大部分应用程序包含一个菜单栏列出应用程序所支持的命令,菜单栏中的项目表示命令的主要类别。点击菜单栏上的一个条目,通常会打开一个弹出菜单,它的条目对应一个给定类别中的任务,通过点击一个命令,用户指导应用程序执行任务。
窗口菜单由系统创建和管理。它包含一组标准的菜单项,当用户选择它时,设置窗口的大小或位置,关闭应用程序,或执行任务,了解更多信息,参阅菜单。
当你点击最大化或最小化按钮,这影响窗口的大小和位置。当你点击最大化按钮,系统放大窗口到屏幕大小,定位窗口的位置,因此它会覆盖整个桌面,减去任务栏。与此同时,系统用恢复按钮替换最大化按钮。恢复按钮时一个位图,当点击它时,恢复窗口到它原来的大小和位置。
当用户点击最小化按钮,系统缩小窗口到它任务栏的大小,将窗口放在任务栏按钮位置上,并以正常状态显示任务栏按钮。要恢复应用程序到以前的位置和大小,点击任务栏按钮。
大小边界是窗口周边的一个区域,允许用户能使用鼠标或指向设备调整窗口大小。
客户端区域时应用程序显示输出的窗口的一部分,像文本或图形。例如,桌面发布应用程序在客户端区域显示文档的当前页面。应用程序需提供一个函数,称窗口过程,以处理到窗口的输入和在客户区域的显示输出。更多信息,看窗口过程。
水平滚动条和垂直滚动条转换鼠标或键盘的输入成值,应用程序用以水平或垂直移动客户区域的内容。例如,一个显示冗长文档的文字处理应用程序通常提供一个垂直滚动条,使用户能在文档中上下翻页。
标题栏,菜单栏,窗口菜单,最小化和最大化按钮,大小边框和滚动条,被提及的所有作为窗口的非客户区域。系统管理非客户区域的大部分方面;应用程序管理窗口的所有其它。尤其是,每一个应用程序管理其客户端区域的外观和行为。
控件、对话框和消息框
除了主窗口,应用程序还使用几种类型的窗口,包括控件、对话框、消息框。
一个控件时一个窗口,应用程序用来从用户获取指定信息,例如打开文件的名称或者文本选择的所需点大小。应用程序还使用控件获取控制应用程序特定特性所需的信息。例如,一个字处理应用程序常提供一个控件让用户打开或关闭自动换行。更多信息,参阅控件。
控件总是与另一个窗口一起使用-通常是一个对话框。一个对话框时一个包含一个或多个控件的窗口。应用程序使用对话框提示用户完成一个命令所需的输入。例如,应用程序包含一个打开文件的命令,将显示一个对话框,包含一个用户指定路径和文件名的控件。
消息框时一个窗口,显示提示,注意,或警告给用户。例如,一个消息框可以通知用户应用程序执行任务时遇到的一个问题。
对话框和消息框通常不使用与主窗口相同的一套窗口组件。大多数都有标题栏,一个窗口菜单,一个边框(不改变大小),和一个客户端区域,但是它们通常没有菜单栏,最小和最大按钮,或者滚动条。更多信息,参阅对话框。
窗口的Z顺序表示窗口在一堆重叠窗口中的位置。这个窗口堆栈朝向沿着一个虚拟轴,z轴,从屏幕向外延伸。Z顺序顶部的窗口覆盖所有的其它窗口。Z顺序底部的窗口被所有的窗口重叠。
系统在一个列表中维护Z顺序,它添加窗口到Z顺序基于是否它们是最顶层窗口,顶层窗口或者子窗口。一个最顶层窗口覆盖所有的非最顶层窗口,不管它时活动的还是前台的窗口。一个最顶层窗口有WS_EX_TOPMOST样式,所有的最顶层窗口在Z顺序里出现在任何非最顶层窗口之前,一个子窗口在Z顺序里和它父窗口分组。
当应用程序创建一个窗口时,系统将其置于同类型窗口的Z顺序的顶部。你可以使用BringWindowToTop函数将一个窗口带到同类型窗口Z顺序的顶部,你能使用SetWindowPos和DeferWindowPos函数重新排列Z顺序。
用户通过激活一个不同的窗口来更改Z顺序,系统放置活动窗口在相同类型窗口的Z顺序顶部,当一个窗口出现在Z顺序的顶部时,它的子窗口也是如此。你能使用GetTopWindow函数搜索父窗口的所有子窗口,并返回一个在Z顺序中最高的子窗口的句柄,GetNextWindow函数检索在Z顺序中的下一个或前一个窗口。
应用程序创建其窗口(包括主窗口),使用CreateWindow或CreateWindowEx函数,并提供定义窗口属性所需的信息。CreateWindowEx有一个参数dwExStyle,CreateWindow没有,否则函数相同,事实上,CreateWindow设置dwExStyle参数为0简单调用CreateWindowEx。由于这个原因,本文其余部分仅引用CreateWindowEx。
还有其它函数,包括DialogBox,CreateDialog,和MessageBox,用于创建指定用途的窗口,像对话框和消息框。要了解更多信息,看对话框。
本节包含以下主题:
窗口的属性
应用程序在创建窗口时必须提供以下的信息:
窗口句柄
创建窗口之后,创建函数返回一个窗口句柄唯一的标识窗口。应用程序使用这个句柄在另一个函数指示操作到该窗口。一个窗口句柄有HWND数据类型;在声明一个变量存储窗口值时,应用程序必须使用这个值。
有一些专门的常量在某些函数能替换窗口句柄。例如,应用程序在SendMessage和SendMessageTimeout函数能使用HWND_BROADCAST,或者在MapWindowPoints函数使用HWND_DESKTIP。
尽管NULL常量不是窗口句柄,在一些函数你能使用它指定没有窗口被影响。例如,为CreateWindowEx函数的hwndParent参数使用NULL创建没有父窗口或拥有者的窗口,为MessageBox函数的hWnd参数指定NULL创建一个没有拥有者的消息框。一些函数可能返回的实例句柄为NULL,表明给定的操作不使用与任何窗口。
应用程序可以使用FindWindow函数发现是否在系统中存在指定类名或窗口名的窗口存在。如果存在这样一个窗口,FindWindow返回窗口句柄。限制搜索指定应用程序的子窗口,使用FindWindowEx函数。IsWindow函数判断是否一个窗口句柄标识一个有效的存在的窗口。
创建主窗口
每个基于win32的应用程序必须有WinMain作为它的入口点函数。WinMain执行许多任务,包括为主窗口注册窗口类和创建主窗口。WinMain调用RegisterClass函数注册主窗口类,调用CreateWindowEx函数创建主窗口。
可移植性问题入口点不需要命名为WinMain。
你的WinMain函数也能限制你的应用程序为单一实例。创建一个命名互斥锁使用CreateMutex函数,如果GetLastError返回ERROR_ALREADY_EXISTS,你的应用程序的另一个实例存在(它创建了互斥锁),你应该退出WinMain。
系统不能创建主窗口之后自动的显示它,相反,应用程序必须使用ShowWindow函数显示主窗口。创建主窗口之后,应用程序的WinMain函数调用ShowWindow,传递它两个参数:一个主窗口句柄和一个标识指定是否主窗口应该被最小或最大化,当它第一次被显示时。通常,标识能被设置为任何以SW_前缀开头的常量。然而,当ShowWindow被调用以显示应用程序的主窗口,标识必须被设置为SW_SHOWDEFAULT,这个标识告诉系统根据启动应用程序的应用定向的显示窗口。
如果窗口类被RegisterClass的Unicode版本注册,那窗口只接收Unicode消息。要确定窗口是否使用了Unicode字符集,调用IsWindowUnicode。
窗口创建消息
在创建任何窗口时,系统发送消息给窗口的窗口过程。系统发送WM_NCCREATE消息在正创建窗口非客户区域之后和发送WM_CREATE在正创建客户区域之后。窗口过程接收到两个消息在显示窗口之前。两个消息都包含指针到CREATESTRUCT结构,包括CreateWindowEx函数指定的所有信息。通常,窗口过程执行初始化任务在接收到这些消息。
当在创建一个子窗口时,系统发送WM_PARENTNOTIFY消息给父窗口在发送WM_NCCREATE和WM_CREATE消息,在创建窗口时还发送其它消息。这些消息的数量和顺序取决于窗口类和样式以及用于创建窗口的函数。这些消息在这个帮助文件的其它主题中描述。
多线程应用程序
一个基于win32的应用程序能有多个执行线程,每个线程能创建窗口。创建窗口的线程必须包含它的窗口过程代码。
一个应用能使用EnumThreadWindows函数来枚举被一个特定线程创建的窗口。这个函数传递到每个线程窗口的句柄依次给应用程序定义的回调函数EnumThreadWndProc。
GetWindowThreadProcessId函数返回创建指定窗口的线程的标识。
要设置由另一个线程创建的窗口的状态使用ShowWindowAsync函数。
有一般的窗口样式和类指定的窗口样式。一般窗口样式以WS_前缀开头的常量表示,它们能用OR操作符组合构成不同的类型的窗口,包括主窗口,对话框,和子窗口。类指定的窗口样式定义了属于预定义控件类的窗口的外观和行为,例如编辑控件和列表框。
应用程序通常设置窗口的样式在创建窗口时,它也可以设置窗口的样式在创建窗口之后用SetWindowLong函数。
本节包含下面主题:
子窗口有WS_CHILID样式,并且被限制到父窗口的客户端区域。应用程序使用子窗口划分父窗口的客户端区域为功能区域。你指定WS_CHILD样式在CreateWindowEx函数中创建子窗口。
子窗口必须有父窗口。父窗口可以时重叠窗口,团出窗口,甚至时另一个子窗口。当你调用CreateWindowEx时指定父窗口。如果你指定了WS_CHILD样式在CreateWindowEx,但是没有指定父窗口,系统不创建窗口。
子窗口有客户端区域,但没有其它特性,除非它们被显示的请求。一个应用程序可以为子窗口请求一个标题栏,一个窗口菜单,最小化和最大化按钮,一个边框,和滚动条。但是子窗口不能有菜单。如果应用程序指定了菜单句柄,在它注册子窗口类或创建子窗口时,菜单句柄被忽略。
定位
系统总是定位一个子窗口相对于父窗口客户端区域的左上角。子窗口任何部分永远不会出现在它父窗口的边界之外。如果一个应用程序创建了一个子窗口,大于父窗口或者定位子窗口的一些或所有延伸超过父窗口的边界。系统剪辑子窗口;也就是说,在父窗口客户端区域之外的部分不被显示。影响父窗口的操作也会影响子窗口,如下。
父窗口 子窗口
销毁 父窗口被销毁之前销毁
隐藏 父窗口被隐藏之前被隐藏,子窗口仅在父窗口可见时可见
移动 和父窗口客户端区域移动移动,子窗口负责绘制它的客户端区域在移动之后
显示 在父窗口显示之后显示
剪裁
系统不会自动的从父窗口的客户端区域剪辑一个子窗口。这意味着如果它任何和子窗口在相同位置绘制父窗口绘制在子窗口之上。然而,如果父窗口有WS_CLIPCHILDREN,系统从父窗口客户区域剪辑子窗口。如果子窗口被剪辑,父窗口不能绘制在它上面。
子窗口可以在相同的客户端区域重叠其它子窗口,和一个或多个其它子窗口共享父窗口的子窗口叫兄弟窗口,兄弟窗口在每一个其它的窗口客户端区域绘制,除非一个子窗口有WS_CLIPSIBLINGS样式,如果一个子窗口有这个样式,它兄弟窗口的任何部分在子窗口内部的被裁剪。
如果窗口有WS_CLIPCHILIDREN或WS_CLIPSIBLINGS样式,轻微的性能损失,每一个窗口都占用系统资源,因此应用程序不应该不加选择的使用子窗口,为了更好的性能,应用程序需要逻辑上划分它的主窗口,这样做应该在主窗口过程中而不是使用子窗口。
父窗口的关系
应用程序可以调用SetParent函数改变现有的子窗口的父窗口。在这种情况下,系统从旧父窗口的客户端区域移除子窗口,移动到新父窗口的客户端区域。如果父窗口指定为NULL句柄。桌面窗口时新父窗口。在在这种情况,子窗口被绘制在桌面上,在任何其它窗口的边框之外。GetParent函数检索子窗口的父窗口句柄。
父窗口放手客户端区域的一部分给子窗口,子窗口从这个区域接收所有的输入。父窗口的每个子窗口的窗口类不需要一样。意思时,应用程序能看起来不同和执行不同任务的子窗口填充父窗口。例如,对话框能包含许多不同类型的控件,每个子窗口接收不同类型的用户数据。
子窗口只有一个父窗口,但是父窗口可以有许多子窗口。每个子窗口,同样能有子窗口。在这个窗口链中,每个子窗口被叫作原始父窗口的子孙窗口,应用程序使用IsChild函数发现给定的窗口时给定的父窗口的子窗口还是子孙窗口。
EnumChildWindows函数枚举父窗口的子窗口。然后,EnumChildWindows传递每个子窗口的句柄给应用程序定义的回调函数。还枚举给定父窗口的子孙窗口。
消息
系统传递一个子窗口的输入消息直接给子窗口;消息没有通过父窗口传递。唯一的例外时,如果子窗口已经被EnableWindow函数禁用了。在这种情况,系统传递原给子窗口的任何输入消息给父窗口。这允许父窗口检查输入消息,如果需要并启用子窗口。
子窗口可以有一个唯一的标识符。在使用控制窗口时,子窗口标识符时终于的。应用程序发送消息指导控件的活动。应用程序使用控件子窗口标识符指导发往控件的消息。此外,一个控件发送通知消息到它的父窗口。通知消息包含控件的子窗口标识符,父窗口通过标识符识别哪个控件发送的消息。应用程序给其它类型的子窗口指定子窗口标识符,借助设置CreateWindowEx函数的hMenu参数一个值而不是一个菜单句柄。
HINSTANCE hinst; HWND hwndMain; // Create the main window. hwndMain = CreateWindowEx( 0, // no extended styles "MainWClass", // class name "Main Window", // window name WS_OVERLAPPEDWINDOW | // overlapped window WS_HSCROLL | // horizontal scroll bar WS_VSCROLL, // vertical scroll bar CW_USEDEFAULT, // default horizontal position CW_USEDEFAULT, // default vertical position CW_USEDEFAULT, // default width CW_USEDEFAULT, // default height (HWND) NULL, // no parent or owner window (HMENU) NULL, // class menu used hinstance, // instance handle NULL); // no window creation data if (!hwndMain) return FALSE; // Show the window using the flag specified by the program // that started the application, and send the application // a WM_PAINT message. ShowWindow(hwndMain, SW_SHOWDEFAULT); UpdateWindow(hwndMain);
注意,在创建主窗口之后,前面的示例调用ShowWindow函数,这样做因为系统不自动的显示主窗口在创建之后。传递SW_SHOWDEFAULLT标志给ShowWindow,应用程序允许启动应用程序的程序设置主窗口的初始状态。UpdateWindow函数向窗口发送它的第一个WM_PAINT消息。
创建枚举,和大小子窗口#define ID_FIRSTCHILD 100 #define ID_SECONDCHILD 101 #define ID_THIRDCHILD 102 LONG APIENTRY MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { RECT rcClient; int i; switch(uMsg) { case WM_CREATE: // creating main window // Create three invisible child windows. for (i = 0; i < 3; i++) { CreateWindowEx( 0, "ChildWClass", (LPCTSTR) NULL, WS_CHILD | WS_BORDER, 0,0,0,0, hwnd, (HMENU) (int) (ID_FIRSTCHILD + i), hinst, NULL); } return 0; case WM_SIZE: // main window changed size // Get the dimensions of the main window‘s client // area, and enumerate the child windows. Pass the // dimensions to the child windows during enumeration. GetClientRect(hwnd, &rcClient); EnumChildWindows(hwnd, EnumChildProc, (LPARAM) &rcClient); return 0; // Process other messages. } return DefWindowProc(hwnd, uMsg, wParam, lParam); } BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) { LPRECT rcParent; int i, idChild; // Retrieve the child-window identifier. Use it to set the // position of the child window. idChild = GetWindowLong(hwndChild, GWL_ID); if (idChild == ID_FIRSTCHILD) i = 0; else if (idChild == ID_SECONDCHILD) i = 1; else i = 2; // Size and position the child window. rcParent = (LPRECT) lParam; MoveWindow(hwndChild, (rcParent->right / 3) * i, 0, rcParent->right / 3, rcParent->bottom, TRUE); // Make sure the child window is visible. ShowWindow(hwndChild, SW_SHOW); return TRUE; }
case WM_CLOSE: // Create the message box. If the user clicks // the Yes button, destroy the main window. if (MessageBox(hwnd, szConfirm, szAppName, MB_YESNOCANCEL) == IDYES) DestroyWindow(hwndMain); else return 0; case WM_DESTROY: // Post the WM_QUIT message to // quit the application terminate. PostQuitMessage(0); return 0;
标签:这一 ges wow ast 系统资源 parameter activate 替换 所有应用
原文地址:http://www.cnblogs.com/klxll/p/7071834.html