О Windows

В этом разделе описываются элементы программирования, используемые приложениями для создания и использования окон; управление связями между окнами; и размер, перемещение и отображение окон.

Обзор включает следующие разделы.

Окно рабочего стола

При запуске системы автоматически создается окно рабочего стола. Окно рабочего стола — это определенное системой окно, которое закрашивает фон экрана и служит основой для всех окон, отображаемых всеми приложениями.

В окне рабочего стола используется растровое изображение для рисования фона экрана. Узор, созданный растровым рисунком, называется фоном рабочего стола. По умолчанию в окне рабочего стола используется растровое изображение из файла .bmp, указанного в реестре в качестве обоев рабочего стола.

Функция GetDesktopWindow возвращает дескриптор в окно рабочего стола.

Приложение конфигурации системы, например элемент панель управления, изменяет обои рабочего стола с помощью функции SystemParametersInfo с параметром wAction, равным SPI_SETDESKWALLPAPER, а параметр lpvParam задает имя файла растрового изображения. SystemParametersInfo затем загружает растровое изображение из указанного файла, использует растровое изображение для рисования фона экрана и вводит новое имя файла в реестре.

Windows приложений

Каждое графическое приложение windows создает по крайней мере одно окно, называемое окном main, которое служит основным интерфейсом между пользователем и приложением. Большинство приложений также напрямую или косвенно создают другие окна для выполнения задач, связанных с окном main. Каждое окно играет определенную роль в отображении выходных данных и получении входных данных от пользователя.

При запуске приложения система также связывает кнопку панели задач с приложением. Кнопка панели задач содержит значок и заголовок программы. Когда приложение активно, его кнопка панели задач отображается в состоянии pushed.

Окно приложения содержит такие элементы, как заголовок окна, строка меню, меню окна (прежнее название — системное меню), кнопка свернуть, кнопка развертывания, кнопка восстановления, кнопка закрытия, граница размера, клиентская область, горизонтальная полоса прокрутки и вертикальная полоса прокрутки. Окно main приложения обычно включает все эти компоненты. На следующем рисунке показаны эти компоненты в типичном окне main.

типичное окно

Клиентская область

Клиентская область — это часть окна, в которой приложение отображает выходные данные, например текст или графику. Например, классическое приложение для публикации отображает текущую страницу документа в клиентской области. Приложение должно предоставить функцию, называемую процедурой окна, для обработки входных данных в окно и отображения выходных данных в клиентской области. Дополнительные сведения см. в разделе Процедуры окна.

Неклиентная область

Заголовок строки, строка меню, меню окна, кнопки свернуть и развернуть, границы размера и полосы прокрутки называются неклиентной областью окна. Система управляет большинством аспектов неклиентской области; приложение управляет внешним видом и поведением своей клиентской области.

В строке заголовка отображается определенный приложением значок и строка текста; Как правило, в тексте указывается имя приложения или указывается назначение окна. Приложение указывает значок и текст при создании окна. Строка заголовка также позволяет пользователю перемещать окно с помощью мыши или другого указывающего устройства.

Большинство приложений содержат строку меню , в которой перечислены команды, поддерживаемые приложением. Элементы в строке меню представляют main категории команд. При щелчке элемента в строке меню обычно открывается всплывающее меню, элементы которого соответствуют задачам в данной категории. Щелкнув команду, пользователь направляет приложение на выполнение задачи.

Меню окна создается и управляется системой. Он содержит стандартный набор пунктов меню, которые при выборе пользователя задают размер или положение окна, закрывают приложение или выполняют задачи. Дополнительные сведения см. в разделе Меню.

Кнопки в правом верхнем углу влияют на размер и положение окна. При нажатии кнопки развернуть система увеличивает окно до размера экрана и размещает окно, чтобы оно охватывала весь рабочий стол, за исключением панели задач. В то же время система заменяет кнопку развернуть кнопкой восстановления. При нажатии кнопки восстановления система восстанавливает окно до предыдущего размера и положения. При нажатии кнопки свернуть система уменьшает окно до размера кнопки панели задач, помещает окно над кнопкой панели задач и отображает кнопку панели задач в обычном состоянии. Чтобы восстановить предыдущий размер и положение приложения, нажмите кнопку панели задач. При нажатии кнопки закрыть приложение завершает работу.

Граница размера — это область по периметру окна, которая позволяет пользователю определить размер окна с помощью мыши или другого указывающего устройства.

