DevCpp Listview geht nicht?



  • Hallo,

    ich bin nich ein Greennhorn, was c++ angeht, möchte micht aber gerne mehr damit befassen. Jetzt habe ich versucht, in das Beispiel "Wintest" ein Listview einzufügen, was aber überhaupt nicht klappen will.

    Hier mal der Quelltext mit den Änderungen:

    #include <windows.h>
    
    #include <string.h>
    #include <iostream>
    #include <commctrl.h>
    
    #define LVS_OWNERDATA           0x1000
    
    HWND hwndMain;
    
    LRESULT CALLBACK
    MainWndProc (HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
    {
    
    static HWND hwndButton = 0;
    static HWND hwndListView;
    static int cx, cy;/* Height and width of our button. */
    
    HDC hdc;/* A device context used for drawing */
    PAINTSTRUCT ps;/* Also used during window drawing */
    RECT rc;/* A rectangle used during drawing */
    
    switch (nMsg)
    {
    case WM_CREATE:
    {
    
    TEXTMETRIC tm;
    int dwStyle;
    
    hdc = GetDC (hwnd);
    SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT));
    GetTextMetrics (hdc, &tm);
    cx = tm.tmAveCharWidth * 30;
    cy = (tm.tmHeight + tm.tmExternalLeading) * 2;
    ReleaseDC (hwnd, hdc);
    
    dwStyle = WS_TABSTOP |
            WS_CHILD |
            WS_BORDER |
            WS_VISIBLE |
            LVS_AUTOARRANGE |
            LVS_REPORT |
            LVS_OWNERDATA;
    
    hwndButton = CreateWindow ("button","Click Here",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                    0, 0, cx, cy,hwnd,(HMENU) 1,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    
    hwndListView = CreateWindowEx(WS_EX_CLIENTEDGE,"SysListView",TEXT(""),dwStyle,10,10,100,100,hwndMain,(HMENU)1,((LPCREATESTRUCT) lParam)->hInstance,NULL);                       
    
    return 0;
    break;
    }
    
    case WM_DESTROY:
    
    PostQuitMessage (0);
    return 0;
    break;
    
    case WM_PAINT:
    
    hdc = BeginPaint (hwnd, &ps);
    GetClientRect (hwnd, &rc);
    
    rc.bottom = rc.bottom / 2;
    DrawText (hdc, "Hello, World!", -1, &rc,
    DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    
    EndPaint (hwnd, &ps);
    return 0;
    break;
    
    case WM_SIZE:
    
    if (hwndButton &&
    (wParam == SIZEFULLSCREEN ||
     wParam == SIZENORMAL)
       )
    {
    rc.left = (LOWORD(lParam) - cx) / 2;
    rc.top = HIWORD(lParam) * 3 / 4 - cy / 2;
    MoveWindow (
    hwndButton,
    rc.left, rc.top, cx, cy, TRUE);
    }
    break;
    
    case WM_COMMAND:
    
    if (LOWORD(wParam) == 1 &&
        HIWORD(wParam) == BN_CLICKED &&
        (HWND) lParam == hwndButton)
    {
    /* Our button was clicked. Close the window. */
    DestroyWindow (hwnd);
    }
    return 0;
    break;
    }
    
    return DefWindowProc (hwnd, nMsg, wParam, lParam);
    }
    
    int STDCALL
    WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
    {
    
    MSG msg;/* A Win32 message structure. */
    WNDCLASSEX wndclass;/* A window class structure. */
    char*szMainWndClass = "WinTestWin";
    
    memset (&wndclass, 0, sizeof(WNDCLASSEX));
    wndclass.lpszClassName = szMainWndClass;
    wndclass.cbSize = sizeof(WNDCLASSEX);
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = MainWndProc;
    wndclass.hInstance = hInst;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
    
    RegisterClassEx (&wndclass);
    
    hwndMain = CreateWindow (
    szMainWndClass,/* Class name */
    "Hello",/* Caption */
    WS_OVERLAPPEDWINDOW,/* Style */
    CW_USEDEFAULT,/* Initial x (use default) */
    CW_USEDEFAULT,/* Initial y (use default) */
    CW_USEDEFAULT,/* Initial x size (use default) */
    CW_USEDEFAULT,/* Initial y size (use default) */
    NULL,/* No parent window */
    NULL,/* No menu */
    hInst,/* This program instance */
    NULL/* Creation parameters */
    );
    
    InitCommonControls();
    
    ShowWindow (hwndMain, nShow);
    UpdateWindow (hwndMain);
    
    while (GetMessage (&msg, NULL, 0, 0))
    {
    TranslateMessage (&msg);
    DispatchMessage (&msg);
    }
    return msg.wParam;
    }
    

    Es wäre schön, wenn mir jemand sagen könnte, was hier falsch iszt, oder warum das nicht geht.

    Vielen Dank!

    Gruss
    Eckhard1



  • probier mal das

    hwndListView = CreateWindowEx(
    WS_EX_CLIENTEDGE,
    WC_LISTVIEW,
    TEXT(""),
    dwStyle,
    10,
    10,
    100,
    100,
    hwndMain,
    (HMENU)1,
    ((LPCREATESTRUCT) lParam)->hInstance,
    NULL);
    

    überprüfe mal ob ein gültiges handle zurückgeben wird

    if(!hwndListView)
      MessageBox(hwndMain, "fehler beim erstellen der listview", "fehler", MB_OK);
    

    ps: gehört ins winapi forum



  • frage zweimal gestellt...

    hier gehts weiter

    http://www.c-plusplus.net/forum/viewtopic.php?t=73194&highlight=
    😉



  • Hallo,
    zunächst erstmal vielen Dank für die schnellen Antworten.

    Eben habe ich mal getestet, ob ein Handle zurückgegeben wird = 0;

    Es wird kein Listview angezeigt - das muß doch einen Grund haben?

    Dann möchte ich mich Entschuldugen das die Frage zeimal hier auftaucht, das war ein versehen - soll nicht wieder vorkommen.

    Das die Frage in die WinApi-Rubrik gehört, hätte ich zunächst auch gedacht, aber weil das mit dem Listview mit LCC funktioniert und mit DevCpp nicht, habe ich gedacht, es sei ein Problem des DevCpp und nicht der WinApi.

    Gruss
    Eckhard!



  • edreier schrieb:

    Eben habe ich mal getestet, ob ein Handle zurückgegeben wird = 0;
    Es wird kein Listview angezeigt - das muß doch einen Grund haben?

    wenn der handle 0 ist wird auch keins erstellt.



  • Hallo,

    das habe ich auch festgestellt, das da kein Listview erstellt wird. Aber es handelt sich hier doch um die gleichen WinApi-Funktionen die auch LCC benutzt, und da funktionieren sie einwandfrei und zeigen auch das Listview an.

    Wenn das so ist, sollten sie aber doch auch mit DevCpp funktionieren?

    Folgendes habe ich festgestellt: In LCC wird immer die Funktion InitCommonControls() aufgerufen - die versucht in DevCpp immer einen Linkerfehler:

    [Linker error] undefined reference to `InitCommonControls@0'

    Kann es evtl. damit zusammenhängen, das das Listview weder erstellt noch angezeigt
    wird?

    Gruß
    Eckhard!



  • im visual studio linke ich die
    comctl32.lib

    mit.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/common/functions/initcommoncontrols.asp

    ob der devcpp das dabei hat, musst du testen.

    so long



  • Hallo,

    ich habe das mal versucht mit meinen sehr bescheidenen Fähigkeiten hinzukriegen - ob ich alles richtig gemacht habe kann ich leider nicht sagen.

    Unter Projekt im DevCpp habe ich Projekt_Optionen und dann bei Parameter/Linker die comctl32.lib eingefügt.

    Mit dem erfolg, das erstmal die Anwendung ohne meckern compiliert wurde - aber beim starten bekam ich die Meldung Fehler .... read konnte nicht auf dem speicher durchgeführt werden.

    Gruß
    Eckhard!



  • Hallo,

    🙂 ich bekommen jetzt in meinem Fenster das Listview zu sehen!

    Gemacht habe ich folgendes:

    Wie oben mit der comctl32.lib habe ich aus dem Lib-Ordner die libcomctl32.a gelinkt und dann gings.

    Und das Listview habe ich nicht im Create-Zweig der wndProc erstellt sondern in der winMain-Funktion.

    Jetzt kann ich ja mal versuchen an dem Ding weiter zu machen!

    Vielen Dank für Eure Hilfe!

    Gruß
    Eckhard!



  • hi war klar dass es mit der comctl32.lib nicht funktioniert, mingw kann nur mit .a bibliotheken umgehen und nicht mit .lib , deswegen gibt es im lib verzeichnis fast alle bibliotheken mit libname.a



  • Hallo,

    das muß man aber auch erstmal wissen!

    Gruß
    Eckhard!


Anmelden zum Antworten