Что нового

[Баг] Использование $WS_EX_CONTROLPARENT отключает элементы управления

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пример:

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

$hGUI = GUICreate("Test Script", 300, 200, -1, -1, -1, $WS_EX_CONTROLPARENT)

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd


а теперь пробуем закрыть GUI крестиком в заголовке...
не закрывается, верно? а если добавить к стилю $WS_SIZEBOX, то и размер нельзя будет изменить...

это видимо разработчики при добавлении этого стиля (ведь как я понимаю это не стандартный стиль), забыли проверять область управления, вот пример который делает тоже самое:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("Test Script", 300, 200, -1, -1, BitOr($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
GUISetState(@SW_SHOW, $hGUI)

GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
	Return 2
EndFunc


а нужно так:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

$hGUI = GUICreate("Test Script", 300, 200, -1, -1, BitOr($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
GUISetState(@SW_SHOW, $hGUI)

GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
	Local $iRet = _WinAPI_DefWindowProc($hWnd, $iMsg, $iwParam, $ilParam)
	
	If $iRet = 1 Then
		Return 2
	EndIf
	
	Return $iRet
EndFunc
 

SyDr

Сидра
Сообщения
651
Репутация
158
А где можно почитать про то, как окно должно себя вести с этим стилем?
http://blogs.msdn.com/b/oldnewthing/archive/2004/07/30/201988.aspx
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
SyDr [?]
где можно почитать про то, как окно должно себя вести с этим стилем?
В справке, но там ничего особенного:
You can enable window draging for GUI without $WS_CAPTION by using $WS_EX_CONTROLPARENT in the exStyle parameter.

Они должны либо исправить это (предпочтительно), либо добавить предупреждение в справку.
 

SyDr

Сидра
Сообщения
651
Репутация
158
http://www.codeguru.com/forum/showthread.php?t=194862
Problems after applying WS_EX_CONTROLPARENT

http://forum.ru-board.com/topic.cgi?forum=33&topic=0555&start=310
Mindless
Может кто-то подскажет как сделать навигацию в окошке с помощью кнопки TAB?

Я делаю так: родительскому- CreateWindowEx(WS_EX_CONTROLPARENT), дочерним -CreateWindowEx(WS_TABSTOP|WS_BORDER|WS_VISIBLE|WS_CHILD,HMENU(число какое-нибудь))

Не работает как надо

BS_DEFPUSHBUTTON тоже чёт не работает. Кнопка горит, но не жмётся

Abs62
Mindless
Обычно такие вещи делаются на базе окна диалога. И стиль WS_EX_CONTROLPARENT применяется для дочерних окон диалогового окна, если они в свою очередь имеют дочерние окна, между которыми надо осуществлять навигацию клавишей TAB. "If the search for the next control with the WS_TABSTOP style encounters a window with the WS_EX_CONTROLPARENT style, the system recursively searches the window's children" (C) MSDN.
В обычном окне этот стиль будет просто проигнорирован, ежели я не ошибаюсь. Так что если очень надо сделать подобие диалогового окна в окне обычном, придётся всё это делать вручную - отлавливать нажатие TAB, Shift+TAB, Enter, и соответствующим образом это обрабатывать.

Пытался найти стиль в списке, но оказалось, что он присутствует только в описнии функции :smile:
 

NoMad73rus

Продвинутый
Сообщения
124
Репутация
80
Столкнулся с подобным, но просто при использовании @SW_SHOW. Приходится иногда разворачивать чужое окно, а потом свернуть можно только из панели "пуск". На кнопку "_" не реагирует (
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
SyDr [?]
Пытался найти стиль в списке, но оказалось, что он присутствует только в описнии функции
Кстати, судя по Valik'у, у этого стиля совсем другое назначение, вот тикет на эту тему, который был прикрыт аж год назад.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Это просто ошибка в справке. Если использовать этот стиль по назначению (для $WS_CHILD окон), то он прекрасно работает. А в справке видимо перепутали с $GUI_WS_EX_PARENTDRAG.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
в справке видимо перепутали с $GUI_WS_EX_PARENTDRAG
Этот стиль для элементов. В GUI он неработает.

Я считаю что они не перепутали, а просто не доинформировали :smile: - в справке нужно было предупредить о том что данный стиль не желательно использовать с $WS_CAPTION, а также о $WS_SIZEBOX нужно написать.

Хотя можно бвло бы конечно сделать для этого стиля то что я показал в первом сообщений, иначе им почти никто не будет пользоваться, т.к очень часто подобное нужно и с $WS_CAPTION, и тем более с $WS_SIZEBOX.
 
Верх