Горизонтальная полоса прокрутки и вертикальная полоса прокрутки преобразуют ввод мыши или клавиатуры в значения, которые приложение использует для перемещения содержимого клиентской области по горизонтали или вертикали. Например, текстовое приложение, отображающее длинный документ, обычно предоставляет вертикальную полосу прокрутки, чтобы пользователь мог перестраивать документ вверх и вниз.

Элементы управления и диалоговые окна

Приложение может создавать несколько типов окон в дополнение к main окнам, включая элементы управления и диалоговые окна.

Элемент управления — это окно, которое приложение использует для получения определенной информации от пользователя, например имени открываемого файла или требуемого размера выделенного текста. Приложения также используют элементы управления для получения сведений, необходимых для управления определенной функцией приложения. Например, приложение текстовой обработки обычно предоставляет элемент управления, позволяющий пользователю включать и отключать обтекание словами. Дополнительные сведения см. в разделе Элементы управления Windows.

Элементы управления всегда используются в сочетании с другим окном— обычно диалоговым окном. Диалоговое окно — это окно, содержащее один или несколько элементов управления. Приложение использует диалоговое окно для запроса ввода данных, необходимых для выполнения команды. Например, приложение, включающее команду для открытия файла, отображает диалоговое окно с элементами управления, в которых пользователь указывает путь и имя файла. Диалоговые окна обычно не используют тот же набор компонентов окна, что и main окно. Большинство из них имеют заголовок окна, меню окна, границу (без изменения размера) и клиентскую область, но обычно они не имеют строки меню, кнопок свернуть и развернуть или полосы прокрутки. Дополнительные сведения см. в разделе Диалоговые окна.

Окно сообщения — это специальное диалоговое окно, в котором отображается примечание, предупреждение или предупреждение для пользователя. Например, окно сообщения может сообщить пользователю о проблеме, с которой приложение столкнулось при выполнении задачи. Дополнительные сведения см. в разделе Окна сообщений.

Атрибуты окна

При создании окна приложение должно предоставить следующие сведения. (За исключением дескриптора окна, который функция создания возвращает для уникальной идентификации нового окна.)

Эти атрибуты окна описаны в следующих разделах.

Имя класса

Каждое окно принадлежит классу окон. Приложение должно зарегистрировать класс окон перед созданием окон этого класса. Класс window определяет большинство аспектов внешнего вида и поведения окна. Главным компонентом класса window является оконная процедура, функция, которая получает и обрабатывает все входные данные и запросы, отправляемые в окно. Система предоставляет входные данные и запросы в виде сообщений. Дополнительные сведения см. в разделах Классы окон, процедуры окон и сообщения и очереди сообщений.

Имя окна

Имя окна — это текстовая строка, идентифицирующая окно для пользователя. В окне main, диалоговом окне или окне сообщения имя окна обычно отображается в строке заголовка, если оно имеется. Элемент управления может отображать имя своего окна в зависимости от класса элемента управления. Например, кнопки, элементы управления "Изменить" и статические элементы управления отображают имена окон в прямоугольнике, занимаемом элементом управления . Однако такие элементы управления, как списки и поля со списком, не отображают имена окон.

Чтобы изменить имя окна после создания окна, используйте функцию SetWindowText . Эта функция использует функции GetWindowTextLength и GetWindowText для получения текущей строки имени окна из окна.

Стиль окна

Каждое окно имеет один или несколько стилей окна. Стиль окна — это именованной константой, которая определяет аспект внешнего вида и поведения окна, не указанный классом окна. Приложение обычно задает стили окон при создании окон. Он также может задавать стили после создания окна с помощью функции SetWindowLong .

Система и, в некоторой степени, процедура окна для класса интерпретируют стили окна.

Некоторые стили окна применяются ко всем окнам, но большинство из них применяются к окнам определенных классов окон. Общие стили окна представлены константами, начинающимися с префикса WS_; Их можно объединить с оператором OR для формирования различных типов окон, включая окна main, диалоговые окна и дочерние окна. Стили окон, зависящие от класса, определяют внешний вид и поведение окон, принадлежащих к предопределенным классам элементов управления. Например, класс SCROLLBAR задает элемент управления полосой прокрутки, но стили SBS_HORZ и SBS_VERT определяют, создается ли элемент управления горизонтальной или вертикальной полосой прокрутки.

Списки стилей, которые могут использоваться окнами, см. в следующих разделах:

Расширенный стиль окна

