Что нового

[Элементы GUI] Дочернее окно с рамкой на фоне родительского, в Windows XP

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Есть примерно такая конструкция:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('GUIOnEventMode', 1)

$hForm = GUICreate('', 500, 500, -1, -1)
GUISetBkColor(0x000000)
GUISetOnEvent($GUI_EVENT_CLOSE, '_close')
GUISetState(@SW_SHOW, $hForm)

$h_cForm = GUICreate('', 200, 200, -1, -1, BitOR($WS_BORDER, $WS_POPUP), -1, $hForm)
GUISetBkColor(0x000000)
GUISetState(@SW_SHOW, $h_cForm)

While 1
	Sleep(100)
WEnd

Func _close()
	Exit
EndFunc   ;==>_close


В Win 7 дочернее окно видно на фоне родительского благодаря рамке, причем практически независимо от цвета заливки обоих окон.
В Win XP этот стиль почему-то не работает. Пробовал несколько сочетаний стилей, но подходящего найти не удалось - возможно это особенность только Win 7?
Можно ли сделать, чтобы на обоих системах была подобная рамка?
Лучше, конечно, с помощью комбинации стилей.
Дочернее окно должно быть без заголовка.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
WSWR [?]
возможно это особенность только Win 7
Скорее, это особенность темы оформления Win7. Если выбрать тему "Классическая", то рамка будет чёрная, как на XP, и будет сливаться с фоном GUI.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
А может быть вам использовать модальность у окна?
Код:
$DS_MODALFRAME

Код:
$h_cForm = GUICreate('', 200, 200, -1, -1, $DS_MODALFRAME, -1, $hForm)

почти одинаковое как $WS_POPUP, но с фреймом
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
InnI
Действительно, видимо так и есть - а я-то думаю, какая удобная рамочка... а она, оказывается, и на Win 7 не всегда видна)

MnM
Получается окно с заголовком, а это не желательно

Можно рамку получить, если под дочерним окном рисовать другое окно, больше и по другим координатам, с контрастным цветом. Вариант рабочий, но когда дочерних окно много, как-то не очень удобно еще столько же создавать.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
WSWR [?]
Можно рамку получить, если под дочерним окном рисовать другое окно
Может, тогда проще убрать $WS_BORDER, а по краю дочернего окна саму эту рамку и рисовать? При помощи WinAPI или GDI+ :scratch:


Добавлено:
Сообщение автоматически объединено:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

Global $h_cForm = 0

Opt('GUIOnEventMode', 1)
GUIRegisterMsg($WM_PAINT, "_FrameRect")

$hForm = GUICreate('', 500, 500, -1, -1)
GUISetBkColor(0x000000)
GUISetOnEvent($GUI_EVENT_CLOSE, '_close')
GUISetState(@SW_SHOW, $hForm)

$h_cForm = GUICreate('', 200, 200, -1, -1, $WS_POPUP, -1, $hForm)
GUISetBkColor(0x000000)
GUISetState(@SW_SHOW, $h_cForm)

While 1
    Sleep(100)
WEnd

Func _close()
    Exit
EndFunc   ;==>_close

Func _FrameRect()
  If $h_cForm Then
    $hDC = _WinAPI_GetWindowDC($h_cForm)
    $hBrush = _WinAPI_CreateSolidBrush(0x0000FF)
    $tRect = DllStructCreate($tagRECT)
    DllStructSetData($tRect, "Left", 0)
    DllStructSetData($tRect, "Top", 0)
    DllStructSetData($tRect, "Right", 200)
    DllStructSetData($tRect, "Bottom", 200)
    $ptrRect = DllStructGetPtr($tRect)
    _WinAPI_FrameRect($hDC, $ptrRect, $hBrush)
    _WinAPI_DeleteObject($hBrush)
    _WinAPI_ReleaseDC($h_cForm, $hDC)
  EndIf
  Return $GUI_RUNDEFMSG
EndFunc   ;==>_FrameRect
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
InnI

Спасибо, вроде то, что нужно
 
Верх