| 1 | #include <GuiConstantsEx.au3> |
|---|
| 2 | #include <WindowsConstants.au3> |
|---|
| 3 | #include <GuiListView.au3> |
|---|
| 4 | #include <HeaderConstants.au3> |
|---|
| 5 | #include <WinAPI.au3> |
|---|
| 6 | |
|---|
| 7 | ; The 0-based column to be disabled |
|---|
| 8 | Global $iFix_Col |
|---|
| 9 | Global $hOld_WndProc |
|---|
| 10 | ; Get new WndProc hamdle and pointer |
|---|
| 11 | Global $hNew_WndProc = DllCallbackRegister("_New_LVHdr_Proc", "lresult", "hwnd;uint;wparam;lparam") |
|---|
| 12 | Global $pNew_WndProc = DllCallbackGetPtr($hNew_WndProc) |
|---|
| 13 | ; To save old WndProc handle |
|---|
| 14 | Global $hOld_WndProc |
|---|
| 15 | |
|---|
| 16 | _Main() |
|---|
| 17 | |
|---|
| 18 | Func _Main() |
|---|
| 19 | Local Const $hGUI = GUICreate("ListView Fix Column Width", 400, 300) |
|---|
| 20 | |
|---|
| 21 | Local Const $cListView = GUICtrlCreateListView("Column 0|Column 1|Column 2|Column 3", 10, 10, 380, 220) |
|---|
| 22 | GUICtrlCreateListViewItem("0|1|2|3", $cListView) |
|---|
| 23 | |
|---|
| 24 | Global $hLVHdr = _GUICtrlListView_GetHeader($cListView) |
|---|
| 25 | |
|---|
| 26 | $cButton = GUICtrlCreateButton("Test", 10, 250, 80, 30) |
|---|
| 27 | |
|---|
| 28 | GUISetState() |
|---|
| 29 | |
|---|
| 30 | ; Prevent resizing of column 1 |
|---|
| 31 | $iFix_Col = 1 |
|---|
| 32 | |
|---|
| 33 | ; Prevent drag resize |
|---|
| 34 | GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") |
|---|
| 35 | |
|---|
| 36 | ; SubClass LV Header |
|---|
| 37 | $hOld_WndProc = _WinAPI_SetWindowLong($hLVHdr, $GWL_WNDPROC, $pNew_WndProc) |
|---|
| 38 | ConsoleWrite("Old proc: 0x" & Hex($hOld_WndProc, 8) & @CRLF) |
|---|
| 39 | |
|---|
| 40 | ; Loop until user exits |
|---|
| 41 | While 1 |
|---|
| 42 | Switch GUIGetMsg() |
|---|
| 43 | Case $GUI_EVENT_CLOSE |
|---|
| 44 | Exit |
|---|
| 45 | Case $cButton |
|---|
| 46 | ConsoleWrite("Pressed" & @CRLF) |
|---|
| 47 | EndSwitch |
|---|
| 48 | WEnd |
|---|
| 49 | |
|---|
| 50 | GUIDelete($hGUI) |
|---|
| 51 | EndFunc ;==>_Main |
|---|
| 52 | |
|---|
| 53 | Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) |
|---|
| 54 | |
|---|
| 55 | ; Get details of message |
|---|
| 56 | Local $tNMHEADER = DllStructCreate($tagNMHEADER, $lParam) |
|---|
| 57 | ; Look for header resize code |
|---|
| 58 | $iCode = DllStructGetData($tNMHEADER, "Code") |
|---|
| 59 | Switch $iCode |
|---|
| 60 | Case $HDN_BEGINTRACKW |
|---|
| 61 | ; Now get column being resized |
|---|
| 62 | Local $iCol = DllStructGetData($tNMHEADER, "Item") |
|---|
| 63 | If $iCol = $iFix_Col Then |
|---|
| 64 | ; Prevent resizing |
|---|
| 65 | Return True |
|---|
| 66 | Else |
|---|
| 67 | ; Allow resizing |
|---|
| 68 | Return False |
|---|
| 69 | EndIf |
|---|
| 70 | EndSwitch |
|---|
| 71 | |
|---|
| 72 | EndFunc ;==>_WM_NOTIFY |
|---|
| 73 | |
|---|
| 74 | Func _New_LVHdr_Proc($hWnd, $iMsg, $wParam, $lParam) |
|---|
| 75 | |
|---|
| 76 | Switch $iMsg |
|---|
| 77 | Case $WM_SETCURSOR |
|---|
| 78 | Return True |
|---|
| 79 | EndSwitch |
|---|
| 80 | |
|---|
| 81 | ; Now call previous WndProc and complete the chain |
|---|
| 82 | Return _WinAPI_CallWindowProc($hOld_WndProc, $hWnd, $iMsg, $wParam, $lParam) |
|---|
| 83 | ;Return CallWindowProc($hOld_WndProc, $hWnd, $iMsg, $wParam, $lParam) |
|---|
| 84 | EndFunc ;==>_New_LVHdr_Proc |
|---|
| 85 | |
|---|
| 86 | Func CallWindowProc($lpPrevWndFunc, $hWnd, $Msg, $wParam, $lParam) |
|---|
| 87 | Return DllCall("user32.dll", "lresult", "CallWindowProc", "ptr", $lpPrevWndFunc, "hwnd", $hWnd, "uint", $Msg, "wparam", $wParam, "lparam", $lParam)[0] |
|---|
| 88 | EndFunc ;==>CallWindowProc |
|---|