Добрый вечер, уважаемые программисты Autoit.
Помогите, пожалуйста разобраться.
У меня есть код, который формирует GUI, так что можно перетаскивать на него (на GUI) ярлыки файлов или программ - и они закрепляются на данном окне GUI.
Можно щелкать по ярлыкам и они будут открываться.
У меня возникла проблема.
Кидаешь ярлык в одно место окна, а он - оказывается закрепленным в другом месте окна (не в том, где его располагали, а несколько левее-правее-ниже-выше).
Почему происходит такое нечеткое закрепление размещения ярлыка - я не знаю.
Как отобразить сетку на окне GUI (чтобы видно было - куда именно кидается ярлык), чтоб точнее привязывать ярлыки к окну?
Вот код GUI:
Вот код сетки:
(И эту сетку - надо как-то наложить на GUI, чтобы ячейки сетки - совпадали с невидимыми ячейками текущего окна GUI (где размещаются ярлыки) )
А как ее наложить - я не понимаю. Потому что окно можно растягивать - то есть и сетка должна меняться.
Или может не такую сетку, а какую-нибудь другую.
Как это можно - хотя бы теоретически реализовать ?
Помогите, пожалуйста разобраться.
У меня есть код, который формирует GUI, так что можно перетаскивать на него (на GUI) ярлыки файлов или программ - и они закрепляются на данном окне GUI.
Можно щелкать по ярлыкам и они будут открываться.
У меня возникла проблема.
Кидаешь ярлык в одно место окна, а он - оказывается закрепленным в другом месте окна (не в том, где его располагали, а несколько левее-правее-ниже-выше).
Почему происходит такое нечеткое закрепление размещения ярлыка - я не знаю.
Как отобразить сетку на окне GUI (чтобы видно было - куда именно кидается ярлык), чтоб точнее привязывать ярлыки к окну?
Вот код GUI:
Код:
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <WinAPIShellEx.au3>
Global $aIcinMetric[2], $aLVPos[2] = [10, 45]
Global Const $INI_FILE = @ScriptDir & "\" & StringLeft(@ScriptName, StringInStr(@ScriptName, ".", 0, -1)) & "ini"
GUICreate("Пример", 400, 600, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUICtrlCreateLabel("Drag && Drop | Двойной ЛКМ > Запустить | ПКМ > Удалить", 0, 0, 400, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetState(-1, $GUI_DISABLE)
Global $g_aLVs[] = ["Первая", "Вторая", "..."], $g_idTab = GUICtrlCreateTab(5, 20, 390, 575)
For $iTab = 0 To UBound($g_aLVs) - 1
GUICtrlCreateTabItem($g_aLVs[$iTab])
$g_aLVs[$iTab] = GUICtrlCreateListView("Имя|Файл", $aLVPos[0], $aLVPos[1], 380, 545, _
BitOR($LVS_ICON, $LVS_SINGLESEL), _
BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_INFOTIP, $LVS_EX_SNAPTOGRID))
GUICtrlSetStyle(-1, $LVS_ICON)
$aIcinMetric[0] = _WinAPI_GetSystemMetrics($SM_CXICON)
$aIcinMetric[1] = _WinAPI_GetSystemMetrics($SM_CYICON)
_GUICtrlListView_SetImageList($g_aLVs[$iTab], _GUIImageList_Create($aIcinMetric[0], $aIcinMetric[1]))
_LoadFiles($iTab)
Next
GUICtrlCreateTabItem("")
OnAutoItExitRegister("_SaveFiles")
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func WM_DROPFILES($hWnd, $iMsg, $wParam, $lParam)
Local $iX, $iY, $tPoint, $aFiles = _WinAPI_DragQueryFileEx($wParam)
If Not @error Then
Local $tPoint = DllStructCreate('int X;int Y')
DllCall('shell32.dll', 'int', 'DragQueryPoint', 'int', $wParam, 'ptr', DllStructGetPtr($tPoint))
$iX = DllStructGetData($tPoint, 'X') - $aLVPos[0] - $aIcinMetric[0]
$iY = DllStructGetData($tPoint, 'Y') - $aLVPos[1] - $aIcinMetric[1]
_AddFiles(GUICtrlRead($g_idTab), $aFiles, $iX, $iY)
_WinAPI_DragFinish($wParam)
EndIf
EndFunc ;==>WM_DROPFILES
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $hLV, $hWndFrom, $iCode, $tNMHDR, $tInfo, $iIndex
$hLV = GUICtrlGetHandle($g_aLVs[GUICtrlRead($g_idTab)])
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hLV
Switch $iCode
Case $NM_DBLCLK
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
$iIndex = DllStructGetData($tInfo, "Index")
If $iIndex <> -1 Then ShellExecute(_GUICtrlListView_GetItemText($hWndFrom, $iIndex, 1))
Case $NM_RCLICK
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
$iIndex = DllStructGetData($tInfo, "Index")
If $iIndex <> -1 Then
_GUICtrlListView_DeleteItem($hWndFrom, $iIndex)
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func _AddFiles($iTab, $aFiles, $iX = 0, $iY = 0, $iIni = 0)
_GUICtrlListView_BeginUpdate($g_aLVs[$iTab])
Local $hIcon, $iIndex, $hImageList = _GUICtrlListView_GetImageList($g_aLVs[$iTab], 0)
For $i = 1 To $aFiles[0]
If $iIni Then
$aArray = StringSplit($aFiles[$i], '>', 2)
If UBound($aArray) = 3 Then
$aFiles[$i] = $aArray[0]
$iX = $aArray[1]
$iY = $aArray[2]
EndIf
EndIf
$hIcon = _WinAPI_ShellExtractAssociatedIcon($aFiles[$i], False)
$iIndex = _GUICtrlListView_AddItem($g_aLVs[$iTab], _WinAPI_PathRemoveExtension(_WinAPI_PathFindFileName($aFiles[$i])), _
_GUIImageList_ReplaceIcon($hImageList, -1, $hIcon))
_GUICtrlListView_AddSubItem($g_aLVs[$iTab], $iIndex, $aFiles[$i], 1)
_WinAPI_DestroyIcon($hIcon)
If $iX Or $iIni Then _GUICtrlListView_SetItemPosition($g_aLVs[$iTab], $iIndex, $iX, $iY)
Next
_GUICtrlListView_EndUpdate($g_aLVs[$iTab])
EndFunc ;==>_AddFiles
Func _LoadFiles($iTab)
Local $sFiles = IniRead($INI_FILE, "Files", $iTab, "")
If $sFiles Then _AddFiles($iTab, StringSplit($sFiles, "|"), 0, 0, 1)
EndFunc ;==>_LoadFiles
Func _SaveFiles()
GUISetState(@SW_HIDE)
Local $sFiles, $aPos
For $iTab = 0 To UBound($g_aLVs) - 1
$sFiles = ""
For $i = 0 To _GUICtrlListView_GetItemCount($g_aLVs[$iTab]) - 1
$aPos = _GUICtrlListView_GetItemPosition($g_aLVs[$iTab], $i)
$sFiles &= _GUICtrlListView_GetItemText($g_aLVs[$iTab], $i, 1) & '>' & $aPos[0] & '>' & $aPos[1] & '|'
Next
IniWrite($INI_FILE, "Files", $iTab, StringTrimRight($sFiles, 1))
Next
EndFunc ;==>_SaveFiles
Вот код сетки:
(И эту сетку - надо как-то наложить на GUI, чтобы ячейки сетки - совпадали с невидимыми ячейками текущего окна GUI (где размещаются ярлыки) )
А как ее наложить - я не понимаю. Потому что окно можно растягивать - то есть и сетка должна меняться.
Код:
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <WinAPI.au3>
HotKeySet("{esc}", "_EXIT")
$hGUI=WinGetHandle("My GUI", "")
$i=20 ;кол-во столбцов
$j=15 ;кол-во строк
$hGUI = GUICreate("My GUI",700,700,-1,-1,$WS_POPUP,$WS_EX_LAYERED)
GUISetBkColor(0x50020301)
_WinAPI_SetLayeredWindowAttributes($hGUI, 0x50020301, 255)
WinSetOnTop($hGUI, "", 1)
GUISetState()
_GDIPlus_Startup ()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
$hPen = _GDIPlus_PenCreate(0x50020301, 1); второй параметр - толщина линий
While 1
For $n = 1 To $j
_GDIPlus_GraphicsDrawLine ($hGraphic, 0, (0+@DesktopHeight/($j))*$n,@DesktopWidth, (0+@DesktopHeight/($j))*$n, $hPen)
Next
For $s = 1 To $i
_GDIPlus_GraphicsDrawLine ($hGraphic, (0+@DesktopWidth/($i))*$s, 0,(0+@DesktopWidth/($i))*$s, @DesktopHeight, $hPen)
Next
sleep(50)
WEnd
Func _EXIT()
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INVALIDATE + $RDW_ALLCHILDREN)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_PenDispose($hPen)
_GDIPlus_ShutDown ()
Exit
EndFunc
Или может не такую сетку, а какую-нибудь другую.
Сообщение автоматически объединено:
Как это можно - хотя бы теоретически реализовать ?
Вложения
Последнее редактирование: