Что нового

Не возвращается активность родительскому окну

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Для своего проекта сделал прозрачный TreeView. смотри пример
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>
#include <GuiTreeView.au3>
#include <TreeviewConstants.au3>
Global $Form1 = GUICreate("Form1", 592, 382, -1, -1)
GUISetBkColor(0x000000)
$Pic1 = GUICtrlCreatePic("Путь к картинке", 0, 0, 592, 382, $SS_CENTERIMAGE)
GUISetState(@SW_SHOW)

$Tree = _TreeVeiwCreate($Form1, 20, 30, 200, 300, True, $TVS_NOHSCROLL)
GUICtrlSetFont(-1, 9, 800, 0, "Georgia")
GUICtrlSetColor(-1, 0xffffff)
Local $c
For $i = 1 To 30
	$c = GUICtrlCreateTreeViewItem('Пункт - ' & $i, $Tree)
	GUICtrlCreateTreeViewItem('Подпункт - ' & $i, $c)
Next
_GUICtrlTreeView_Expand($Tree)
Local $gfi = _GUICtrlTreeView_GetFirstItem($Tree)
_GUICtrlTreeView_SelectItem($Tree, $gfi)

While 1
	Switch GUIGetMsg()
		Case  -3
			Exit
	EndSwitch
WEnd


Func _TreeVeiwCreate($hWin, $iLeft, $iTop, $iWidth, $iHeight, $iBorder = True, $iStyle = -1, $iExStyle = -1)
	If Not IsHWnd($hWin) Then Return SetError(1)
	Local $Border, $DC = _WinAPI_GetDC($hWin)
	Local $BkColor = _WinAPI_GetBkColor($DC)
	If $iBorder Then $iBorder = $WS_BORDER
	Global $hGui = GUICreate("", $iWidth, $iHeight, $iLeft, $iTop, $WS_POPUP + $iBorder, $WS_EX_LAYERED, $hWin)
	GUISetBkColor($BkColor)
	Global $hTV = GUICtrlCreateTreeView(0, 0, $iWidth + 17, $iHeight, $iStyle, $iExStyle)
	_GUICtrlTreeView_SetBkColor($hTV, $BkColor)
	GUISetState(@SW_SHOW, $hGui)
	_WinAPI_SetParent($hGui, $hWin)
	_WinAPI_SetLayeredWindowAttributes($hGui, $BkColor, 255)
	GUIRegisterMsg(0x020A, "WM_MOUSEWHEEL")
	Return $hTV
EndFunc   ;==>_TreeVeiwCreate

Func WM_MOUSEWHEEL($hWndGui, $MsgId, $wParam, $lParam)
	Local $GSTWH = BitShift($wParam, 16)
	_Scroll($GSTWH)
EndFunc   ;==>WM_MOUSEWHEEL

Func _Scroll($Param)
	Local $dvis
	Local $CursorInfo = GUIGetCursorInfo($hGui)
	If Not @error And $CursorInfo[4] = $hTV Then
		Local $visf = _GUICtrlTreeView_GetFirstVisible($hTV)
		If $Param = 120 Then
			Local $prch = _GUICtrlTreeView_GetPrev($hTV, $visf)
			_GUICtrlTreeView_EnsureVisible($hTV, $prch)
		ElseIf $Param = -120 Then
			Local $Hit = _GUICtrlTreeView_GetHeight($hTV)
			Local $vc = _GUICtrlTreeView_GetVisibleCount($hTV) * $Hit - 1
			Local $gt = _GUICtrlTreeView_HitTestItem($hTV, 0, $vc)
			$dvis = _GUICtrlTreeView_GetNext($hTV, $gt)
			If Not $dvis Then Return
			_GUICtrlTreeView_EnsureVisible($hTV, $dvis)
		EndIf
	EndIf
EndFunc   ;==>_Scroll
если убрать Pic или Pic вернет ошибку (неверен путь, к примеру), то нельзя закрыть родительское окно через системное меню, с объектом Pic, даже если вместо пути пустая строка, все отлично. фокус переносится на родительское окно и его можно свернуть или закрыть.
Что-то не въеду в чем косяк
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вместо SetParent можно использовать расширенный стиль $WS_EX_MDICHILD:

Код:
Func _TreeVeiwCreate($hWin, $iLeft, $iTop, $iWidth, $iHeight, $iBorder = True, $iStyle = -1, $iExStyle = -1)
    If Not IsHWnd($hWin) Then Return SetError(1)
    Local $Border, $DC = _WinAPI_GetDC($hWin)
    Local $BkColor = _WinAPI_GetBkColor($DC)
    If $iBorder Then $iBorder = $WS_BORDER
    Global $hGui = GUICreate("", $iWidth, $iHeight, $iLeft, $iTop, $WS_POPUP + $iBorder, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hWin)
    GUISetBkColor($BkColor)
    Global $hTV = GUICtrlCreateTreeView(0, 0, $iWidth + 17, $iHeight, $iStyle, $iExStyle)
    _GUICtrlTreeView_SetBkColor($hTV, $BkColor)
    GUISetState(@SW_SHOW, $hGui)
    _WinAPI_SetLayeredWindowAttributes($hGui, $BkColor, 255)
    ;_WinAPI_SetParent($hGui, $hWin)
    GUIRegisterMsg(0x020A, "WM_MOUSEWHEEL")
    Return $hTV
EndFunc
 
Верх