Winapi ListView无法阻止列调整大小

时间:2012-11-10 20:39:56

标签: winapi listview fixed-width column-width

我正在尝试使用winapi C ++项目中的固定宽度列创建ListView。

我尝试使用一个技巧来处理对话框过程中的HDN_BEGINTRACK通知,只需在其中返回TRUE即可。正如我从不同的文章中理解的那样它可能有用

重点是,我抓住它,但返回TRUE并不会阻止调整大小。

也尝试在获得WM_NOTIFY后返回TRUE - 效果相同。

请帮帮我。以下是代码的一些部分:

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 个答案:

答案 0 :(得分:4)

对话框过程中从WM_NOTIFY返回TRUE仅显示您已处理该消息。要实际返回结果值,还必须设置对话框的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