Каждое окно может иметь один или несколько расширенных стилей окон. Расширенный стиль окна — это именованной константой, которая определяет аспект внешнего вида и поведения окна, не указанный классом окна или другими стилями окна. Приложение обычно задает расширенные стили окон при создании окон. Он также может задавать стили после создания окна с помощью функции SetWindowLong .

Дополнительные сведения см. в разделе CreateWindowEx.

Position

Положение окна определяется как координаты его верхнего левого угла. Эти координаты, иногда называемые координатами окна, всегда находятся относительно левого верхнего угла экрана или, для дочернего окна, верхнего левого угла клиентской области родительского окна. Например, окно верхнего уровня с координатами (10,10) размещается 10 пикселей справа от левого верхнего угла экрана и 10 пикселей вниз от него. Дочернее окно с координатами (10,10) размещается в 10 пикселях справа от левого верхнего угла клиентской области родительского окна и на 10 пикселей вниз от него.

Функция WindowFromPoint извлекает дескриптор окна, занимающий определенную точку на экране. Аналогичным образом функции ChildWindowFromPoint и ChildWindowFromPointEx извлекают дескриптор дочернего окна, занимающий определенную точку в клиентской области родительского окна. Хотя ChildWindowFromPointEx может игнорировать невидимые, отключенные и прозрачные дочерние окна, ChildWindowFromPoint не может.

Размер

Размер окна (ширина и высота) указан в пикселях. Окно может иметь нулевую ширину или высоту. Если приложение задает ширину и высоту окна равными нулю, система устанавливает минимальный размер окна по умолчанию. Чтобы определить минимальный размер окна по умолчанию, приложение использует функцию GetSystemMetrics с флагамиSM_CXMIN и SM_CYMIN .

Приложению может потребоваться создать окно с клиентской областью определенного размера. Функции AdjustWindowRect и AdjustWindowRectEx вычисляют требуемый размер окна на основе требуемого размера клиентской области. Приложение может передать результирующие значения размера в функцию CreateWindowEx .

Приложение может размер окна таким образом, чтобы оно было очень большим; однако размер окна не должен превышать размер экрана. Перед настройкой размера окна приложение должно проверка ширину и высоту экрана с помощью GetSystemMetrics с флагамиSM_CXSCREEN и SM_CYSCREEN.

Дескриптор родительского окна или дескриптора окна владельца

Окно может иметь родительское окно. Окно с родительским элементом называется дочерним окном. Родительское окно предоставляет систему координат, используемую для размещения дочернего окна. Наличие родительского окна влияет на внешний вид окна; например, дочернее окно обрезается таким образом, что ни часть дочернего окна не может отображаться за пределами его родительского окна.

Окно, у которого нет родительского элемента или является окном рабочего стола, называется окном верхнего уровня. Приложение может использовать функцию EnumWindows , чтобы получить дескриптор для каждого окна верхнего уровня на экране. EnumWindows передает дескриптор каждому окну верхнего уровня, в свою очередь, в определяемую приложением функцию обратного вызова EnumWindowsProc.

Окно верхнего уровня может принадлежать другому окну или принадлежать ей. Собственное окно всегда отображается перед окном владельца, скрывается при свертывке окна владельца и уничтожается при уничтожении его окна владельца. Дополнительные сведения см. в разделе Собственные окна.

Дочернее окно может иметь идентификатор дочернего окна , уникальное, определяемое приложением значение, связанное с дочерним окном. Идентификаторы дочерних окон особенно полезны в приложениях, создающих несколько дочерних окон. При создании дочернего окна приложение указывает идентификатор дочернего окна. После создания окна приложение может изменить идентификатор окна с помощью функции SetWindowLong или получить идентификатор с помощью функции GetWindowLong .

Меню может быть в каждом окне, кроме дочернего. Приложение может включать меню, предоставляя дескриптор меню при регистрации класса окна или при создании окна.

Дескриптор экземпляра приложения

С каждым приложением связан дескриптор экземпляра. Система предоставляет дескриптор экземпляра приложению при запуске приложения. Так как она может запускать несколько копий одного приложения, система использует дескрипторы экземпляров на внутреннем сервере, чтобы отличить один экземпляр приложения от другого. Приложение должно указать дескриптор экземпляра во многих различных окнах, в том числе в тех, которые создают окна.

Создание данных

С каждым окном могут быть связанные данные создания, определенные приложением. При первом создании окна система передает указатель на данные в процедуре создаваемого окна. Процедура окна использует данные для инициализации переменных, определяемых приложением.

Дескриптор окна

