2017-01-30 6 views
0

Ich habe ein Problem mit meinem Code. Zunächst besteht die Essenz dieses Codes darin, mit win32 eine ListView mit einigen Spalten zu erstellen.C++ Win32 ListView Spalten

Das Problem ist, wenn ich versuche, Spalten zu meinem ListView hinzufügen und versuchen, es anzuzeigen zeigt mir die Spalten nicht. Hier ist mein Code, danke für jede Hilfe.

HWND function::CreateListView (HWND hwndParent) 
{ 
    INITCOMMONCONTROLSEX icex;   // Structure for control initialization. 
    icex.dwICC = ICC_LISTVIEW_CLASSES; 
    InitCommonControlsEx(&icex); 
    RECT rcClient; 
    // The parent window's client area. 
    GetClientRect (hwndParent, &rcClient); 
    HWND hWndListView = CreateWindow(WC_LISTVIEW, "ViewList",WS_BORDER| WS_CHILD | LVS_REPORT | LVS_EDITLABELS,500,300,300,300,hwndParent,NULL,hInst,NULL); 
    return (hWndListView); 
} 

VOID function::SetView(HWND hWndListView, DWORD dwView) 
{ 
    // Retrieve the current window style. 
    DWORD dwStyle = GetWindowLong(hWndListView, GWL_STYLE); 

    // Set the window style only if the view bits changed. 
    if ((dwStyle & LVS_TYPEMASK) != dwView) 
    { 
     SetWindowLong(hWndListView, 
         GWL_STYLE, 
         (dwStyle & ~LVS_TYPEMASK) | dwView); 
    }     // Logical OR'ing of dwView with the result of 
}  

BOOL InitListViewColumns(HWND hWndListView) 
{ 
    char szText[256] ="test";  // Temporary buffer. 
    LVCOLUMN lvc; 
    int iCol; 

    // Initialize the LVCOLUMN structure. 
    // The mask specifies that the format, width, text, 
    // and subitem members of the structure are valid. 
    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM|LVS_REPORT; 

    // Add the columns. 
    for (iCol = 0; iCol < C_COLUMNS; iCol++) 
    { 
     lvc.iSubItem = iCol; 
     lvc.pszText = "LOL"; 
     lvc.cx = 100;    // Width of column in pixels. 
     if (iCol < 2) 
      lvc.fmt = LVCFMT_LEFT; // Left-aligned column. 
     else 
      lvc.fmt = LVCFMT_RIGHT; // Right-aligned column. 

     // Load the names of the column headings from the string resources. 
     LoadString(hInst,iCol,szText, sizeof(szText)/sizeof(szText[0])); 

     // Insert the columns into the list view. 
     if (ListView_InsertColumn(hWndListView, iCol, &lvc) == -1) 
      return FALSE; 
    } 

    return TRUE; 
} 
+0

Der Editor, mit dem Sie Ihre Frage eingegeben haben, hat eine Live-Vorschau, so dass Sie sehen können, wie Ihre Frage aussieht. Verwenden Sie es, um zu überprüfen, dass Sie konsistente Formatierung verwenden. – IInspectable

+3

'LVS_REPORT' als Teil von' LVCOLUMN.mask' ist kein gültiges Flag, es ist ein ListView * Style *. –

+0

Ich entferne den LVS_REPORT und funktioniert immer noch nicht –

Antwort

0

Sie haben vergessen, den WS_VISIBLE Stil angeben, wenn CreateWindow Aufruf der Listenansicht zu erstellen. Die Listenansicht und die Spalten sind dort, nur nicht sichtbar.

Der Puffer, den Sie an LoadString übergeben, wird nie verwendet, da Sie nie lvc.pszText = szText festlegen, so dass alle Spalten "LOL" benannt werden.

Bearbeiten: Meine Antwort gilt für den Code, nachdem es mit Fixes aus den Kommentaren bearbeitet wurde. LVS_REPORT ist immer noch kein gültiges LVCF_ * -Flag, aber weil es den gleichen Wert wie LVCF_FMT hat, schadet es in diesem speziellen Code nicht, sollte aber trotzdem entfernt werden, da der Code technisch inkorrekt ist.

+0

Ein 'WS_VISIBLE'-Stil ist keinesfalls zwingend erforderlich. Das allgemeine Muster besteht darin, das Fenster zu erstellen und anschließend 'ShowWindow' für das zurückgegebene Handle aufzurufen. Die tatsächlichen Probleme wurden in den Kommentaren zu der Frage angesprochen. – IInspectable

+0

@Intspectable: Wenn Sie den Code wie nach der Bearbeitung nehmen, dann scheint es so, als wäre die Listenansicht kaputt, weil das übergeordnete Dialogfeld leer ist, aber sobald Sie das sichtbare Flag hinzufügen, sehen Sie die Listenansicht und ihre Spalten. – Anders

+0

Nein, tut es nicht. Es ist immer noch ein 'LVS_REPORT' zugeordnet zu 'lvc.mask'. – IInspectable