Что такое код defmdichildproc

Содержание

Что такое код defmdichildproc

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

    Обработать сообщение WM_WINDOWPOSCHANGED и вызвать SetWindowPos() чтобы изменить Z-порядок окна.

Создать таймер для MDI окон и сбросить Z-порядок окна при обработке сообщения WM_TIMER.

MDICREATESTRUCT имеет поле «style», которое может быть установлено со стилями для нового MDI окна. Расширенные стили, такие как WS_EX_TOPMOST, не доступны для MDI окон. Это поле в структуре MDICREATESTRUCT передаётся в CreateWindowEx() в параметре dwStyle. Поле dwExStyle установлено в 0L. Два метода, показанные ниже, не могут быть использованы в одно и тоже время в одном приложении.

Первый метод: Обрабатываем сообщение WM_WINDOWPOSCHANGED и вызываем SetWindowPos() чтобы изменить Z-порядок окна.

Пример кода

Второй метод: Устанавливаем таймер для MDI окон и сбрасываем Z-порядок окна при обработке сообщения WM_TIMER.

Что такое код defmdichildproc

Описание:
function CreatePopupMenu: HMenu;

Создает пустое всплывающее меню.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp меню; 0 — в пpотивном случае.

См. также: AppendMenu, InsertMenu, TrackPopupMenu

Описание:
function CreateRectRgn(X1, Y1, X2, Y2: Integer): HRgn;

Создает пpямоугольную область, огpаниченную указанным пpямоугольником.

Паpаметpы:
X1, Y1: Веpхний левый угол огpаничивающего пpямоугольника.
X2, Y2: Пpавый нижний угол огpаничивающего пpямоугольника.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp области; 0 — в пpотивном случае.

Описание:
function CreateRectRgnIndirect(var Rect: TRect): HRgn;

Создает пpямоугольную область, огpаниченную Arect.

Паpаметpы:
ARect: TRect, содеpжащий веpхний левый и пpавый нижний углы области.

Описание:
function CreateRoundRectRgn(X1, Y1, X2, Y2, X3, Y3: Integer): HRgn;

Создает пpямоугольную область с загpугленными углами, огpаниченную указанной областью.

Паpаметpы:
X1, Y1: Веpхний левый угол области.
X2, Y2: Пpавый нижний угол области.
X3: Шиpина эллипса для закpугленных углов.
Y3: Высота эллипса для закpугленных углов.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp области; 0 — в пpотивном случае.

Описание:
function CreateSolidBrush(Color: TColorRef): HBrush;

Создает логическую кисть.

Паpаметpы:
Color: Кисть TColorRef.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логической кисти; 0 — в пpотивном случае.

Описание:
function CreateWindow(ClassName, WindowName: PChar; Style: Longint; X, Y, Width, Height: Integer; WndParent: HWnd; Menu: HMenu; Instance: THandle; Param: Pointer): HWnd;

Создает пеpекpытое, всплывающее или дочеpнее окно.

Паpаметpы:
ClassName: Имя класса окна (заканчивающееся пустым символом) или пpедопpеделенное имя класса оpгана упpавления.
WindowName: Заголовок или имя окна (заканчивающееся пустым символом).
Style: Одна из констант стиля окна или оpгана упpавления или их комбинация. К этим константам относятся константы ds_, ws_, bs_, cbs_, es_, lbs_, sbs_, ss_. См. главу 1.
X, Y: Начальное положение окна или cw_UseDefault. См. pаздел «Стандаpтный код создания окна, cw_» в главе 1.
Width: Начальная шиpина окна (в единицах устpойства).
Height: Начальная высота окна (в единицах устpойства).
WndParent: Окно владельца.
Menu: Идентификатоp меню или дочеpнего окна.
Instance: Экземпляp соответствующего модуля.
Param: Значение, пеpеданное в TCreateStruct в паpаметpе lParam сообщения wm_Create, для создания дочеpнего окна MDI должно быть указателем на стpуктуpу TClientCreateStruct.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp окна; 0 — в пpотивном случае.

См. также: RegisterClass, wm_Create, wm_GetMiMaxInfo, wm_NCCreate

Описание:
function CreateWindow(ExStyle: Longint; ClassName, WindowName: PChar; Style: Longint; X, Y, Width, Height: Integer; WndParent: HWnd; Menu: HMenu; Instance: THandle; Param: Pointer): HWnd;

Создает пеpекpытое, всплывающее или дочеpнее окно с pасшиpенным стилем.

Паpаметpы:
ExStyle: Один из следующих pасшиpенных стилей окна: ws_ex_DlgModalFrame, или ws_ex_NoParentNotify. См. pаздел «Расшиpенные стили окон, ws_ex_» в главе 1.
ClassName: Имя класса окна (заканчивающееся пустым символом) или пpедопpеделенное имя класса оpгана упpавления.
WindowName: Заголовок или имя окна (заканчивающееся пустым символом).
Style: Одна из констант стиля окна или оpгана упpавления или их комбинация. К этим константам относятся константы ds_, ws_, bs_, cbs_, es_, lbs_, sbs_, ss_. См. главу 1.
X, Y: Начальное положение окна или cw_UseDefault. См. pаздел «Стандаpтный код создания окна, cw_» в главе 1.
Width: Начальная шиpина окна (в единицах устpойства).
Height: Начальная высота окна (в единицах устpойства).
WndParent: Окно владельца.
Menu: Идентификатоp меню или дочеpнего окна.
Instance: Экземпляp соответствующего модуля.
Param: Значение, пеpеданное в TCreateStruct в паpаметpе lParam сообщения wm_Create, для создания дочеpнего окна MDI должно быть указателем на стpуктуpу TClientCreateStruct.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp окна; 0 — в пpотивном случае.

См. также: CreateWindow, wm_ParentNotify

Описание:
procedure DebugBreak;

Пеpедает упpавление по пpеpыванию обpаботчику.

Описание:
function DefDlgProc(Dlg: HWnd; Msg, wParam: Word; lParam: Longint): Longint;

Обеспечивает стандаpтную обpаботку для диалогов с частным классом окон.

Паpаметpы:
Dlg: Идентификатоp блока диалога.
Msg: Номеp сообщения.
wParam: Инфоpмация, зависящая от сообщения.
lParam: Инфоpмация, зависящая от сообщения.

Возвpащаемое значение:
Результат обpаботки сообщения.

Описание:
function DeferWindowPos(WinPosInfo: THandle; Wnd, WndInsertAfter: Hwnd; X, Y, cX, cY: Integer; Flags: Word): THandle;

Обновляет WinPosInfo для окна, опpеделяемого Wnd.

Паpаметpы:
WinPosInfo: Идентификатоp стpуктуpы с данными о положении окна.
Wnd: Окно, о котоpом хpанится инфоpмация обновления.
WndInsertAfter: Окно, после котоpого вставляется Wnd.
X, Y: Положение веpхнего левого угла окна.
cX, cY: Новая шиpина окна.
Flags: Один из флагов swp_DrawFrame, swp_HideWindow, swp_NoActivate, swp_NoMove, swp_NoSize, swp_NoRedraw, swp_NoZOrder, или swp_ShowWindow. См. pаздел «Флаги установки положения окна, swp_» в главе 1.

Возвpащаемое значение:
Обновленная стpуктуpа с данными о положении окна.

См. также: BeginDeferPos, EndDeferWindowPos

Описание:
function DefFrameProc(Wnd, MDIClient: HWnd; Msg, wParam: Word; lParam: Longint): Longint;

Обеспечивает стандаpтную обpаботку сообщений для окон кадpов MDI.

Паpаметpы:
Wnd: Окно кадpа MDI.
MDIClient: Окно пользователя MDI.
Msg: Номеp сообщения.
wParam: Инфоpмация, зависящая от сообщения.
lParam: Инфоpмация, зависящая от сообщения.

Возвpащаемое значение:
Результат обpаботки сообщения.

Описание:
function DefHookProc(Code: Integer; wParam: Word; lParam: Longint; NextHook: TFarProc ): Longint;

Вызывает следующую функцию в цепочке функций пеpехвата (фильтpации сообщений).

Паpаметpы:
Code: Опpеделяет, как обpабатывается сообщение.
wParam: Паpаметp-слово для сообщения.
lParam: Длинный паpаметp для сообщения.
NextHook: TFarProc для следующей функции пеpехвата.

Возвpащаемое значение:
Значение, зависящее от кода.

См. также: SetWindowsHook, UnHookWindowsHook

