Создание MDI-формы в стиле Windows XP
В прошлом номере я рассказывал о том, как можно сделать
XP-окно без использования дополнительных элементов управления
(ver.
04'2003: "Разработка
окна в стиле Windows XP"), я продолжу эту тему,
но на этот раз расскажу как можно сделать MDI-форму
в таком же стиле.
Хочу сразу сказать, что данная статья, как и прошлая,
всего лишь указывает на метод, при помощи которого можно
создать "иллюзию" XP-окна. Конечно, можно
написать все, начиная с изменения размеров и кончая
потерей фокуса, но тогда ваш мозг просто на просто уснет
и никогда не проснется, и придется вам всю жизнь использовать
чужой мозг, и вместо эволюции вы начнете деградировать
и превращаться в "зеленого ламера". Вы уж
не обижайтесь, уважаемые читатели, но это факт.
Если вы не читали прошлую статью, то обязательно прочитайте,
поскольку вам придется делать XP-окна и понадобится
исходник.
Визуальная часть
Для создания MDI-окна, чтобы не делать дважды одно
и тоже, мы возьмем пример их прошлой статьи (ver.
04'2003: "Разработка
окна в стиле Windows XP"), frmMain переименуем
в frmMDIForm и добавим еще одно, точно такое же, окно,
которое назовем frmMDIChild, по размерам оно должно
быть немного меньше fmrMDIForm. Как вы уже наверное
поняли, frmMDIForm будет у нас родительской(материнской)
формой, а frmMDIChild - дочерней. В процессе разработки,
я столкнулся с небольшой проблемой, когда поместил frmMDIChild
в frmMDIForm, поскольку у форм нет заголовка (он скрыт),
то дочерняя форма при перетаскивании заходила на заголовок
родительской формы. Я не стал загружать голову математикой,
да и вам не советую, и для решения этой проблемы решил
использовать PictureBox со свойством BorderStyle = 0,
и именем picMDI , который должен быть размещен на родительской
форме (frmMDIForm).

Рис. 1. Родительская форма
Кодинг
Как обычно, начнем с модуля (mdlMainModul), в него
надо добавить новую функцию, которая позволит нам поместить
frmMDIChild в frmMDIForm:
Public Declare Function
SetParent Lib "user32"
(ByVal hWndChild As
Long, ByVal hWndNewParent
As Long) As
Long
Затем перейдем к родительской форме (fmrMDIForm) и
в событие Form_Resize добавим следующий код:
picMDI.BackColor = RGB(236, 233, 216)
picMDI.Left = (2 * Screen.TwipsPerPixelX): picMDI.Top
= imgCaption.Height
picMDI.Width = Me.Width - (4 * Screen.TwipsPerPixelX)
picMDI.Height = Me.Height - imgCaption.Height - (2 *
Screen.TwipsPerPixelY)
Для того чтобы поместить дочернею форму (frmMDIChild)
в родительскую (fmrMDIForm) в событие Form_Load родительской
формы надо добавить следующий код:
frmMDIChild.Show 'Показываем
дочернею форму
SetParent frmChild.hwnd, Me.picMDI.hwnd 'Перемещаем
дочернею форму в родительскую
frmMDIChild.Move (picMDI.Width - frmMDIChild.Width)
/ 2, (picMDI.Height - frmMDIChild.Height) / 2
'Выравниваем по центру
Happy Конец
Как и в прошлый раз, все оказалось просто. На рисунке
№2 вы можете наблюдать результат нашей работы.

Рис. 2. Результат работы
Для примера, на дочерней форме я разместил образец
XP-кнопки, надеюсь это поможет вам в создании остальных
контролов.
Пример можно скачать здесь
Автор статьи: Немиро
Алексей
|