Must AutoIt
Сообщения: 3054
Благодарности: 1009
|
Профиль
|
Сайт
|
Отправить PM
| Цитировать
Diamond,
Цитата:
нет никаких преимуществ если из-за неё приходится отказываться от использования UDF
|
Я лично имею такое мнение: если UDF ни чем не лучше встроенной функции, то лучше использовать оригинал (встроенную функцию) - всегда надёжнее, но это конечно моё имхо  .
Вот пример с функцией
Код: 
#include <GuiConstants.au3>
$Main_GUI = GUICreate("ListView Set Equel Column Width", 340, 260, -1, -1, $WS_OVERLAPPEDWINDOW)
$ListView = GUICtrlCreateListView("col1|col2|col3", 20, 30, 300, 150, _
$LVS_SHOWSELALWAYS+$LVS_NOSORTHEADER, $LVS_EX_FULLROWSELECT+$LVS_EX_GRIDLINES)
GUICtrlCreateListViewItem("line1|data1|more1", $ListView)
GUICtrlCreateListViewItem("line2|data2|more2", $ListView)
GUICtrlCreateListViewItem("line3|data3|more3", $ListView)
GUICtrlCreateListViewItem("line4|data4|more4", $ListView)
GUICtrlCreateListViewItem("line5|data5|more5", $ListView)
$Set_Equel_Button = GUICtrlCreateButton("Set Equel Width", 20, 190, 100, 20)
$Set_Full_Button = GUICtrlCreateButton("Set Full Width", 20, 220, 100, 20)
GUISetState()
GUIRegisterMsg($WM_SIZE, "WM_SIZE")
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Set_Full_Button, $GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE
_GUICtrlListViewSetEquelColWidth($Main_GUI, $ListView, 1)
Case $Set_Equel_Button
_GUICtrlListViewSetEquelColWidth($Main_GUI, $ListView, 0)
EndSwitch
WEnd
Func WM_SIZE($hWndGUI, $MsgID, $WParam, $LParam)
;По каким то причинам функция не срабатывает корректно при разворачивании/восстановлении,
;поэтому пусть стандартный обработчик справляется с этими событиями ($GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE)..
_GUICtrlListViewSetEquelColWidth($hWndGUI, $ListView, 1)
EndFunc
Func _GUICtrlListViewSetEquelColWidth($hWnd, $hLV, $iFullMode=1)
If Not IsHWnd($hLV) Then $hLV = ControlGetHandle($hWnd, "", $hLV)
If @error Then Return SetError(1, 0, -1)
Local $LV_Header = DllCall("user32.dll", "long", "SendMessage", "hwnd", $hLV, "int", $LVM_GETHEADER, "int", 0, "int", 0)
If @error Then Return SetError(2, 0, -1)
;Local Const $HDM_GETITEMCOUNT = 0x1200
Local $sItmsCnt = DllCall("user32.dll", "long", "SendMessage", "hwnd", $LV_Header[0], "int", 0x1200, "int", 0, "int", 0)
If @error Then Return SetError(3, 0, -1)
Local $Columns_Count = $sItmsCnt[0]
Local $iLV_Width = 0
Switch $iFullMode
Case 0
Local $Columns_Width = 0
Local $GetColumns_Width
For $i = 0 To $Columns_Count
$GetColumns_Width = DllCall("user32.dll", "long", "SendMessage", _
"hwnd", $hLV, "int", $LVM_GETCOLUMNWIDTH, "int", $i, "int", 0)
$Columns_Width += $GetColumns_Width[0]
Next
$iLV_Width = $Columns_Width / $Columns_Count
Case 1
Local $sLV_Width = ControlGetPos($hWnd, "", $hLV)
If @error Then Return SetError(4, 0, 0)
$iLV_Width = ($sLV_Width[2]-10) / $Columns_Count
Case Else
Return SetError(5, 0, -1)
EndSwitch
For $i = 0 To $Columns_Count
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hLV, "int", $LVM_SETCOLUMNWIDTH, "int", $i, "int", $iLV_Width)
Next
EndFunc
Правда почему то функция не срабатывает корректно при разворачивании/восстановлении, поэтому пусть стандартный обработчик справляется с этими событиями ($GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE).
Но зато она работает и на внешних приложениях
Цитата:
твой код мне показался проще и понятнее чем на офф. форуме
|
Мне тоже
Цитата:
GUICtrlSendToDummy() я использую для того чтобы как можно быстрее выйти из функции и отпустить "передающий процесс".
|
Кстати, у меня есть старый пример с использованием фиктивной Label (для получения данных), я как то не подумал о том что можно Dummy использовать - спасибо.
|