Winapi ListView не может предотвратить изменение размеров столбцов
Я пытаюсь создать ListView с фиксированной шириной столбцов в проекте Winapi C++.
Я пытаюсь использовать трюк с обработкой уведомления HDN_BEGINTRACK в процедуре диалогового окна, просто возвращая в нем значение ИСТИНА. Как я понял из разных статей, это может сработать.
Дело в том, что я ловлю это, но возвращение ИСТИНЫ не мешает изменению размера.
Также пытался вернуть TRUE сразу после получения WM_NOTIFY - тот же эффект.
Помоги мне, пожалуйста. Вот некоторые части кода:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance;
----
hDlg = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG),
hWnd,(DLGPROC)DlgProc);
INITCOMMONCONTROLSEX icex;
icex.dwICC = ICC_LISTVIEW_CLASSES;
InitCommonControlsEx(&icex);
HWND hWndListView = CreateWindow(
WC_LISTVIEW,
L"",
WS_CHILD | LVS_REPORT |WS_VISIBLE,
0, 0,
382,
200,
hDlg,
(HMENU)IDC_LIST,
hInst,
NULL);
----
//adding columns and items
----
DWORD exStyle = LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
ListView_SetExtendedListViewStyle(hWndListView,exStyle);
SetWindowTheme(hWndListView, L"Explorer", NULL);
----
return TRUE;
}
BOOL CALLBACK DlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
----
case WM_NOTIFY:
switch(((LPNMHDR)lParam)->code)
{
case HDN_BEGINTRACK:
OutputDebugString(L"HDN_BEGINTRACK\n");
return TRUE;
default:
break;
}
----
}
return FALSE;
}
Заранее спасибо!
1 ответ
Решение
Возврат значения TRUE из WM_NOTIFY в диалоговой процедуре только показывает, что вы обработали сообщение. Чтобы на самом деле вернуть значение результата, вы также должны установить диалог DWL_MSGRESULT
:
case HDN_BEGINTRACK:
OutputDebugString(L"HDN_BEGINTRACK\n");
SetWindowLong(hDlg, DWL_MSGRESULT, TRUE); // prevent resizing
return TRUE; // message processed; check DWL_MSGRESULT for real result