Что нового

Дочерное окно

Nefakt

Новичок
Сообщения
74
Репутация
3
Всем привет.
При создании дочерного окна, окно перемещается не зависимо от родительского.
Как запретит перемещения дочерного окна вообще. Что бы при создании, его нельзя было двигать.
Заранее спасибо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
использовать стиль
Код:
$WS_POPUP

для дочернего окна
 
Автор
Nefakt

Nefakt

Новичок
Сообщения
74
Репутация
3
Стоит у меня
Код:
$WS_POPUP

В скрипте еще есть код который делает так что бы форму можно было двигать за любое место
Код:
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
    Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
    If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
    Return $GUI_RUNDEFMSG
EndFunc

Но этот код почему то на родительское и дочернее распространяется.
Хотя вызов
Код:
GUIRegisterMsg($WM_NCHITTEST,   'WM_NCHITTEST')

Стоит только у родительского окна.
Если это закаментировать то тогда они не двигаются. Ни родительское ни дочерное.
Но так как форма у меня без рамки то без данного кода не обойтись.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Nefakt
У Вас функция WM_NCHITTEST получает параметр $hWnd. Попробуйте сравнивать внутри этой функции данный параметр со значением нужного окна и выходить из функции, если окно не то (хотя может это костыльное решение :()
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
;$hParentWin - это дескриптор родительского окна
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
	Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
	If $iProc[0] = $HTCLIENT Then
		If $hWnd = $hParentWin Then Return $HTCAPTION ; тут условие, если это родительское окно, то двигаем. на дочернее не будет реакции. то есть оно будет бездвижно
		EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
; или так
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
	 If $hWnd = $hParentWin Then
    Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
    If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
	EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST


вот собрал из стандартного примера
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Local $iGUIWidth = 250, $iGUIHeight = 250, $flag = 0

Global $hParentWin = GUICreate("Parent GUI", $iGUIWidth, $iGUIHeight)
$Button1 = GUICtrlCreateButton("Button1", 20, 20, 75, 25)
$aParentWin_Pos = WinGetPos($hParentWin, "")
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')

$hChildWin = GUICreate("Child GUI", $iGUIWidth, $iGUIHeight, $aParentWin_Pos[0] + 100, $aParentWin_Pos[1] + 100, $WS_POPUP, -1, $hParentWin)
GUISetBkColor(0x253E23)
GUISetState(@SW_HIDE, $hChildWin)

GUISwitch($hParentWin)
While 1
	$aMsg = GUIGetMsg(1)
	Select
		Case $aMsg[0] = $GUI_EVENT_CLOSE
			If $aMsg[1] = $hChildWin Then
				GUISwitch($hChildWin)
				GUIDelete()
			ElseIf $aMsg[1] = $hParentWin Then
				GUISwitch($hParentWin)
				GUIDelete()
				Exit
			EndIf
		Case $aMsg[0] = 3
			If $flag = 0 Then
				GUISetState(@SW_SHOW, $hChildWin)
				$flag = 1
			Else
				GUISetState(@SW_HIDE, $hChildWin)
				$flag = 0
			EndIf
	EndSelect

WEnd

Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
	Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
	If $iProc[0] = $HTCLIENT Then
		If $hWnd = $hParentWin Then Return $HTCAPTION
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
 
Верх