После создания окна функция создания возвращает дескриптор окна , который однозначно идентифицирует окно. Дескриптор окна имеет тип данных HWND ; приложение должно использовать этот тип при объявлении переменной, содержащей дескриптор окна. Приложение использует этот дескриптор в других функциях для направления своих действий в окно.

Приложение может использовать функцию FindWindow , чтобы определить, существует ли в системе окно с указанным именем класса или именем окна. Если такое окно существует, Функция FindWindow возвращает в окно дескриптор. Чтобы ограничить поиск дочерними окнами конкретного приложения, используйте функцию FindWindowEx .

Функция IsWindow определяет, определяет ли дескриптор окна допустимое существующее окно. Существуют специальные константы, которые могут заменить дескриптор окна в некоторых функциях. Например, приложение может использовать HWND_BROADCAST в функциях SendMessage и SendMessageTimeout или HWND_DESKTOP в функции MapWindowPoints .

Создание окна

Чтобы создать окна приложения, используйте функцию CreateWindow или CreateWindowEx . Необходимо указать сведения, необходимые для определения атрибутов окна. CreateWindowEx имеет параметр dwExStyle, которого нет в CreateWindow ; в противном случае функции идентичны. На самом деле CreateWindow просто вызывает CreateWindowEx с параметром dwExStyle , равным нулю. По этой причине остальная часть этого обзора относится только к CreateWindowEx.

В этом разделе рассматриваются следующие вопросы.

Примечание

Существуют дополнительные функции для создания специальных окон, таких как диалоговые окна и окна сообщений. Дополнительные сведения см. в разделах DialogBox, CreateDialog и MessageBox.

 

Создание главного окна

Каждое приложение под управлением Windows должно иметь WinMain в качестве функции точки входа. WinMain выполняет ряд задач, включая регистрацию класса окна для окна main и создание окна main. WinMain регистрирует класс main окна, вызывая функцию RegisterClass, и создает окно main путем вызова функции CreateWindowEx.

Функция WinMain также может ограничить приложение одним экземпляром. Создайте именованный мьютекс с помощью функции CreateMutex . Если GetLastError возвращает ERROR_ALREADY_EXISTS, существует другой экземпляр приложения (он создал мьютекс), и следует выйти из WinMain.

Система не отображает окно main автоматически после его создания. Вместо этого приложение должно использовать функцию ShowWindow для отображения окна main. После создания окна main функция WinMain приложения вызывает ShowWindow, передавая ему два параметра: дескриптор в окно main и флаг, указывающий, следует ли свернуть или развернуть окно main при первом отображении. Обычно для флага можно задать любую из констант, начиная с префикса SW_. Однако при вызове Метода ShowWindow для отображения окна main приложения необходимо установить флаг SW_SHOWDEFAULT. Этот флаг указывает системе, что окно отображается в соответствии с указаниями программы, которая запустила приложение.

Если класс окна был зарегистрирован в версии Юникода RegisterClass, окно получает только сообщения Юникода. Чтобы определить, используется ли в окне кодировка Юникод, вызовите Метод IsWindowUnicode.

Сообщения Window-Creation

При создании любого окна система отправляет сообщения в процедуру окна для окна. Система отправляет сообщение WM_NCCREATE после создания неклиентной области окна и сообщение WM_CREATE после создания клиентской области. Процедура окна получает оба сообщения до того, как система отобразит окно. Оба сообщения содержат указатель на структуру CREATESTRUCT , которая содержит все сведения, указанные в функции CreateWindowEx . Как правило, процедура окна выполняет задачи инициализации при получении этих сообщений.

При создании дочернего окна система отправляет WM_PARENTNOTIFY сообщение в родительское окно после отправки WM_NCCREATE и WM_CREATE сообщений. Он также отправляет другие сообщения при создании окна. Количество и порядок этих сообщений зависят от класса и стиля окна, а также от функции, используемой для создания окна. Эти сообщения описаны в других разделах этого файла справки.

Многопоточные приложения

Приложение на основе Windows может иметь несколько потоков выполнения, и каждый поток может создавать окна. Поток, создающий окно, должен содержать код для его оконной процедуры.

Приложение может использовать функцию EnumThreadWindows для перечисления окон, созданных определенным потоком. Эта функция передает дескриптор каждому окну потока, в свою очередь, в определяемую приложением функцию обратного вызова EnumThreadWndProc.

Функция GetWindowThreadProcessId возвращает идентификатор потока, создавшего определенное окно.

Чтобы задать состояние отображения окна, созданного другим потоком, используйте функцию ShowWindowAsync .