Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Ни как не могу добиться корректной прорисовки иконки, при перемещении она плывёт.
OffTopic:
И если не так сложно, то как выравнить иконку по сетке, как на рабочем столе.
И если не так сложно, то как выравнить иконку по сетке, как на рабочем столе.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <WinAPIEx.au3>
#include <GDIPlus.au3>
#include <GuiImageList.au3>
#include <Misc.au3>
Global $hDesktop = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop", "Wallpaper")
$hForm = GUICreate("Virtual Desktop", 800, 600)
$hListView = _GUICtrlListView_Create($hForm, 'Имя|Размер|Тип|Изменён', 0, 0, 800, 600, BitOR($LVS_EDITLABELS, $LVS_ICON, $LVS_NOSCROLL))
_GUICtrlListView_SetColumnWidth($hListView, 0, 200)
_GUICtrlListView_SetBkImageEx($hListView, $hDesktop)
_GUICtrlListView_SetTextColor($hListView, 0xFFFFFF)
$hImage = _GUIImageList_Create(32, 32, 5, 1)
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -49, 4)
_GUICtrlListView_SetImageList($hListView, $hImage, 0)
_GUICtrlListView_AddItem($hListView, "Мой компьютер", 0)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_PRIMARYDOWN
$nPOINT = _WinAPI_GetMousePos(True, $hListView)
$nX = DllStructGetData($nPOINT, 'X')
$nY = DllStructGetData($nPOINT, 'Y')
$lv_Item = _GUICtrlListView_GetHotItem($hListView)
If _GUICtrlListView_GetItemSelected($hListView, $lv_Item) Then
Dim $iPos[2]
$iPos[0] = _GUICtrlListView_GetItemPositionX($hListView, $lv_Item)
$iPos[1] = _GUICtrlListView_GetItemPositionY($hListView, $lv_Item)
While _IsPressed(1)
$tPOINT = _WinAPI_GetMousePos(True, $hListView)
$tX = DllStructGetData($tPOINT, 'X')
$tY = DllStructGetData($tPOINT, 'Y')
_GUICtrlListView_SetItemPosition($hListView, $lv_Item, $iPos[0] + $tX - $nX, $iPos[1] + $tY - $nY)
Sleep(20)
WEnd
EndIf
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
$tNMTVDISPINFO = DllStructCreate($tagNMTVDISPINFO, $lParam)
$iCode = DllStructGetData($tNMTVDISPINFO, "Code")
$Index = _GUICtrlListView_GetSelectedIndices($hListView)
If $iCode = $NM_DBLCLK And StringLen($Index) <> 0 Then
$lvText = _GUICtrlListView_GetItemText($hListView, $Index)
If $lvText = 'Мой компьютер' Then
ShellExecute('::{20D04FE0-3AEA-1069-A2D8-08002B30309D}')
EndIf
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Func _GUICtrlListView_SetBkImageEx($hWnd, $sImage, $iFlags = 0, $iXOffset = 0, $iYOffset = 0)
Local $hImage, $hThumb, $hBitmap, $tLVBKIMAGE, $pLVBKIMAGE, $tMem, $pMem, $Ret, $Size
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($sImage)
$hThumb = DllCall($ghGDIPDll, "int", "GdipGetImageThumbnail", "ptr", $hImage, _
"int", _WinAPI_GetWindowWidth($hWnd), "int", _WinAPI_GetWindowHeight($hWnd), _
"ptr*", 0, "ptr", 0, "ptr", 0)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hThumb[4])
If $hBitmap Then
$iFlags = BitOR(BitAND($iFlags, BitOR($LVBKIF_FLAG_TILEOFFSET, $LVBKIF_STYLE_TILE, $LVBKIF_TYPE_WATERMARK, 0x20000000)), $LVBKIF_SOURCE_HBITMAP)
Else
$iFlags = 0
EndIf
$tLVBKIMAGE = DllStructCreate('ulong;ptr;ptr;uint;int;int')
$pLVBKIMAGE = DllStructGetPtr($tLVBKIMAGE)
DllStructSetData($tLVBKIMAGE, 1, $iFlags)
DllStructSetData($tLVBKIMAGE, 2, $hBitmap)
DllStructSetData($tLVBKIMAGE, 5, $iXOffset)
DllStructSetData($tLVBKIMAGE, 6, $iYOffset)
$Ret = _SendMessage($hWnd, 4234, 0, $pLVBKIMAGE)
_GDIPlus_ImageDispose($hThumb[4])
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_Shutdown()
Return $Ret <> 0
EndFunc