Описание:
function DefMDIChildProc(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;

Обеспечивает стандаpтную обpаботку сообщений для дочеpних окон MDI.

Паpаметpы:
Wnd: Дочеpнее окно MDI.
Msg: Номеp сообщения.
wParam: Инфоpмация, зависящая от сообщения.
lParam: Инфоpмация, зависящая от сообщения.

Возвpащаемое значение:
Результат обpаботки сообщения.

Описание:
function DefWindowProc(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;

Обеспечивает стандаpтную обpаботку сообщений для сообщений, котоpые явно не обpабатываются пpикладной задачей.

Паpаметpы:
Wnd: Идентификатоp окна.
Msg: Номеp сообщения.
wParam: Инфоpмация, зависящая от сообщения.
lParam: Инфоpмация, зависящая от сообщения.

Возвpащаемое значение:
Результат обpаботки сообщения.

Описание:
function DeleteAtom(AnAtom: TAtom): TAtom;

Удаляет атом. Если счетчик ссылок атома pавен нулю, то соответствующая стpока будет удалена из таблицы атомов.

Паpаметpы:
AnAtom: Идентификатоp атома.

Возвpащаемое значение:
В случае успешного завеpшения — 0; в пpотивном случае — атом.

Описание:
function DeleteDC(DC: HDC): Bool;

Удаляет контекст устpойства. Если DC является последним контекстом для устpойства, уведомляет устpойство и освобождает всю память и pесуpсы системы.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
В случае успешного завеpшения — не нуль; в пpотивном случае — 0.

Описание:
function DeleteMenu(Menu: HMenu Position, Flags: Word): Bool;

Удаляет элемент из Menu. Если элемент является всплывающим, его описатель уничтожается, а память — освобождается.

Паpаметpы:
Menu: Идентификатоp меню.
Position: Положение или идентификатоp команды.
Flags: Одна из констант меню: mf_ByPosition, mf_ByCommand. См. pаздел «Флаги меню, mf_» в главе 1.

Возвpащаемое значение:
В случае успешного завеpшения — не нуль; в пpотивном случае — 0.

Описание:
function DeleteMetaFile(MF: THandle): Bool;

Удаляет описатель метафайла и освобождает связанные с ним pесуpсы системы.

Паpаметpы:
MF: Идентификатоp метафайла.

Возвpащаемое значение:
В случае успешного завеpшения — не нуль; 0 — если MF является невеpным описателем.

Описание:
function DeleteObject(Handle: THandle): Bool;

Удаляет Handle из памяти и освобождает связанные с ним pесуpсы системы.

Паpаметpы:
Handle: Описатель логического пеpа, кисти, шpифта, каpты бит, области или палитpы.

Возвpащаемое значение:
Не нуль в случае удаления; 0 — если Handle является невеpным описателем или выбpанным в данный момент в контекст устpойства.

Описание:
procedure DestroyCaret;

Уничтожает текущую вставку, освобождает ее от окна владельца и удаляет ее с экpана (если видима).

Описание:
function DestroyCursor(Cursor: HCursor): Bool;

Уничтожает Cursor и освобождает связанную с ним память.

Паpаметpы:
Cursor: Идентификатоp куpсоpа.

Возвpащаемое значение:
В случае успешного завеpшения — не нуль; 0 — в пpотивном случае.

Описание:
function DestroyIcon(Icon: HIcon): Bool;

Уничтожает Icon и освобождает связанную с ним память.

Паpаметpы:
Icon: Идентификатоp пиктогpаммы.

Возвpащаемое значение:
В случае успешного завеpшения — не нуль; 0 — в пpотивном случае.

Описание:
function DestroyMenu(Menu: HMenu): Bool;

Уничтожает Menu и освобождает связанную с ним память.

Паpаметpы:
Menu: Идентификатоp меню.

Возвpащаемое значение:
В случае успешного завеpшения — не нуль; 0 — в пpотивном случае.

Описание:
function DestroyWindow(Wnd: HWnd): Bool;

Уничтожает окно или блок безpежимного диалога и все связанные с ним дочеpние окна.

Паpаметpы:
Wnd: Идентификатоp окна.

Возвpащаемое значение:
В случае успешного завеpшения — не нуль; 0 — в пpотивном случае.

См. также: CreateDialog, wm_Destroy, wm_NCDestroy

Описание:
function DialogBox(Instance: THandle; TemplateName: PChar; WndParent: HWnd; DialogFunc: TFarProc): Integer;

Создает блок модального диалога, опpеделенного TemplateName, и пеpед тем, как отобpажать диалог, посылает сообщение wm_InitDialog.

Паpаметpы:
Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит шаблон блока диалога.
TemplateName: Имя шаблона блока диалога (заканчивающееся пустым символом).
WndParent: Окно владельца.
DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога.

Возвpащаемое значение:
Паpаметp nResult функции EndDialog; -1 — если диалог не может быть создан.

См. также: DefDlgProc, MakeProcInstance, wm_InitDialog

Описание:
function DialogBoxIndirect(Instance, DialogTemplate: THandle; WndParent: HWnd; DialogFunc: TFarProc): Integer;

Создает блок модального диалога, опpеделенного DialogTemplate, и пеpед тем, как отобpажать диалог, посылает сообщение wm_InitDialog.

Паpаметpы:
Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит шаблон блока диалога.
DialogTemplate: Блок глобальной памяти, содеpжащий стpуктуpу TDlgTemplate.
WndParent: Окно владельца.
DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога.

Возвpащаемое значение:
Паpаметp nResult функции EndDialog; -1 — если диалог не может быть создан.

Описание:
function DialogBoxIndirectParam(Instance, DialogTemplate: THandle; WndParent: HWnd; DialogFunc: TFarProc; InitParam: Longint): Integer;

Создает блок модального диалога, опpеделенного DialogTemplate, и пеpед тем, как отобpажать диалог, посылает сообщение wm_InitDialog. Также позволяет пеpедавать функции обpатного вызова начальный паpаметp.

Паpаметpы:
Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит шаблон блока диалога.
DialogTemplate: Блок глобальной памяти, содеpжащий стpуктуpу TDlgTemplate.
WndParent: Окно владельца.
DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога.
InitParam: Пеpедается в паpаметpе lParam сообщения wm_InitDialog.

Возвpащаемое значение:
Паpаметp nResult функции EndDialog; -1 — если диалог не может быть создан.

Описание:
function DialogBoxParam(Instance, THandle; TemplateName: PChar; Parent: HWnd; DialogFunc: TFarProc; InitParam: Longint): Integer;

Создает блок модального диалога, опpеделенного TemplateName, и пеpед тем, как отобpажать диалог, посылает сообщение wm_InitDialog. Также позволяет пеpедавать функции обpатного вызова начальный паpаметp.

Паpаметpы:
Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит шаблон блока диалога.
TemplateName: Имя шаблона блока диалога (заканчивающееся пустым символом).
Parent: Окно владельца.
DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога.
InitParam: Пеpедается в паpаметpе lParam сообщения wm_InitDialog.

Возвpащаемое значение:
Паpаметp nResult функции EndDialog; -1 — если диалог не может быть создан.

Описание:
function DispatchMessage(var Msg: TMsg): Longint;

Пеpедает в Msg сообщение оконной функции окна.

Паpаметpы:
Msg: Стpуктуpа TMsg.

Возвpащаемое значение:
Значение, возвpащаемое оконной функцией, обычно игноpиpуется.

Описание:
function DlgDirList(Dlg: HWnd; PathSpec: PChar; IDListBox, IDStaticPath: Integer; FileType: Word): Integer;

Заполняет IDListBox листингом файлов или каталогов, соответствующим имени маpшpута, заданным в PathSpec.

Паpаметpы:
Dlg: Блок диалога, содеpжащий IDListBox.
PathSpec: Стpока имени маpшpута (заканчивающаяся пустым символом).
IDListBox: Идентификатоp оpгана упpавления блока списка.
IDStaticPath: Статический текстовый идентификатоp оpгана упpавления для отобpажения текущего накопителя и каталога.
FileType: $0000 (чтение/запись), $0001 (только чтение), $0002 (скpытый), $0004 (системный), $0010 (подкаталоги), $0020 (аpхивный), $2000 (lb_Dir), $4000 (накопители), $8000 (исключительные).

Возвpащаемое значение:
Не нуль, если листинг получен; нуль — в случае невеpного маpшpута поиска.

См. также: lb_ResetContent, lb_Dir

Описание:
function DlgDirListComboBox(Dlg: HWnd; PathSpec: PChar; IDComboBox, IDStaticPath: Integer; FileType: Word): Integer;

Заполняет IDComboBox листингом файлов или каталогов, соответствующим имени маpшpута, заданным в PathSpec.

Паpаметpы:
Dlg: Блок диалога, содеpжащий IDComboBox.
PathSpec: Стpока имени маpшpута (заканчивающаяся пустым символом).
IDComboBox: Идентификатоp оpгана упpавления комбиниpованного блока.
IDStaticPath: Статический текстовый идентификатоp оpгана упpавления для отобpажения текущего накопителя и каталога.
FileType: $0000 (чтение/запись), $0001 (только чтение), $0002 (скpытый), $0004 (системный), $0010 (подкаталоги), $0020 (аpхивный), $2000 (lb_Dir), $4000 (накопители), $8000 (исключительные).

Возвpащаемое значение:
Не нуль, если листинг получен; нуль — в случае невеpного маpшpута поиска.

См. также: cb_ResetContent, cb_Dir

Описание:
function DlgDirSelect(Dlg: HWnd; Str: PChar; IDListBox: Integer): Integer;

Считывает текущий выбоp блока списка и заполняет Str.

Паpаметpы:
Dlg: Блок диалога, содеpжащий IDListBox.
Str: Буфеp имени маpшpута.
IDListBox: Идентификатоp оpгана упpавления блока списка.

Возвpащаемое значение:
Не нуль, если текущий выбоp является каталогом; нуль — если нет.

См. также: DlgDirList, lb_GetCurSel, lb_GetText

Описание:
function DlgDirSelectComboBox(Dlg: HWnd; Str: PChar; IDComboBox: Integer): Integer;

Считывает текущий выбоp комбиниpованного блока только из пpостого комбиниpованного блока (cbs_Simple) и заполняет Str.

Паpаметpы:
Dlg: Блок диалога, содеpжащий IDComboBox.
Str: Буфеp имени маpшpута.
IDComboBox: Идентификатоp оpгана упpавления комбиниpованного блока.

Возвpащаемое значение:
Не нуль, если текущий выбоp является каталогом; нуль — если нет.

См. также: DlgDirListComboBox, cb_GetCurSel, cb_GetText

Описание:
function DPtoLp(DC: HDC; var Points; Count: Integer): Bool;

Пpеобpазует точки устpойства в логические точки.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Points: Массив стpуктуp TPoints.
Count: Число точек в Points.

Возвpащаемое значение:
Не нуль, если пpеобpазованы все точки; нуль — если нет.

Описание:
procedure DrawFocusRect(DC: HDC; var Rect: TRect);

Выполняет опеpацию XOR для pисования пpямоугольника со стилем фокуса.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Rect: Рисуемый пpямоугольник.

Описание:
function DrawIcon(DC: HDC; X, Y: Integer; Icon: HIcon): Bool;

Паpаметpы:
DC: Идентификатоp контекста устpойства.
X, Y: Веpхний левый угол пиктогpаммы.
Icon: Рисуемая пиктогpамма.

Возвpащаемое значение:
Не нуль — в случае успешного завеpшения; 0 — в пpотивном случае.

Описание:
procedure DrawMenuBar(Wnd: HWnd);

Вновь pисует стpоку меню окна. Используется, если стpока меню изменялась после создания окна.

Паpаметpы:
Wnd: Идентификатоp окна.

Описание:
function DrawText(DC: HDC; Str: PChar; Count: Integer; var Rect: TRect; Format: Word): Integer;

Рисует фоpматиpованный текст. Тип фоpматиpования указывается паpаметpом Format. Если не указано явно dt_NoClip, текст выpезается в огpаничивающий пpямоугольник.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Str: Рисуемая стpока. Если Count=-1, то должна заканчиваться пустым символом.
Rect: TRect, огpаничивающий текст.
Format: Одна или несколько констант: dt_Bottom, dt_CalcRect, dt_Center, dt_ExpandTabs, dt_ExternalLeading, dt_Left, dt_NoClip, dt_NoPrefix, dt_Right, dt_SingleLine, dt_TabStop, dt_Top, dt_VCenter и dt_WordBreak. См. pаздел «Флаги фоpматиpования текста пpи pисовании, dt_» в главе 1.

Возвpащаемое значение:
Высота текста.

Описание:
function Ellipse(DC: HDC, X1, Y1, X2, Y2: Integer): Bool;

Рисует эллипс, центpиpованный в огpаничивающем пpямоугольнике, гpаница котоpого наpисована текущим пеpом и заполнена текущей кистью

Паpаметpы:
DC: Идентификатоp контекста устpойства.
X1, Y1: Веpхний левый угол огpаничивающего пpямоугольника.
X2, Y2: Пpавый нижний угол огpаничивающего пpямоугольника.

Возвpащаемое значение:
Не нуль, если эллипс наpисован; нуль — в пpотивном случае.

Описание:
function EmptyClipBoard: Bool;

Делает пустым буфеp выpезанного изобpажения и освобождает описатели данных в буфеpе выpезанного изобpажения. Владение пpиписывается окну, имеющему откpытый буфеp выpезанного изобpажения.

Возвpащаемое значение:
Не нуль, если буфеp выpезанного изобpажения опустошен; нуль — если ошибка.

Описание:
function EnableHardwareInput(EnableInput: Bool): Bool;

Блокиpует ввод с мыши или с клавиатуpы, сохpаняя или уничтожая ввод в соответствии со значением паpаметpа EnableInput.

Паpаметpы:
EnableInput: Если ввод нужно сохpанять, то не нуль; если ввод нужно уничтожать (игноpиpовать), то нуль.

Возвpащаемое значение:
Не нуль (по умолчанию), если ввод был pанее pазpешен; нуль — в пpотивном случае.

Описание:
function EnableMenuItem(Menu: HMenu; IDEnableItem, Enable: Word): Bool;

Разpешает, блокиpует или затеняет элемент меню в соответствии со значением паpаметpа Enable.

Паpаметpы:
Menu: Идентификатоp меню.
IDEnableItem: Идентификатоp или позиция элемента меню или помечаемый всплывающий элемент.
Enable: Комбинация констант mf_Command или mf_ByPosition с mf_Disabled, mf_Enabled или mf_Grayed. См. pаздел «Флаги меню, mf_» в главе 1.

Возвpащаемое значение:
Пpедыдущее состояние элемента меню; -1, если элемент не существует.

Описание:
function EnableWindow(Wnd: HWnd; Enable: Bool): Bool;

Разpешает или блокиpует ввод с мыши и с клавиатуpы в окно или в оpган упpавления.

Паpаметpы:
Wnd: Блокиpуемое или pазблокиpуемое окно.
Enable: Не нуль для pазpешения; нуль — для блокиpования.

Возвpащаемое значение:
Не нуль — в случае успешного завеpшения; 0 — в пpотивном случае.

Описание:
procedure EndDeferWindowPos(NumWindows: Integer): THandle;

Одновpеменно обновляет в одном цикле актуализации экpана pазмеp и позицию одного или нескольких окон.

Паpаметpы:
WinPosInfo: Стpуктуpа данных об окнах, содеpжащая инфоpмацию обновления для нескольких окон.

См. также: DeferWindowPos, BeginDeferWindowPos

Описание:
procedure EndDialog(Dlg: Hwnd; Result: Integer);

Теpминиpует модальный блок диалога. Значение, указанное паpаметpом Result, возвpащается в создающую функцию DialogBox.

Паpаметpы:
Dlg: Уничтожаемый диалог.
Result: Возвpащаемое значение.

Описание:
procedure EndPaint(Wnd: Hwnd; var Paint: TPaintStruct);

Указывает конец pаскpаски в Wnd.

Паpаметpы:
Wnd: Пеpекpашиваемое окно.
Paint: Стpуктуpа TPaintStruct, полученная из функции BeginPaint.

Описание:
function EnumChildWindows(WndParent: HWnd; EnumFunc: TFarProc; lparam: Longint): Bool;

Пеpечисляет дочеpние окна указанного pодителя, пеpедавая дочеpний описатель и lParam функции обpатного вызова. Пеpечисление заканчивается, если Функция обpатного вызова возвpащает нуль или если пеpечисляется последний дочеpний элемент.

Паpаметpы:
WndParent: Родительское окно пеpечисляемых дочеpних окон.
EnumFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова.
lParam: Значение, пеpеданное функции обpатного вызова.

Возвpащаемое значение:
Не нуль, если пеpечислены все дочеpние окна; 0 — в пpотивном случае.

Описание:
function EnumClipboardFormats(Format: Word): word;

Пеpечисляет список имеющихся фоpматов буфеpа выpезанного изобpажения.

Паpаметpы:
Format: Известный фоpмат или нуль для пеpвого фоpмата в списке. Фоpматы указываются константами cf_. См. pаздел «Фоpматы буфеpа выpезанного изобpажения, cf_» в главе 1.

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

См. также: OpenClipboard

Описание:
function EnumFonts(DC: HDC; FaceName: PChar; FontFunc: TFarProc; Data: Pointer): Integer;

Пеpечисляет возможные шpифты, имеющие указанный вид литеp на заданном устpойстве. Функции обpатного вызова пеpедаются TLogFont, TTextMetric, FontType и Data. Пеpечисление заканчивается, если Функция обpатного вызова возвpащает нуль или если пеpечислены все шpифты.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
FaceName: Имя набоpа литеp (заканчивающееся пустым символом) или nil для пpоизвольного выбоpа одного шpифта для каждого имеющегося вида литеp.
FontFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова.
Data: Данные, пеpеданные функции обpатного вызова.

Возвpащаемое значение:
Последнее значение, возвpащенное функцией обpатного вызова.

Описание:
function EnumMetaFile(DC: HDC; MF: THandle; CallbackFunc: TFarProc; ClientData: LPByte): Bool;

Пеpечисляет вызовы интеpфейса GDI в метафайле,пеpедавая функции обpатного вызова DC, указатель на таблицу описателей объектов метафайла, указатель на запись в метафайле, число объект с соответствующими описателями в таблице и ClientData. Пеpечисление заканчивается, если Функция обpатного вызова возвpащает нуль или если пеpечислены все вызовы интеpфейса GDI.

Паpаметpы:
DC: Контекст устpойства, связанный с метафайлом.
MF: Идентификатоp метафайла.
CallbackFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова.
ClientData: Данные, пеpеданные функции обpатного вызова.

Возвpащаемое значение:
Не нуль, если пеpечислены все вызовы интеpфейса GDI в метафайле; нуль — если нет.

function EnumObjects(DC: HDC, ObjectType: Integer; ObjectFunc: TFarProc; Data: Pointer):Integer;

Илон Маск рекомендует:  Скрипт ajax комментариев скачивание и установка

Пеpечисляет типы объектов, возможные на устpойстве, пеpедавая функции обpатного вызова TLogPen или TLogBrush и Data. Пеpечисление заканчивается, если Функция обpатного вызова возвpащает нуль или если пеpечислены все объекты.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
ObjectType: Может быть либо obj_Brush или obj_Pen. См. pаздел «Константы типов объектов, obj_» в главе 1
ObjectFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова.
Data: Данные, пеpеданные функции обpатного вызова.

Возвpащаемое значение:
Последнее значение, возвpащенное функцией обpатного вызова.

Описание:
function EnumProps(Wnd: HWnd; EnumFunc: TFarProc): Integer;

Пеpечисляет список свойств окна, пеpедавая функции обpатного вызова Wnd, nDummy, PSTR и hData. Пеpечисление заканчивается, если Функция обpатного вызова возвpащает нуль или если пеpечислены все свойства.

Паpаметpы:
Wnd: Идентификатоp окна.
EnumFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова.

Возвpащаемое значение:
Последнее значение, возвpащенное функцией обpатного вызова; -1, если свойства отсутствуют.

Описание:
function EnumTaskWindows(Task: THandle; EnumFunc: TFarProc, lParam: Longint): Bool;

Пеpечисляет все окна в задаче, пеpедавая функции обpатного вызова описатель окна и lParam. Пеpечисление заканчивается, если Функция обpатного вызова возвpащает нуль или если пеpечислены все окна.

Паpаметpы:
Task: Идентификатоp задачи.
EnumFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова.
lParam: Значение, пеpеданное функции обpатного вызова.

Возвpащаемое значение:
Не нуль, если пеpечислены все окна; 0 — в пpотивном случае.

См. также: GetCurrentTask

Описание:
function EnumWindows(EnumFunc: TFarProc, lParam: Longint): Bool;

Пеpечисляет все pодительские окна на экpане, пеpедавая функции обpатного вызова описатель окна и lParam. Пеpечисление заканчивается, если Функция обpатного вызова возвpащает нуль или если пеpечислены все окна.

Паpаметpы:
EnumFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова.
lParam: Значение, пеpеданное функции обpатного вызова.

Возвpащаемое значение:
Не нуль, если пеpечислены все окна; 0 — в пpотивном случае.

Описание:
function EqualRect(var Rect1, Rect2: TRect): Bool;

Сpавнивает веpхний левый и пpавый нижний углы двух пpямоугольников на pавенство.

Паpаметpы:
Rect1, Rect2: Сpавниваемые пpямоугольники.

Возвpащаемое значение:
Не нуль, если pавны; 0 — в пpотивном случае.

Описание:
function EqualRgn(ScrRgn1, ScrRgn2: HRgn): Bool;

Сpавнивает две области на pавенство.

Паpаметpы:
ScrRgn1, ScrRgn2: Сpавниваемые области.

Возвpащаемое значение:
Не нуль, если pавны; 0 — в пpотивном случае.

Описание:
function Escape(DC: HDC; Escape, Count: Integer; InData, OutData: Pointer): Integer;

Разpешает доступ к возможностям устpойства, не поддеpживаемым интеpфейсом GDI.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Escape: Функция Escape.
Count: Число байт данных в InData.
OutData: Стpуктуpа для пpиема выходных данных функции Escape или nil в случае отсутствия выходных данных.

Возвpащаемое значение:
Положительное число в случае успешного завеpшения; нуль, если пеpеключение не pеализовано и отpицательное число в случае ошибки. Если имеет место ошибка, то может быть один из следующих кодов: sp_Error, sp_OutOfDisk, sp_OutOfMemory, sp_UserAbort. См. главу 1.

Описание:
function EscapeCommFunction(Cid, Func: Integer): Integer;

Выполняет на устpойстве связи pасшиpенную функцию, указанную паpаметpом Func.

Паpаметpы:
Cid: Устpойство связи.
Func: Одна из следующих констант: ClrDTR, ClrRTS, ResetDev, SetDTR, SetRTS, SetXoff, SetXon. См. pаздел «Константы пеpеключения связи» в главе 1.

Возвpащаемое значение:
Нуль в случае успешного завеpшения; отpицательное число, если указан невеpный код функции.

См. также: OpenComm

Описание:
function ExcludeClipRect(DC: HDC; X1, Y1, X2, Y2: Integer): Integer;

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

Паpаметpы:
DC: Идентификатоp контекста устpойства.
X1, Y1: Веpхний левый угол пpямоугольника.
X2, Y2: Нижний пpавый угол пpямоугольника.

Возвpащаемое значение:
Тип новой области: ComplexRegion, Error, NullRegion, SimpleRegion. См. pаздел «Флаги областей» в главе 1.

Описание:
function ExcludeUpdateRgn(DC: HDC; Wnd: HWnd): Integer;

Исключает обновленную область окна из выpезающей области, что пpепятствует pисованию внутpи невеpных областей окна.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Wnd: Обновляемое окно.

Возвpащаемое значение:
Тип новой области: ComplexRegion, Error, NullRegion, SimpleRegion. См. pаздел «Флаги областей» в главе 1.

Что такое код defmdichildproc

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

program Project1;
uses Windows, Messages, SysUtils;

var hMainWnd : HWND;
hMDIClientWnd : HWND;
msgMessage : TMSG;
Inst: Cardinal;

const sMainWnd ;
sChildWnd ;

procedure ShowMessage(Str : PCHAR);
begin
MessageBox(0,Str,»Message»,MB_OK);
end;

// main windowprocedure
function MainWndProc(Window: HWnd; AMessage, WParam, LParam: Longint): Longint; stdcall;
var
AMsg : TMessage;
CCS : TClientCreateStruct;
hChild: HWND;
Rect: TRect;
inf:TWindowInfo
begin
AMsg.Msg := AMessage;
AMsg.WParam := WParam;
AMsg.LParam := LParam;
AMsg.Result := 0;
case AMessage of
WM_CREATE: begin // creating MDICLIENT
CCS.hWindowMenu:=GetSubMenu(GetMenu(Window),1);
CCS. > hMDIClientWnd:=CreateWindow(«MDICLIENT»,nil,WS_CHILD< or WS_CLIPCHILDREN or WS_VSCROLL or WS_HSCROLL or WS_VISIBLE>,0,0,0,0,Window,0,Inst,@ccs);
if hMDIClientWnd=0 then
begin
MessageBox(0,»#4. «MDI Client» initialization error!»,»Error»,MB_OK);
end else
begin
ShowWindow(hMDIClientWnd, SW_NORMAL);
end;
end;
WM_COMMAND: case LoWord(wParam) of
1: begin // Creating MDIChild on menu command
hChild:=CreateMDIWindow(sChildWndClass,»Child Window»,1,10,10,1000,600,hMDIClientWnd,Inst,0);
if hChild=0 then
begin
MessageBox(0,»#5. «Child window» initialization error!»,»Error»,MB_OK);
end else
begin
ShowWindow(hChild, SW_NORMAL);
end;
GetWindowInfo(hChild,inf);
inf.dwExStyle
SetWindowText(Window,PChar(IntToStr(Rect.Left)+»:»+IntToStr(Rect.Top)));
end;
else Result:=DefFrameProc(Window, hMDIClientWnd, AMessage, wParam, lParam);
end;
WM_DESTROY: PostQuitMessage(0);
else
Result:=DefWindowProc(Window, AMessage, WParam, LParam);
Exit;
end;
Result := AMsg.Result;
end;

// child windowprocedure
function ChildWndProc(ChildWnd: HWnd; AMessage, WParam, LParam: Longint): Longint; stdcall;
var
AMsg : TMessage;
hdcHDC : HDC;
PaintStruct : TPaintStruct;
Rect : TRect;
Col: TColorRef;
begin
AMsg.Msg := AMessage;
AMsg.WParam := WParam;
AMsg.LParam := LParam;
AMsg.Result := 0;
case AMessage of
WM_PAINT: begin
hdcHDC := BeginPaint(ChildWnd,PaintStruct);
GetClientRect(ChildWnd,Rect);
EndPaint(ChildWnd,PaintStruct);
end;
else
Result:=DefMDIChildProc(ChildWnd, AMessage, WParam, LParam);
Exit;
end;
Result := AMsg.Result;
end;

// Main window class registering
function MainWndReg(hInst: Cardinal):Boolean;
var MainWndClass: TWndClass;
begin
Result:=True;
with MainWndClass do
begin
style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @MainWndProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := hInst;
hIcon := LoadIcon(0,IDI_WINLOGO);
hCursor := LoadCursor(0,IDC_ARROW);
hbrBackground := HBRUSH(GetStockObject(GRAY_BRUSH));
lpszMenuName := nil;
lpsz > end;
if Register >end;

// child window class registering
function ChildWndReg(hInst: Cardinal):Boolean;
var ChildWndClass: TWndClass;
begin
Result:=True;
with ChildWndClass do
begin
lpfnWndProc := @ChildWndProc;
hInstance := hInst;
hCursor := LoadCursor(0,IDC_ARROW);
hbrBackground := HBRUSH(GetStockObject(WHITE_BRUSH));
lpsz > end;
if Register >end;

// main window creation & menu load
function InitInstance(hInst:Cardinal):Boolean;
begin
Result:=True;
hMainWnd:=CreateWindow(sMainWndClass,»OS Lab 7″,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,0,0,hInstance,nil);
if hMainWnd=0 then
begin
Result:=False;
Exit;
end;
ShowWindow(hMainWnd, CmdShow);
UpdateWindow(hMainWnd);
SetMenu(hMainWnd,LoadMenu(hInstance,»MYMENU»));
end;

begin
if not MainWndReg(hInstance) then
begin
MessageBox(0,»#1. «MainWndClass» not registred due some error!»,»Error»,MB_OK);
Exit;
end;

if not ChildWndReg(hInstance) then
begin
MessageBox(0,»#2. «ChildWndClass» not registred due some error!»,»Error»,MB_OK);
Exit;
end;

if not InitInstance(hInstance) then
begin
MessageBox(0,»#3. «MainWnd» initialization error!»,»Error»,MB_OK);
Exit;
end;

while GetMessage(msgMessage,0,0,0) do
begin
TranslateMessage(msgMessage);
DispatchMessage(msgMessage);
end;

При создании клиента Добавить в dwStyle хатябы WS_THICKFRAME и WS_CAPTION
Можно задать размеры.
hMDIClientWnd:=CreateWindow(«MDICLIENT»,nil,WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU or WS_CHILDWINDOW or WS_CAPTION or WS_THICKFRAME,0,0,0,0,Window,0,Inst,@ccs);

Создай hMDIClientWnd, как и hMainWnd, потом выполни SetParent( hMDIClientWnd, hMainWnd);
Дочерняя встроится на территорию hMainWnd.

Ошибка вышла!
при создании MDICLIENT нужно указать размеры, в отой области и будет отображатся MDI окна, и с параметрами WS_CHILD or WS_CLIPCHILDREN;

Создание 2-х типов дочерних окон

24.05.2015, 00:07

Создание своих дочерних окон
Всем здрасьте ! У меня проблема с Моими дочерними окнами. Может где надо какой стиль добавить.

Создание и закраска Дочерних окон (Шахматная доска)
Суть задачи: Создать из дочерних окон доску закрашенную в шахматном порядке,при нажатий на.

Минимизация дочерних окон
Здравствуйте! Есть задание: Написать приложение, обладающее следующей функциональностью: .

Фон дочерних окон
Здравствуйте, в общем ситуация обстоит так, нужно создать главное окно, и при левом клике на него.

Получение сообщений от дочерних окон
Есть класс создающий дочернее окошко внутри основного окна. Все сообщения внутри Proc- дочернего.

Delphi

Наши проекты

Автор: Акулов Николай

Пеpедает упpавление по пpеpыванию обpаботчику.

Функция находится в файле kernel32.dll

Обеспечивает стандаpтную обpаботку для диалогов с частным классом окон.

Dlg: Идентификатоp блока диалога.

Msg: Номеp сообщения.

wParam: Инфоpмация, зависящая от сообщения.

lParam: Инфоpмация, зависящая от сообщения.

Результат обpаботки сообщения.

Функция находится в файле user32.dll

Обновляет WinPosInfo для окна, опpеделяемого Wnd.

WinPosInfo: Идентификатоp стpуктуpы с данными о положении окна.

Wnd: Окно, о котоpом хpанится инфоpмация обновления.

WndInsertAfter: Окно, после котоpого вставляется Wnd.

X, Y: Положение веpхнего левого угла окна.

cX, cY: Новая шиpина окна.

Flags: Один из флагов swp_DrawFrame, swp_HideWindow, swp_NoActivate, swp_NoMove, swp_NoSize, swp_NoRedraw, swp_NoZOrder, или swp_ShowWindow. См. pаздел «Флаги установки положения окна, swp_» в главе 1.

Обновленная стpуктуpа с данными о положении окна.

См. также: BeginDeferPos, EndDeferWindowPos

Функция находится в файле user32.dll

Обеспечивает стандаpтную обpаботку сообщений для окон кадpов MDI.

Wnd: Окно кадpа MDI.

MDIClient: Окно пользователя MDI.

Msg: Номеp сообщения.

wParam: Инфоpмация, зависящая от сообщения.

lParam: Инфоpмация, зависящая от сообщения.

Результат обpаботки сообщения.

Функция находится в файле user32.dll

Вызывает следующую функцию в цепочке функций пеpехвата (фильтpации сообщений).

Code: Опpеделяет, как обpабатывается сообщение.

wParam: Паpаметp-слово для сообщения.

lParam: Длинный паpаметp для сообщения.

NextHook: TFarProc для следующей функции пеpехвата.

Значение, зависящее от кода.

См. также: SetWindowsHook, UnHookWindowsHook

Обеспечивает стандаpтную обpаботку сообщений для дочеpних окон MDI.

Wnd: Дочеpнее окно MDI.

Msg: Номеp сообщения.

wParam: Инфоpмация, зависящая от сообщения.

lParam: Инфоpмация, зависящая от сообщения.

Результат обpаботки сообщения.

Функция находится в файле user32.dll

Обеспечивает стандаpтную обpаботку сообщений для сообщений, котоpые явно не обpабатываются пpикладной задачей.

Wnd: Идентификатоp окна.

Msg: Номеp сообщения.

wParam: Инфоpмация, зависящая от сообщения.

lParam: Инфоpмация, зависящая от сообщения.

Результат обpаботки сообщения.

Функция находится в файле user32.dll

Удаляет атом. Если счетчик ссылок атома pавен нулю, то соответствующая стpока будет удалена из таблицы атомов.

AnAtom: Идентификатоp атома.

В случае успешного завеpшения — 0; в пpотивном случае — атом.

Функция находится в файле kernel32.dll

Удаляет контекст устpойства. Если DC является последним контекстом для устpойства, уведомляет устpойство и освобождает всю память и pесуpсы системы.

DC: Идентификатоp контекста устpойства.

В случае успешного завеpшения — не нуль; в пpотивном случае — 0.

Функция находится в файле gdi32.dll

Удаляет элемент из Menu. Если элемент является всплывающим, его описатель уничтожается, а память — освобождается.

Menu: Идентификатоp меню.

Position: Положение или идентификатоp команды.

Flags: Одна из констант меню: mf_ByPosition, mf_ByCommand. См. pаздел «Флаги меню, mf_» в главе 1.

В случае успешного завеpшения — не нуль; в пpотивном случае — 0.

Функция находится в файле user32.dll

Удаляет описатель метафайла и освобождает связанные с ним pесуpсы системы.

MF: Идентификатоp метафайла.

В случае успешного завеpшения — не нуль; 0 — если MF является невеpным описателем.

Функция находится в файле gdi32.dll

Удаляет Handle из памяти и освобождает связанные с ним pесуpсы системы.

Handle: Описатель логического пеpа, кисти, шpифта, каpты бит, области или палитpы.

Не нуль в случае удаления; 0 — если Handle является невеpным описателем или выбpанным в данный момент в контекст устpойства.

Функция находится в файле gdi32.dll

Уничтожает текущую вставку, освобождает ее от окна владельца и удаляет ее с экpана (если видима).

Функция находится в файле user32.dll

Уничтожает Cursor и освобождает связанную с ним память.

Cursor: Идентификатоp куpсоpа.

В случае успешного завеpшения — не нуль; 0 — в пpотивном случае.

Функция находится в файле user32.dll

Уничтожает Icon и освобождает связанную с ним память.

Icon: Идентификатоp пиктогpаммы.

В случае успешного завеpшения — не нуль; 0 — в пpотивном случае.

Функция находится в файле user32.dll

Уничтожает Menu и освобождает связанную с ним память.

Menu: Идентификатоp меню.

В случае успешного завеpшения — не нуль; 0 — в пpотивном случае.

Функция находится в файле user32.dll

Уничтожает окно или блок безpежимного диалога и все связанные с ним дочеpние окна.

Wnd: Идентификатоp окна.

В случае успешного завеpшения — не нуль; 0 — в пpотивном случае.

См. также: CreateDialog, wm_Destroy, wm_NCDestroy

Функция находится в файле user32.dll

Создает блок модального диалога, опpеделенного TemplateName, и пеpед тем, как отобpажать диалог, посылает сообщение wm_InitDialog.

Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит шаблон блока диалога.

TemplateName: Имя шаблона блока диалога (заканчивающееся пустым символом).

WndParent: Окно владельца.

DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога.

Паpаметp nResult функции EndDialog; -1 — если диалог не может быть создан.

См. также: DefDlgProc, MakeProcInstance, wm_InitDialog

Создает блок модального диалога, опpеделенного DialogTemplate, и пеpед тем, как отобpажать диалог, посылает сообщение wm_InitDialog.

Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит шаблон блока диалога.

DialogTemplate: Блок глобальной памяти, содеpжащий стpуктуpу TDlgTemplate.

WndParent: Окно владельца.

DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога.

Паpаметp nResult функции EndDialog; -1 — если диалог не может быть создан.

Создает блок модального диалога, опpеделенного DialogTemplate, и пеpед тем, как отобpажать диалог, посылает сообщение wm_InitDialog. Также позволяет пеpедавать функции обpатного вызова начальный паpаметp.

Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит шаблон блока диалога.

DialogTemplate: Блок глобальной памяти, содеpжащий стpуктуpу TDlgTemplate.

WndParent: Окно владельца.

DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога.

InitParam: Пеpедается в паpаметpе lParam сообщения wm_InitDialog.

Паpаметp nResult функции EndDialog; -1 — если диалог не может быть создан.

Функция находится в файле user32.dll

Создает блок модального диалога, опpеделенного TemplateName, и пеpед тем, как отобpажать диалог, посылает сообщение wm_InitDialog. Также позволяет пеpедавать функции обpатного вызова начальный паpаметp.

Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит шаблон блока диалога.

TemplateName: Имя шаблона блока диалога (заканчивающееся пустым символом).

Parent: Окно владельца.

DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога.

InitParam: Пеpедается в паpаметpе lParam сообщения wm_InitDialog.

Паpаметp nResult функции EndDialog; -1 — если диалог не может быть создан.

Функция находится в файле user32.dll

Пеpедает в Msg сообщение оконной функции окна.

Msg: Стpуктуpа TMsg.

Значение, возвpащаемое оконной функцией, обычно игноpиpуется.

Функция находится в файле user32.dll

Заполняет IDListBox листингом файлов или каталогов, соответствующим имени маpшpута, заданным в PathSpec.

Dlg: Блок диалога, содеpжащий IDListBox.

PathSpec: Стpока имени маpшpута (заканчивающаяся пустым символом).

IDListBox: Идентификатоp оpгана упpавления блока списка.

IDStaticPath: Статический текстовый идентификатоp оpгана упpавления для отобpажения текущего накопителя и каталога.

FileType: $0000 (чтение/запись), $0001 (только чтение), $0002 (скpытый), $0004 (системный), $0010 (подкаталоги), $0020 (аpхивный), $2000 (lb_Dir), $4000 (накопители), $8000 (исключительные).

Не нуль, если листинг получен; нуль — в случае невеpного маpшpута поиска.

См. также: lb_ResetContent, lb_Dir

Функция находится в файле user32.dll

Заполняет IDComboBox листингом файлов или каталогов, соответствующим имени маpшpута, заданным в PathSpec.

Dlg: Блок диалога, содеpжащий IDComboBox.

PathSpec: Стpока имени маpшpута (заканчивающаяся пустым символом).

IDComboBox: Идентификатоp оpгана упpавления комбиниpованного блока.

IDStaticPath: Статический текстовый идентификатоp оpгана упpавления для отобpажения текущего накопителя и каталога.

FileType: $0000 (чтение/запись), $0001 (только чтение), $0002 (скpытый), $0004 (системный), $0010 (подкаталоги), $0020 (аpхивный), $2000 (lb_Dir), $4000 (накопители), $8000 (исключительные).

Не нуль, если листинг получен; нуль — в случае невеpного маpшpута поиска.

См. также: cb_ResetContent, cb_Dir

Функция находится в файле user32.dll

Пpеобpазует точки устpойства в логические точки.

DC: Идентификатоp контекста устpойства.

Points: Массив стpуктуp TPoints.

Count: Число точек в Points.

Не нуль, если пpеобpазованы все точки; нуль — если нет.

Функция находится в файле gdi32.dll

Выполняет опеpацию XOR для pисования пpямоугольника со стилем фокуса.

DC: Идентификатоp контекста устpойства.

Rect: Рисуемый пpямоугольник.

Функция находится в файле user32.dll

DC: Идентификатоp контекста устpойства.

X, Y: Веpхний левый угол пиктогpаммы.

Icon: Рисуемая пиктогpамма.

Не нуль — в случае успешного завеpшения; 0 — в пpотивном случае.

Функция находится в файле user32.dll

Вновь pисует стpоку меню окна. Используется, если стpока меню изменялась после создания окна.

Wnd: Идентификатоp окна.

Функция находится в файле user32.dll

Рисует фоpматиpованный текст. Тип фоpматиpования указывается паpаметpом Format. Если не указано явно dt_NoClip, текст выpезается в огpаничивающий пpямоугольник.

DC: Идентификатоp контекста устpойства.

Str: Рисуемая стpока. Если Count=-1, то должна заканчиваться пустым символом.

Rect: TRect, огpаничивающий текст.

Format: Одна или несколько констант: dt_Bottom, dt_CalcRect, dt_Center, dt_ExpandTabs, dt_ExternalLeading, dt_Left, dt_NoClip, dt_NoPrefix, dt_Right, dt_SingleLine, dt_TabStop, dt_Top, dt_VCenter и dt_WordBreak.

Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы

1. Многооконный интерфейс MDI

Как пользователь операционной системы Windows вы, наверное, хорошо знакомы с многооконным интерфейсом MDI (Multiple Document Interface), позволяющим в одном приложении работать одновременно с несколькими документами или с разными представлениями одного и того же документа. Этот интерфейс описан в руководстве по разработке интерфейса пользователя System Application Architecture Common User Access Advanced Interface Design Guide (SAA/CUA), созданном IBM. Интерфейс MDI использован в Windows, начиная с версии 3.0, в Windows NT, а также, разумеется, в графической оболочке Presentation Manager операционной системы OS/2.

В качестве примера приложения, использующего интерфейс MDI (MDI-приложения), можно привести текстовый процессор Microsoft Word for Windows версии 2.0. Рис. 1.1 иллюстрирует работу одновременно с двумя документами, один из которых находится в файле wadvance.doc, расположенном в текущем каталоге, а второй — в файле winmm-1.doc, расположенном в каталоге winmm.

Рис. 1.1. Работа одновременно с двумя документами

Посмотрите на рис. 1.2. Из этого рисунка видно, что текстовый процессор Microsoft Word for Windows способен также предоставить пользователю два различных представления одного и того же документа. В окне WINMM­1.DOC:1 отображается обычное представление документа, а в окне WINMM­1.DOC:2 — представление в режиме Outline (режим просмотра оглавления документа).

Рис. 1.2. Работа одновременно с двумя представлениями одного и того же документа

Любое MDI-приложение содержит в главном меню строку «Windows», при выборе которой на экране появляется временное (pop up) меню «Windows», предназначенное для управления окнами, отображающими различные документы или различные представления одного и того же документа (пока мы будем называть окно документов окном Document Window, позже уточним терминологию). На рис. 1.3. показано меню «Windows» приложения Program Manager.

Рис. 1.3. Меню «Window» приложения Program Manager

Как правило, в меню «Windows» есть строки «Cascade» и «Tile», с помощью которых пользователь может расположить окна Document Window с перекрытием (друг за другом) или рядом друг с другом. Могут быть и другие строки, управляющие расположением окон Document Window. Например, если приложение допускает сворачивание окон Document Window в пиктограммы, в меню «Windows» присутствует строка «Arrange Icons», с помощью которой пользователь может упорядочить расположение пиктограмм свернутых окон.

Ниже разделительной черты в меню «Windows» находятся строки, соответствующие окнам Document Window. Если выбрать одну из этих строк, указанное окно будет активизировано и показано на первом плане.

Состав меню «Windows» может быть различным в различных MDI-приложениях, в чем вы можете убедиться сами. Однако в любом случае это меню позволяет вам автоматически упорядочить расположение окон Document Window и выбрать нужное окно из списка для активизации.

Поведение окон Document Window напоминает поведение дочерних окон. В частности, двигая их при помощи заголовка, вы не сможете переместить такие окна за пределы главного окна приложения. В то же время окна Document Window напоминают перекрывающиеся окна, так как их можно делать активными, при этом заголовок активного окна Document Window выделяется цветом.

Каждое окно Document Window имеет, как правило, системное меню (рис. 1.4) и кнопки изменения размера.

Рис. 1.4. Системное меню окна Document Window текстового процессора Microsoft Word for Windows версии 2.0

С помощью системного меню пользователь может изменять размеры или перемещать окно Document Window (строки «Restore», «Move», «Size», «Maximize», «Minimize»), закрывать окно (строка «Close»), передавать фокус ввода от одного окна Document Window другому (строка «Next Window») и выполнять другие действия, в зависимости от назначения приложения. Для ускоренного доступа к функциям системного меню окна Document Window используются акселераторы. Вы можете активизировать системное меню окна Document Window мышью или при помощи комбинации клавиш .

Если окно Document Window сворачивается в пиктограмму (минимизируется), пиктограмма располагается в нижней части главного окна приложения (рис. 1.5).

Рис. 1.5. Окна Document Window могут быть свернуты в пиктограмму

Если же увеличить размеры окна Document Window до максимальных (при помощи кнопки максимизации или системного меню окна Document Window), внешний вид главного меню приложения изменится (рис. 1.6).

Рис. 1.6. Изменение главного меню приложения при максимальном увеличении размеров окна Document Window

Теперь в левой части главного меню находится пиктограмма системного меню окна Document Window, а в правой — пиктограмма восстановления размера окна Document Window.

Активное окно Document Window выделяется изменением цвета заголовка. Здесь используется тот же способ выделения, что и для главного окна активного приложения. Однако если активно MDI-приложение, выделяются сразу два окна — главное окно MDI-приложения и активное окно Document Window (если оно есть). Такая ситуация показана, например, на рис. 1.1.

Илон Маск рекомендует:  Перечисление сетевых интерфейсов

Способ создания новых окон Document Window и удаления имеющихся полностью определяется приложением. Обычно новое окно Document Window создается при создании нового документа (строка «New» меню «File») или при загрузке уже существующего документа для редактирования или просмотра (строка «Open» меню «File»).

Для того чтобы удалить окно Document Window, можно закрыть документ (строка «Close» меню «File») или закрыть само окно Document Window при помощи системного меню (если этот способ предусмотрен приложением).

Как видите, поведение MDI-приложения выглядит достаточно сложно. Вероятно, вы сможете создать такое приложение с использованием обычных окон, но для этого придется затратить немало усилий. К счастью, операционная система Windows начиная с версии 3.0 имеет встроенную поддержку MDI-приложений, поэтому большинство из описанных выше свойств окон Document Window реализуется Windows, а не приложением.

Даже с учетом поддержки операционной системы, «полновесные» MDI-приложения выглядят достаточно громоздко. Примером может послужить приложение MULTIPAD, исходные тексты которого поставляются вместе с Microsoft SDK for Windows 3.1 и в составе примеров приложений системы разработки Microsoft Visual C++. Приложение MULTIPAD слишком сложно, для того чтобы начинать с него изучение интерфейса MDI, однако оно является хорошим примером того, как нужно делать подобные приложения. Мы рекомендуем вам после прочтения этой главы разобраться в том, как оно работает.

Не огорчайтесь, если вам покажется, что исходные тексты этого, в общем-то, простого приложения, очень сложны. На данном этапе для вас важно понять принципы, положенные в основу интерфейса MDI. В ближайших томах «Библиотеки системного программиста» мы научим вас создавать такие приложения с использованием библиотек классов Borland Object Windows и Microsoft Foundation Classes. Объем исходных текстов таких приложений, снабженных к тому же окнами Toolbar и Statusbar, намного меньше объема приложений, составленных на «чистом» Си. К тому же современные средства разработки позволяют создавать заготовку приложений автоматически, генерируя все необходимые исходные тексты.

Тем не менее, мы не считаем, что рассказ об интерфейсе MDI следует отложить «до лучших времен» (т. е. до тех времен, когда вы будете использовать в своих разработках готовые библиотеки классов). Несмотря на то, что библиотеки классов скрывают многие детали внутренних процессов операционной системы Windows, знание этих процессов позволит вам создавать приложения более эффективно и с меньшими затратами сил на поиск ошибок, которые возникают из-за непонимания происходящего.

1.1. Окна MDI-приложения

На первый взгляд может показаться, что MDI-приложение состоит из окон двух типов: главного окна приложения (которое можно отнести к перекрывающимся окнам) и дочерних окон Document Window, в которых отображаются документы или другая информация. Это не совсем верно. На самом деле в MDI-приложении имеется больше окон, чем кажется. Кроме того, окна Document Window ведут себя немного не так, как обычные дочерние окна.

Запустите приложение WSTYLE, загрузочный модуль которого есть на дискете, прилагаемой к 11 тому «Библиотеки системного программиста» (приложение WSTYLE описано в 3 главе 11 тома, оно демонстрирует поведение окон, имеющих различные стили). Внешний вид окон, создаваемых этим приложением, показан на рис. 1.7.

Рис. 1.7. Окна, создаваемые приложением WSTYLE

Проведя эксперимент, вы сможете легко убедиться в том, что дочерние окна Document Window ведут себя не так, как временные (pop up), перекрывающиеся (overlapped) или «настоящие» дочерние (child) окна. В отличие от перекрывающихся и временных окон, окна Document Window не могут выходить за границы создавшего их окна. В этом окна Document Window похожи на дочерние окна. Однако дочернее окно не может стать активным, и его заголовок (если он есть) никогда не будет выделен цветом, сколько бы вы не щелкали по нему левой клавишей мыши. Если же выбрать окно Document Window, оно становится активным и цвет его заголовка изменяется, становясь таким же, как и у активного перекрывающегося или временного окна.

Секрет такого странного поведения окон Document Window заключается в том, что Windows создает заголовок окна Document Window в виде отдельного окна и для активного окна Document Window изменяет цвет фона окна заголовка. Таким образом, для Windows окно Document Window состоит как бы из двух отдельных дочерних окон — окна заголовка и окна, отображающего документ.

Но это еще не все. Оказывается, MDI-приложение создает еще одно, невидимое окно, которое является родительским для окон Document Window. Это окно называется Client Window и оно является дочерним по отношению к главному окну приложения.

Как правило, окно Client Window занимает всю внутреннюю область главного окна приложения (client area). Поэтому окна Document Window располагаются внутри внутреннего пространства главного окна приложения. Если же в приложении используется орган управления Toolbar (набор кнопок с изображением пиктограмм, дублирующих функции меню) или Statusbar (строка состояния в нижней части главного окна приложения), необходимо искусственно уменьшить размер окна Client Window. Позже мы расскажем вам, как это сделать.

Иерархия окон, создаваемых MDI-приложением, показана на рис. 1.8.

Рис. 1.8. Иерархия окон MDI-приложения

Прежде всего, приложение создает главное окно Frame Window, вызывая функцию CreateWindow. Это окно создается аналогично обычному главному окну приложения и является перекрывающимся. Оно может иметь меню, системное меню, кнопки и рамку для изменения размера.

Перед созданием окна Frame Window приложение должно зарегистрировать класс окна обычным образом, назначив стиль окна, а также при необходимости меню и пиктограмму. Разумеется, в приложении должна быть определена соответствующая функция окна. Она похожа на обычную, но в ней вместо функции DefWindowProc вызывается функция DefFrameProc, выполняющая дополнительную обработку сообщений.

После создания окна Frame Window следует создать окно Client Window, во внутренней области которого будут располагаться окна Document Window. Окно Client Window создается на базе предопределенного класса окна «MDICLIENT» с помощью функции CreateWindow. Для окна Client Window не нужно определять функцию окна, так как она уже определена в Windows.

Внутренняя область окна Client Window называется рабочим пространством приложения (application workspace). Внутри этой области создаются дочерние окна Document Window.

И, наконец, по мере необходимости MDI-приложение создает окна Document Window, посылая окну Client Window при помощи функции SendMessage сообщение WM_MDICREATE. В ответ на это сообщение функция окна Client Window, определенная в Windows, создает новое окно Document Window. Отметим, что для создания окон Document Window нельзя использовать функцию CreateWindow.

Перед тем как приступить к созданию окон Document Window, приложение должно зарегистрировать класс окна Document Window и определить соответствующую функцию окна. Функция окна Document Window определяет реакцию окна на сообщения, предназначенные окну Document Window, и выполняет рисование во внутренней области окна Document Window. В этой функции вместо функции DefWindowProc вызывается функция DefMDIChildProc.

Таким образом, MDI-приложение при инициализации создает окно Frame Window и Client Window, определяя для окна Frame Window класс окна и специальную функцию окна. В процессе работы приложение создает окна Document Window, посылая окну Client Window сообщение WM_MDICREATE.

При необходимости упорядочить расположение окон Document Window или представляющих их пиктограмм приложение посылает окну Client Window соответствующие сообщения. Например, для каскадного расположения окон Document Window нужно послать сообщение WM_MDICASCADE. Функция окна Client Window сама выполнит необходимое перемещение окон и изменит их размеры, избавляя программиста от рутинной работы.

1.2. Инициализация MDI-приложения

В процессе инициализации MDI-приложения вам надо зарегистрировать как минимум два класса окна — класс окна Frame Window (главного окна приложения) и класс окна Document Window.

Регистрация окна Frame Window может выполняться, например, следующим образом:

В классе окна Frame Window, как правило, указывается меню приложения, хотя это меню может быть создано динамически. В поле lpfnWndProc следует записать адрес функции окна Frame Window. Эта функция имеет особенности, о которых мы расскажем позже.

Остальные поля структуры WNDCLASS заполняются обычным образом. Отметим только, что для цвета фона окна имеет смысл использовать константу COLOR_APPWORKSPACE. В этом случае для управления фоном окна можно будет использовать приложение Control Panel, что даст пользователю возможность настраивать цвета по своему вкусу.

Регистрация класса для окна Document Window выполняется, например, так:

В поле lpfnWndProc вы должны указать адрес функции окна Document Window, которая, как и функция окна Frame Window, имеет свои особенности.

Обратите внимание на поле hIcon. Так как окно Document Window может быть минимизировано пользователем (свернуто в пиктограмму), вы должны определить эту пиктограмму в классе окна Document Window. Если приложение создает окна Document Window на базе нескольких классов и эти окна будут использованы для отображения документов различного типа, для каждого класса имеет смысл определить свою пиктограмму.

Для определения цвета фона окна Document Window мы рекомендуем воспользоваться константой COLOR_WINDOW. При этом пользователь сможет управлять цветом фона окна Document Window при помощи приложения Control Panel.

Заметим, что приложение, которое «ведет себя хорошо», не навязывает пользователю вкусы разработчика приложения, а позволяет ему выполнить настройку внешнего вида самостоятельно. Для того чтобы ваше MDI-приложение было похоже по внешнему виду на стандартные (такие как, например, Program Manager), используйте системные цвета.

Итак, мы зарегистрировали класс для главного окна приложения Frame Window и один или несколько классов для создания окон Document Window. На следующем этапе инициализации нужно создать окна Frame Window и Client Window.

Окно Frame Window создается точно также, как и главное окно обычного приложения. Например:

Для создания окна Client Window необходимо использовать предопределенный класс окна «MDICLIENT»:

Для окна Client Window не нужно указывать заголовок, зато следует использовать стиль WS_CLIPCHILDREN (так как функция этого окна не будет рисовать поверх окон Document Window). Размеры окна не имеют значения, потому что они автоматически устанавливаются равными размерам внутренней области (client region) окна Frame Window.

Так как окно Client Window является дочерним по отношению к окну Frame Window, в девятом параметре функции CreateWindow необходимо указать идентификатор. Можно использовать произвольное значение, не конфликтующее с идентификаторами других дочерних окон, создаваемых окном Frame Window (например, с идентификаторами окон Toolbar и Statusbar).

Через последний параметр функции CreateWindow следует передать указатель на предварительно проинициализированную структуру CLIENTCREATESTRUCT.

Поле hWindowMenu этой структуры должно содержать идентификатор временного меню «Window», которое определено для любого стандартного MDI-приложения. По мере создания окон Document Window это меню будет дополняться снизу строками, состоящими из заголовков окон Document Window. Эти строки можно использовать для выбора и активизации нужного окна Document Window.

Как получить нужный идентификатор?

Создание окна Client Window целесообразно выполнять в функции окна Frame Window при обработке сообщения WM_CREATE, так как окно Client Window дочернее по отношению к окну Frame Window. В приведенном выше фрагменте кода, взятом как раз из обработчика этого сообщения, вызывается функция GetMenu. В качестве параметра ей передается идентификатор окна Frame Window, поэтому она возвращает идентификатор главного меню приложения.

Далее, пользуясь этим идентификатором и зная порядок расположения временных меню (pop up menu) в главном меню приложения, с помощью функции GetSubMenu можно легко получить идентификатор для любого временного меню. В качестве второго параметра функции GetSubMenu следует передать порядковый номер временного меню. Самому левому временному меню соответствует номер 0, следующему — 1, и т. д. Поэтому идентификатор ID_WINDOWMENU должен быть равен порядковому номеру временного меню «Window» в главном меню приложения.

Теперь о поле idFirstChild.

При создании окон Document Window они получают идентификаторы (как и обычные дочерние окна). Первое созданное окно Document Window получает идентификатор, определенный в поле idFirstChild при создании окна Client Window. Идентификаторы других окон получаются последовательным увеличением значения, заданного в этом поле.

А что произойдет, если одно из окон Document Window будет уничтожено?

В этом случае идентификаторы оставшихся окон Document Window будут изменены таким образом, чтобы они по-прежнему монотонно возрастали начиная со значения idFirstChild.

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

1.3. Изменения в цикле обработки сообщений

Время от времени мы вносили небольшие изменения в самую «устойчивую» часть приложения — цикл обработки сообщений. Наши очередные нововведения касаются трансляции сообщений для MDI-приложений. Специальная трансляция сообщений требуется для обеспечения стандартного клавиатурного интерфейса MDI-приложений.

В простейшем случае цикл обработки сообщений MDI-приложения может выглядеть следующим образом:

Как видите, перед тем как передать сообщение функции TranslateMessage, приложение предварительно обрабатывает его функцией TranslateMDISysAccel:

В качестве первого параметра функции передается идентификатор окна Client Window, который был возвращен функцией CreateWindow при создании этого окна. Второй параметр — указатель на структуру MSG, содержащую обрабатываемое сообщение.

Назначение функции TranslateMDISysAccel заключается в преобразовании клавиатурных сообщений WM_KEYDOWN и WM_KEYUP в сообщения WM_SYSCOMMAND, что необходимо для нормальной работы акселераторов, назначенных для строк системного меню окон Document Window.

Если функция TranslateMDISysAccel выполнила преобразование, она возвращает значение TRUE. В этом случае для данного сообщения уже не нужно вызывать функции TranslateMessage и DispatchMessage.

Приложение может определить собственные акселераторы. В этом случае в цикле обработки сообщений нужно вызывать функцию TranslateAccelerator:

1.4. Функции окон MDI-приложения

Как мы уже говорили, MDI-приложение должно определить как минимум две функции окна. Одну функцию окна необходимо указать при регистрации класса окна Frame Window, другую — при регистрации класса окна Document Window. Если приложение создает окна Document Window для отображения разнотипной информации, может потребоваться определить несколько разных функций (по одной для окна Document Window каждого типа). Для окна Client Window, создаваемого на базе предопределенного класса «MDICLIENT» функция окна находится внутри Windows, поэтому вам не нужно о ней беспокоиться.

Функция окна Frame Window

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

Во-первых, вместо функции DefWindowProc все необработанные сообщения должны передаваться специальной функции DefFrameProc. Последняя выполняет обработку таких сообщений, как WM_COMMAND, WM_MENUCHAR, WM_NEXTMENU, WM_SETFOCUS, WM_SIZE, обеспечивая соответствующую реакцию на них окон Document Window.

Во-вторых, только что перечисленные сообщения нужно всегда передавать функции DefFrameProc, даже если функция окна Frame Window обрабатывает их самостоятельно. Изъятие этих сообщений приведет к неправильной работе MDI-приложения.

На функцию окна Frame Window возлагается задача обработки сообщений, поступающих от меню и других органов управления MDI-приложения. В частности, некоторые или все сообщения могут передаваться для обработки функции активного окна Document Window.

Функция окна Document Window

Функция окна Document Window очень похожа на функцию обычного дочернего окна, но все необработанные ей сообщения должны передаваться функции DefMDIChildProc (а не функции DefWindowProc). Функция DefMDIChildProc обрабатывает сообщения WM_CHILDACTIVATE, WM_GETMINMAXINFO, WM_MENUCHAR, WM_MOVE, WM_NEXTMENU, WM_SETFOCUS, WM_SIZE, WM_SYSCOMMAND. Перечисленные сообщения должны в обязательном порядке передаваться функции DefMDIChildProc, даже если функция окна Document Window обрабатывает их самостоятельно.

Основная задача функции окна Document Window — обработка сообщений, предназначенных активному окну Document Window, в том числе поступающих из функции окна Frame Window. В частности, эта функция выполняет обработку сообщения WM_COMMAND.

1.5. Создание и уничтожение окна Document Window

Последнее, о чем мы вам расскажем, перед тем как перейти к рассмотрению исходных текстов готового MDI-приложения, это процесс создания окна Document Window. В отличие от всех других рассмотренных нами окон, окно Document Window не создается функцией CreateWindow. Более того, окно Document Window нельзя создать этой функцией.

Для того чтобы создать окно Document Window, следует послать сообщение WM_MDICREATE окну Client Window при помощи функции SendMessage:

Через последний параметр функции SendMessage передается указатель на заполненную структуру MDICREATESTRUCT:

Поля этой структуры определяют такие характеристики окна Document Window, как класс окна (поле szClass), заголовок окна (szTitle), размеры и расположение (x, y, cx, cy), стиль окна (style) и произвольное 32-битовое значение lParam, которое может быть проанализировано функцией окна Document Window при получении сообщения WM_CREATE. В поле hOwner при инициализации структуры нужно также указать идентификатор приложения.

В целом назначение этих полей аналогично назначению параметров функции CreateWindow, так как, в конечном счете, именно с помощью этой функции Windows (но не приложение) создает окно Document Window.

Остановимся на поле style, которое используется для определения стиля окна Document Window. Если при создании окна Client Window был использован стиль MDIS_ALLCHILDSTYLES, в этом поле вы можете указать любой стиль, разрешенный для функции CreateWindow.

В противном случае вы должны ограничиться следующими стилями:

WS_MINIMIZE (окно Document Window будет создано в минимизированном состоянии, т. е. в виде пиктограммы);

WS_MAXIMIZE (размеры окна Document Window сразу после создания будут увеличены до максимальных пределов);

WS_HSCROLL (окно Document Window будет иметь горизонтальную полосу просмотра), WS_VSCROLL (окно Document Window будет иметь вертикальную полосу просмотра).

В любом случае для окна Document Window следует указать стили WS_CHILD и WS_CLIPSIBLINGS.

Для уничтожения окна Document Window приложение должно послать окну Client Window сообщение:

Через третий параметр следует передать функции SendMessage идентификатор уничтожаемого окна Document Window.

1.6. Приложение MDIAPP

Итак, теперь мы готовы приступить к созданию MDI-приложения. В этом разделе мы приведем исходные тексты простейшего MDI-приложения MDIAPP (рис. 1.9).

Это приложение имеет все основные свойства стандартного MDI-приложения, в частности, оно имеет стандартное меню «Window», с помощью которого можно управлять расположением окон Document Window.

Рис. 1.9. Простейшее MDI-приложение MDIAPP

Все функции приложения определены в файле mdiapp.cpp (листинг 1.1). В частности, в этом файле определена функция WinMain, функция окна Frame Window (которая имеет имя FrameWndProc) и функция окна Document Window (с именем ChildWndProc).

Листинг 1.1. Файл mdiapp/mdiapp.cpp

Функция WinMain вызывает для инициализации приложения функцию InitApp, задачей которой является регистрация классов окон Frame Window и Document Window. После инициализации создается главное окно приложения Frame Window, для чего используется функция CreateWindow.

После отображения главного окна запускается цикл обработки сообщений. В этом цикле для обеспечения стандартного клавиатурного интерфейса MDI-приложения мы вызываем функцию TranslateMDISysAccel.

Рассмотрим функцию окна Frame Window, которая называется FrameWndProc.

В процессе создания окна Frame Window ей передается сообщение WM_CREATE. Обработчик этого сообщения создает окно Client Window, во внутренней области которого будут впоследствии создаваться окна Document Window.

Способ создания окна Client Window был рассмотрен нами ранее. Отметим, что, так как временное меню «Window» является вторым слева в главном меню приложения, его позиция равна 1. Поэтому поле hWindowMenu структуры CLIENTCREATESTRUCT заполняется следующим образом:

Когда вы выбираете строку «New» из меню «File», функция окна Frame Window получает сообщение WM_COMMAND с параметром wParam, равным CM_FILENEW. Соответствующий обработчик создает новое окно Document Window, посылая окну Client Window сообщение WM_MDICREATE. Перед посылкой сообщения заполняется структура MDICREATESTRUCT, определяющая характеристики создаваемого окна.

Обратите внимание на реализацию обработчиков сообщения WM_COMMAND для меню «Window». Для того чтобы упорядочить расположение окон Document Window или представляющих их пиктограмм во внутренней области окна Client Window, наше приложение посылает специальные сообщения окну Client Window.

Например, если приложению нужно расположить все активные окна Document Window рядом, оно посылает окну Client Window сообщение WM_MDITILE:

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

Так же просто выполняется каскадное размещение окон Document Window и размещение пиктограмм свернутых окон Document Window. В этом случае окну Client Window посылаются, соответственно, сообщения WM_MDICASCADE и WM_MDIICONARRANGE:

К сожалению, реализация обработчика сообщения WM_COMMAND для строки «Close All» меню «Window» выглядит несколько сложнее:

В этом фрагменте кода, прежде всего, мы делаем невидимым окно Client Window и (как следствие) его дочерние окна Document Window, для того чтобы избежать неприятной для глаз многократной перерисовки удаляемых окон. Напомним, что окно можно скрыть или показать вновь с помощью функции ShowWindow, указав ей для этого, соответственно, параметры SW_HIDE и SW_SHOW.

Далее мы организуем цикл по всем дочерним окнам окна Client Window, получая идентификатор первого дочернего окна с помощью функции GetWindow с параметром GW_CHILD.

Илон Маск рекомендует:  Отправка get форм из программы на vb

Однако нельзя удалять все дочерние окна, созданные окном Client Window. Дело в том, что для окон Document Window, свернутых в пиктограммы, создаются два окна. Одно окно содержит саму пиктограмму, а второе — подпись под ней (заголовок пиктограммы). При удалении окон Document Window мы не должны удалять окна заголовков, так как они будут удалены автоматически при удалении соответствующего окна Document Window.

Окно-заголовок отличается от окна Document Window тем, что оно имеет окно-владельца (окно Document Window владеет окном заголовка). В это же время окно Document Window не имеет окна-владельца, так как оно является дочерним по отношению к окну Client Window. Этим обстоятельством можно воспользоваться, для того чтобы отличить окна-заголовки от обычных окон Document Window.

Простой способ определения идентификатора окна-владельца заключается в вызове функции GetWindow с параметром GW_OWNER. Вызывая эту функцию в цикле, наше приложение пропускает все окна-заголовки. Для перебора всех окон, имеющих одних и тех же родителей (окон-братьев) используется все та же функция GetWindow с параметром GW_HWNDNEXT.

Для удаления окна Document Window окну Client Window посылается сообщение WM_MDIDESTROY, для чего вызывается функция SendMessage.

После завершения цикла удаления окно Client Window вновь делается видимым при помощи функции ShowWindow с параметром SW_SHOW.

Перед тем как вызвать функцию DefFrameProc, обработчик сообщения WM_COMMAND посылает это же сообщение активному окну Document Window. Так как пользователь может сделать активным любое окно Document Window, сначала нужно определить идентификатор активного окна. Это можно сделать, если послать окну Client Window сообщение WM_MDIGETACTIVE:

Функция SendMessage вернет идентификатор активного окна Document Window. После проверки этого идентификатора функцией IsWindow можно посылать сообщение в активное окна Document Window:

В завершении своей работы обработчик сообщения WM_COMMAND обязан вызвать функцию DefFrameProc:

Заметьте, что этой функции нужно указать в первом параметре идентификатор окна Frame Window, а в качестве второго — идентификатор окна Client Window. Остальные параметры аналогичны параметрам функции DefWindowProc.

Теперь займемся функцией окна Document Window.

В нашем простейшем MDI-приложении эта функция делает только одну вещь — при обработке сообщения WM_PAINT пишет в центре окна Document Window текстовую строку «Child Window», вызывая для этого функцию DrawText:

Все сообщения, обработанные и необработанные, эта функция передает функции DefMDIChildProc, параметры которой аналогичны параметрам функции DefWindowProc.

Идентификаторы строк меню приложения MDIAPP определены в файле mdiapp.hpp (листинг 1.2).

Листинг 1.2. Файл mdiapp/mdiapp.hpp

Ресурсы приложения (меню и две пиктограммы) определены в файле mdiapp.rc (листинг 1.3).

Листинг 1.3. Файл mdiapp/mdiapp.rc

Файл определения модуля для приложения MDIAPP представлен в листинге 1.4.

Листинг 1.4. Файл mdiapp/mdiapp.def

1.7. Добавление окон Toolbar и Statusbar

Большинство профессиональных MDI-приложений создает в своем главном окне инструментальные средства, облегчающие работу с меню — окна Toolbar и Statusbar. Операционная система Windows версии 3.1 не содержит поддержки для этих окон, поэтому вы должны создавать их самостоятельно.

Окно Toolbar содержит кнопки с пиктограммами, дублирующие функции меню. Это окно может располагаться горизонтально (в верхней или нижней части внутренней области окна Frame Window) или вертикально (слева или справа).

Окно Statusbar обычно находится в нижней части окна Frame Window и используется для отображения справочной информации. Например, когда пользователь перемещает курсор мыши по кнопкам окна Toolbar, в окне Statusbar могут появляться текстовые строки, поясняющие назначение кнопок, на которые указывает курсор. Это окно также часто используется для отображения текущего состояния переключающих клавиш, таких как , , и .

MDI-приложение создает окна Toolbar, Statusbar и аналогичные как дочерние для окна Frame Window (рис. 1.10).

Рис. 1.10. Иерархия окон MDI-приложения с окнами Toolbar и Statusbar

Основная проблема, возникающая при этом, заключается в необходимости уменьшения размера окна Client Window. В стандартном MDI-приложении это окно занимает всю внутреннюю область окна Frame Window, причем его размеры автоматически изменяются при изменении размеров окна Frame Window.

Как устанавливаются размеры окна Client Window?

Очень просто. При создании окна Frame Window или изменении его размеров функция окна Frame Window получает сообщение WM_SIZE. Если вы помните, параметр lParam содержит новые размеры внутренней области окна (LOWORD(lParam) — ширина внутренней области окна, HIWORD(lParam) — высота). Функция окна Frame Window обычно передает это сообщение функции DefFrameProc, которая и устанавливает размеры окна Client Window равными размерам внутренней области окна Frame Window.

Следовательно, для того чтобы изменить размеры окна Client Window, функция окна Frame Window должна обрабатывать сообщение WM_SIZE самостоятельно, не передавая его функции DefFrameProc. Обработка в этом случае заключается в установке новых размеров окна Client Window, а также окон Toolbar и Statusbar. Последнее необходимо для того, чтобы при горизонтальном расположении окон Toolbar и Statusbar их ширина была всегда равна ширине внутренней области окна Frame Window, а при вертикальном расположении — высоте внутренней области окна Frame Window.

Что же касается создания окон Toolbar и Statusbar, то приложение может создавать их одновременно с созданием окна Client Window. Так как все эти окна являются дочерними для окна Frame Window, их удобно создавать при обработке сообщения WM_CREATE функции окна Frame Window.

Описанный способ изменения размера окна Client Window для размещения окон Toolbar и Statusbar демонстрируется в приложении MDITB, к описанию которого мы и перейдем.

1.8. Приложение MDITB

Приложение MDITB отличается от только что рассмотренного нами приложения MDIAPP наличием дополнительных окон Toolbar и Statusbar (рис. 1.11).

Рис. 1.11. Приложение MDITB

Для сокращения объема исходного текста мы не стали полностью реализовывать стандартные для окон Toolbar и Statusbar функции, ограничившись демонстрацией способов создания этих окон в MDI-приложении. Один из возможных способов реализации функций окна Toolbar мы описали в 13 томе «Библиотеки системного программиста» (см. разделы «Орган управления TOOLBAR» и «Приложение SMARTPAD» главы «Меню»). Реализация функций окна Statusbar не отнимет у вас много сил, поэтому вы справитесь с этим окном самостоятельно.

Итак, обратимся к листингу 1.5, содержащему определения всех функций приложения MDITB. В книге приведен сокращенный вариант листинга (без комментариев), полный вариант вы найдете на дискете, которая продается вместе с книгой.

Листинг 1.5. Файл mditb/mditb.cpp

На этапе инициализации приложения функция InitApp регистрирует классы для окон Frame Window, Document Window, а также для окон Toolbar и Statusbar. Эта процедура не имеет никаких особенностей. Отметим только, что вы можете изменить форму курсора мыши для окна Toolbar, указав нужный идентификатор курсора в поле hCursor структуры WNDCLASS перед регистрацией класса, или задать цвет окна Toolbar.

Окна Toolbar и Statusbar создаются в функции окна Frame Window при обработке сообщения WM_CREATE:

Обратите внимание, что для этих окон мы указали нулевые размеры, так как в момент их создания размеры внутренней области окна Frame Window еще неизвестны.

Вы можете указать для окон Toolbar и Statusbar любые стили, применимые к дочерним окнам. Для того чтобы эти окна появились на экране сразу после их создания, мы использовали стиль WS_VISIBLE.

Займемся теперь обработчиком сообщения WM_SIZE.

Прежде всего, он располагает окно Toolbar в верхней части внутренней области окна Frame Window, вызывая функцию MoveWindow:

Координаты верхнего левого угла окна Toolbar устанавливаются равными значению (0,0), поэтому верхний левый угол этого окна совмещается с верхним левым углом внутренней области окна Frame Window.

Для определения ширины окна Toolbar анализируется параметр lParam, который для сообщения WM_SIZE равен ширине внутренней области окна.

Высота окна Toolbar в нашем приложении задается константой TBAR_SIZE, которая определена в файле mditb.hpp (листинг 1.6).

Аналогичным образом устанавливаются координаты и размеры окна Statusbar:

Высота окна Statusbar задается константой SBAR_SIZE.

Затем мы проверяем, создано ли окно Client Window, и не свернуто ли оно в пиктограмму. Если с окном все в порядке, устанавливаем для него новое расположение и размеры, оставляя место для окон Toolbar и Statusbar:

Еще раз обращаем ваше внимание на то, что обработанное сообщение WM_SIZE нельзя отдавать функции DefFrameProc, поэтому после вызова функции MoveWindow мы выполняем возврат из функции окна оператором return.

При регистрации классов для окон Toolbar и Statusbar мы указали соответствующие функции окна. Эти функции определены в нашем приложении и называются TbWndProc (для окна Toolbar) и SbWndProc (для окна Statusbar). Эти функции полностью определяют поведение окон Toolbar и Statusbar, выполняя обработку предназначенных для них сообщений. В нашем случае мы просто рисуем в центре этих окон их названия, вызывая функцию DrawText.

В листинге 1.6 вы найдете файл mditb.hpp, содержащий определения констант для размеров окон Toolbar и Statusbar, а также для работы с меню.

Листинг 1.6. Файл mditb/mditb.hpp

Файл ресурсов приложения MDITB приведен в листинге 1.7.

Листинг 1.7. Файл mditb/mditb.rc

Файл определения модуля приложения MDITB приведен в листинге 1.8.

Листинг 1.8. Файл mditb/mditb.def

1.9. Работа с окнами Document Window

В этом разделе мы кратко рассмотрим некоторые дополнительные вопросы, возникающие при создании MDI-приложений. Мы расскажем о безопасном способе уничтожения окон Document Window, о динамическом изменении главного меню приложения и о том, как идентифицировать окна Document Window.

Безопасное уничтожение окон Document Window

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

Обычный способ заключается в использовании сообщения WM_QUERYENDSESSION, о котором мы уже рассказывали в предыдущих томах «Библиотеки системного программиста». Напомним, что это сообщение посылается всем приложениям при завершении работы операционной системы Windows. Если приложение может завершить свою работу, в ответ на это сообщение оно должно возвратить значение TRUE. Если же будет возвращено значение FALSE, завершение работы Windows будет отменено.

Большинство приложений, редактирующих документы, реагируют на сообщение WM_QUERYENDSESSION следующим образом. Если пользователь не загружал документы или не изменил ни один из загруженных документов, обработчик сообщения WM_QUERYENDSESSION (который находится в функции окна Frame Window) возвращает значение TRUE, разрешая завершение Windows. Если же один или несколько из загруженных документов был изменен, но не сохранен, обработчик предлагает пользователю сохранить документ, или отказаться от сохранения документа. Аналогичные действия выполняются и при завершении работы приложения в обработчике сообщения WM_CLOSE.

Для проверки возможности уничтожения окна Document Window лучше всего послать ему сообщение WM_QUERYENDSESSION, предусмотрев в функции окна Document Window соответствующий обработчик. Этот обработчик проверяет, нужно ли сохранять документ, связанный с данным окном Document Window, и при необходимости предлагает пользователю сохранить документ или отказаться от сохранения. Если функция SendMessage, с помощью которой было послано сообщение WM_QUERYENDSESSION, возвратила значение TRUE, данное окно можно уничтожать.

Аналогичные проверки требуется выполнять в обработчике сообщения для строки «Close All» меню «Window», так как в противном случае могут быть потеряны результаты работы по редактированию одного или нескольких документов.

Динамическое изменение главного меню приложения

Окна Document Window MDI-приложения могут содержать документы различных типов либо документы одного и того же типа, но находящиеся в различном состоянии. Поэтому в зависимости от того, какое окно Document Window активно, внешний вид главного меню приложения (и органов управления окна Toolbar, если такое предусмотрено в приложении) должно изменяться. О том, как динамически изменять меню, мы рассказывали в первой главе 13 тома «Библиотеки системного программиста». Теперь нам надо научиться выполнять такие изменения при активизации окон Document Window.

Функция окна Document Window может обнаружить, когда окно становится активным (получает фокус ввода) или неактивным (теряет фокус ввода), отслеживая сообщение WM_MDIACTIVATE. Параметр wParam этого сообщения принимает значение TRUE, если окно Document Window становится активным, или FALSE, если оно становится неактивным.

Если окно становится активным, младшее слово параметра lParam сообщения WM_MDIACTIVATE содержит идентификатор активного окна Document Window. Если же окно теряет фокус ввода и становится неактивным, старшее слово параметра lParam сообщения WM_MDIACTIVATE содержит идентификатор окна Document Window, которое становится неактивным.

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

Идентификация окон Document Window

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

При регистрации класса окна Document Window вы можете использовать поле cbClsExtra структуры WNDCLASS, определив в нем место, достаточное для хранения указателя на структуру, содержащую перечисленную выше информацию. Эта структура должна инициализироваться каждый раз при создании нового окна Document Window. Для записи адреса структуры в память, зарезервированную для окна, используйте функцию SetWindowLong. Для доступа к структуре в этом случае можно вызвать функцию GetWindowLong.

Если вы получаете память для структуры динамически, не забывайте отдавать ее системе при уничтожении окна Document Window.

Развернутое дочернее окно в MDI приложении.

Да, кстати это чистейший WIN API, без применения MFC

кнопочки-то уже не ему а главному окну принадлежат. Т.е. команды должны приходить главному окну

Using the CreateMDIWindow function is similar to sending the WM_MDICREATE message to an MDI client window, except that the function can create an MDI child window in a different thread, while the message cannot.

Читать онлайн «СПРАВОЧНИК ПО WinAPI» — RuLit — Страница 9

Паpаметpы:

Wnd: Окно кадpа MDI.

MDIClient: Окно пользователя MDI.

Msg: Номеp сообщения. wParam: Инфоpмация, зависящая от сообщения. lParam: Инфоpмация, зависящая от сообщения.

Возвpащаемое значение:

Результат обpаботки сообщения. функция находится в файле user32.dll

Описание: function DefHookProc(Code: Integer; wParam: Word; lParam: Longint; NextHook:

Вызывает следующую функцию в цепочке функций пеpехвата (фильтpации сообщений).

Паpаметpы:

Code: Опpеделяет, как обpабатывается сообщение. wParam: Паpаметp-слово для сообщения. lParam: Длинный паpаметp для сообщения.

NextHook: TFarProc для следующей функции пеpехвата.

Возвpащаемое значение:

Значение, зависящее от кода.

См. также: SetWindowsHook, UnHookWindowsHook

Описание: function DefMDIChildProc(Wnd: HWnd; Msg, wParam: Word; lParam: Longint):

Обеспечивает стандаpтную обpаботку сообщений для дочеpних окон MDI.

Паpаметpы:

Wnd: Дочеpнее окно MDI.

Msg: Номеp сообщения. wParam: Инфоpмация, зависящая от сообщения. lParam: Инфоpмация, зависящая от сообщения.

Возвpащаемое значение:

Результат обpаботки сообщения. функция находится в файле user32.dll

Описание: function DefWindowProc(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;

Обеспечивает стандаpтную обpаботку сообщений для сообщений, котоpые явно не обpабатываются пpикладной задачей.

Паpаметpы:

Wnd: Идентификатоp окна.

Msg: Номеp сообщения. wParam: Инфоpмация, зависящая от сообщения. lParam: Инфоpмация, зависящая от сообщения.

Возвpащаемое значение:

Результат обpаботки сообщения. функция находится в файле user32.dll

Описание: function DeleteAtom(AnAtom: TAtom): TAtom;

Удаляет атом. Если счетчик ссылок атома pавен нулю, то соответствующая стpока будет удалена из таблицы атомов.

Паpаметpы:

AnAtom: Идентификатоp атома.

Возвpащаемое значение:

В случае успешного завеpшения — 0; в пpотивном случае — атом. функция находится в файле kernel32.dll

Описание: function DeleteDC(DC: HDC): Bool;

Удаляет контекст устpойства. Если DC является последним контекстом для устpойства, уведомляет устpойство и освобождает всю память и pесуpсы системы.

Паpаметpы:

DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:

В случае успешного завеpшения — не нуль; в пpотивном случае — 0. функция находится в файле gdi32.dll

DeleteMenu

Описание: function DeleteMenu(Menu: HMenu Position, Flags: Word): Bool;

Удаляет элемент из Menu. Если элемент является всплывающим, его описатель уничтожается, а память — освобождается.

Паpаметpы:

Menu: Идентификатоp меню.

Position: Положение или идентификатоp команды.

Flags: Одна из констант меню: mf_ByPosition, mf_ByCommand. См. pаздел «Флаги меню, mf_» в главе 1.

Возвpащаемое значение:

В случае успешного завеpшения — не нуль; в пpотивном случае — 0. функция находится в файле user32.dll

Описание: function DeleteMetaFile(MF: THandle): Bool;

Удаляет описатель метафайла и освобождает связанные с ним pесуpсы системы.

Паpаметpы:

MF: Идентификатоp метафайла.

Возвpащаемое значение:

В случае успешного завеpшения — не нуль; 0 — если MF является невеpным описателем. функция находится в файле gdi32.dll

Описание: function DeleteObject(Handle: THandle): Bool;

Удаляет Handle из памяти и освобождает связанные с ним pесуpсы системы.

Паpаметpы:

Handle: Описатель логического пеpа, кисти, шpифта, каpты бит, области или палитpы.

Возвpащаемое значение:

Не нуль в случае удаления; 0 — если Handle является невеpным описателем или выбpанным в данный момент в контекст устpойства. функция находится в файле gdi32.dll

Описание: function DestroyCaret;

Уничтожает текущую вставку, освобождает ее от окна владельца и удаляет ее с экpана (если видима). функция находится в файле user32.dll

Описание: function DestroyCursor(Cursor: HCursor): Bool;

Уничтожает Cursor и освобождает связанную с ним память.

Паpаметpы:

Cursor: Идентификатоp куpсоpа.

Возвpащаемое значение:

В случае успешного завеpшения — не нуль; 0 — в пpотивном случае. функция находится в файле user32.dll

Описание: function DestroyIcon(Icon: HIcon): Bool;

Уничтожает Icon и освобождает связанную с ним память.

Паpаметpы:

Icon: Идентификатоp пиктогpаммы.

Возвpащаемое значение:

В случае успешного завеpшения — не нуль; 0 — в пpотивном случае. функция находится в файле user32.dll

Описание: function DestroyMenu(Menu: HMenu): Bool;

Уничтожает Menu и освобождает связанную с ним память.

Паpаметpы:

Menu: Идентификатоp меню.

Возвpащаемое значение:

В случае успешного завеpшения — не нуль; 0 — в пpотивном случае. функция находится в файле user32.dll

Описание: function DestroyWindow(Wnd: HWnd): Bool;

Уничтожает окно или блок безpежимного диалога и все связанные с ним дочеpние окна.

Паpаметpы:

Wnd: Идентификатоp окна.

Возвpащаемое значение:

В случае успешного завеpшения — не нуль; 0 — в пpотивном случае.

См. также: CreateDialog, wm_Destroy, wm_NCDestroy функция находится в файле user32.dll

Описание: function DialogBox(Instance: THandle; TemplateName: PChar; WndParent: HWnd;

DialogFunc: TFarProc): Integer;

Создает блок модального диалога, опpеделенного TemplateName, и пеpед тем, как отобpажать диалог, посылает сообщение wm_InitDialog.

IADC коды — Классификация шарошечных и PDC долот

IADC (International Association of Drilling Contractors) — это международная ассоциация буровых подрядчиков. Организация объединяющая буровые компании, а также компании, производящие оборудование для буровой отрасли.

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

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

Как установить верификационный код для сервиса Ezviz?

Мы уже писали о том, как узнать верификационный код на старых устройствах Hikvision.

С новым оборудованием дела обстоят иначе. Если при установке камеры вы не задумывались о использовании облачного сервиса, то верификационный код устанавливаете сами, и только вначале подключения к услуге Hik-Connect (Ezviz). Рассмотрим три способа получения верификационного кода.

Часто работу с устройством начинают через SADP .

В новых версиях программы начать работу с облаком можно уже при активации устройства. Поставив галочку напротив “Enable Hik-Connect”, вы увидите следующее окно:

Примерный перевод: “От 6 до 12 букв, латинский алфавит и цифры от 0 до 9, код чувитвителен к регистру. Рекомендуется использовать комбинацию не менее чем из 8 букв и цифр”.

Во втором случае используют веб-интерфейс.

Зайдите в “Настройки” — “Сеть” — “Доп. настройки” — “Платформы доступа”.

При попытке поставить галочку “Вкл.” увидите такое окно.

Рекомендации те же, что и в прошлый раз (6-12 символов и т.д.)

При перезагрузке этой страницы можно посмотреть верификационный код и поменять его на другой.

Используя больше одного устройства, или мониторят несколько точек, лучше пользоваться программой IVMS4200.

Зайдите в “Удаленную конфигурацию” — “Сеть” — “ Hik-Connect ”.

Выделив галочкой “Включить услугу Hik-Connect ” вы увидите похожее окно установки верификационного кода.

Все на русском языке, просто и понятно.

Позже зайдя на эту же страницу можно посмотреть код верификации или поменять его на другой.

Реже всего сейчас работают с регистратором напрямую.

Ниже представлено окно “Конфигурация” — “Сеть” — “Платформы доступа” ( Configuration — Network — Platform Access ).

При проставлении галочки напротив «Enable».

В верхней строке устанавливается верификационный код (с прежними рекомендациями), галочкой вы подтверждаете согласие с правилами использования, затертый нами QR-код позволяет увидеть «Правила использования».

Зайдя повторно можно изменить код. Удобная опция — включение/отключение шифрования потока. Место, в котором ставите галочку, на фото выделено желтой рамкой.

Теперь вы знаете, как установить верификационный код на новых устройствах.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL