Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.02.2006, 17:33

[WINAPI] ListView im Dialog

Hiho!

Also ich will jetzt bei meinem Kniffelspiel eine Highscore einbauen und dazu das Commun Control ListView nutzen!

Wenn ich dieses Listview ganz normal in einem hauptfenster von einer Testanwendung erstelle kann ich dann so Spalten und Text einfügen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                int itemjetzt;
                LVCOLUMN lvc;

                    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
                    lvc.fmt = LVCFMT_RIGHT;
                    lvc.cx = 15;
                    lvc.pszText = "Text2";  
                    lvc.iSubItem = NULL;
                    SendMessage(hwndlvw,LVM_INSERTCOLUMN,NULL,(LONG)&lvc);

                LVITEM Item;

                    Item.mask=LVIF_TEXT ;
                    Item.iItem=1; 
                    Item.iSubItem=NULL; 
                    Item.stateMask=NULL; 
                    Item.pszText="Text"; 
                    Item.cchTextMax=9;

                    itemjetzt = ListView_InsertItem(hwndlvw,&Item);
                    ListView_SetItemText(hwndlvw, itemjetzt, 1, "hallo");


So, aber wenn ich jetzt in einer Dialogbox in ListView-Objekt verändern will, dann muss ich mir ja erstmal das handel zum window holen, das passiert dann ungefähr so:

C-/C++-Quelltext

1
2
                        HWND hwndlvw;
                        hwndlvw = GetDlgItem(hDlg1,IDC_LIST1);


und wenn ich dann jetzt versuche die obrigen Funktionen etc. zu nutzen um Texte und Spalten in das LIstView einzufügen, dann funzt das nciht, das ListView bleibt einfach leer ...

MIr wäre warscheinl. sehr geholfen, wenn mir einer zeigen könnte, wie ich in einer Dialogprozedur ein ListView-Objekt "erweitere".

So sieht halt meine Dialogprozedur aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
BOOL CALLBACK DlgProc2 (HWND hDlg1, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_INITDIALOG:
            {
                return TRUE;
            };

        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDOK:
                    {
                        HWND hwndlvw;
                        hwndlvw = GetDlgItem(hDlg1,IDC_LIST1);
/*                      int itemjetzt;
                        LVCOLUMN lvc;                   
                        LVITEM Item;
                        

                        lvc.mask = LVCF_TEXT;
                        lvc.fmt = LVCFMT_RIGHT;
                        lvc.cx = 15;
                        lvc.pszText = "Spielername";  
                        lvc.iSubItem = NULL;
                        SendMessage(hwndlvw,LVM_INSERTCOLUMN,NULL,(LONG)&lvc);

                        lvc.mask = LVCF_TEXT;
                        lvc.fmt = LVCFMT_RIGHT;
                        lvc.cx = 15;
                        lvc.pszText = "Punktezahl";  
                        lvc.iSubItem = NULL;
                        SendMessage(hwndlvw,LVM_INSERTCOLUMN,NULL,(LONG)&lvc);

                        lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
                        lvc.fmt = LVCFMT_RIGHT;
                        lvc.cx = 15;
                        lvc.pszText = "Datum";  
                        lvc.iSubItem = NULL;
                        SendMessage(hwndlvw,LVM_INSERTCOLUMN,NULL,(LONG)&lvc);

                        lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
                        lvc.fmt = LVCFMT_RIGHT;
                        lvc.cx = 15;
                        lvc.pszText = "Rang";  
                        lvc.iSubItem = NULL;
                        SendMessage(hwndlvw,LVM_INSERTCOLUMN,NULL,(LONG)&lvc);

                        Item.mask=LVIF_TEXT ;
                        Item.iItem=1; 
                        Item.iSubItem=NULL; 
                        Item.stateMask=NULL; 
                        Item.pszText="Top_se"; 
                        Item.cchTextMax=9;

                        itemjetzt = ListView_InsertItem(hwndlvw,&Item);
                        ListView_SetItemText(hwndlvw, itemjetzt, 1, "500");
                        ListView_SetItemText(hwndlvw, itemjetzt, 1, "12.15.2005");
                        ListView_SetItemText(hwndlvw, itemjetzt, 1, "1");
*/

                        LVCOLUMN lvc;

                        lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
                        lvc.fmt = LVCFMT_LEFT;
                        lvc.cx = 30;
                        lvc.pszText = "Text";  
                        lvc.iSubItem =NULL;
                        return ListView_InsertColumn(hwndlvw,NULL,&lvc);
                        
                        return TRUE;
                    };
                case ID_ABBRECHEN:
                {
                    EndDialog(hDlg1,0);
                    return true;
                };
            };
        break;
    };
    return FALSE;
};


Dankesehr!

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

25.02.2006, 18:53

Sehe ich das richtig, dass Du die List-View-Spalten erst einfügen willst, wenn man OK drückt? Das hat wenig Sinn...
Erweitere Deine List-View wenn das Dialog-Fenster initialisiert wird (WM_INITDIALOG)...

3

25.02.2006, 19:20

Jaja, *g*, das haste richtig gesehen!

Das hab ich eigentl. nur zu Testzwecken gemacht, weil ich mir nicht 100pro sicher war, ob diese WM_INITDIALOG auch aufgerufen wird ...
Dass aber nach dem Okaydrücken alles ausgeführt wird, da bin ich mir 100 pro sicher :D

Also das war der einzige Grund dafür, und es ändert nciths dadran, dass es cnith funzt, leider

Wenn es dann funzt (hoff ich mal) dann stell ich das auch wieder um ...

Trotzdem THX für den Hinweis!

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

25.02.2006, 19:30

Wird denn das List-View-Fenster an sich dargestellt, nur die erweiterten Spalten fehlen, oder wird selbst das List-View-Fenster nicht angezeigt?
Weil u.U. musst Du nämlich die List-View-Fensterklasse erst noch registrieren...

5

25.02.2006, 20:15

nee, also das Fenster wird angezeigt, es bleibt aber hatl einfach weiß, ich hab schon gedacht, dass es vllt. andere Styles nutzt, und deshalb vllt. keine zusätzlichen Spalten akzeptiert, aber das wäre ja ein bissl Blödsinn, oder?
So ist das ListView-Objekt in der Resourcefile hinterlegt:

C-/C++-Quelltext

1
2
3
    LISTBOX         IDC_LIST1,5,25,315,255,LBS_USETABSTOPS | LBS_MULTICOLUMN | 
                    WS_VSCROLL | WS_HSCROLL,WS_EX_ACCEPTFILES | 
                    WS_EX_CLIENTEDGE


Edit: Wie registriert man denn eine List-View-Fensterklasse?

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

26.02.2006, 01:34

Zitat von »"Top_se"«

Edit: Wie registriert man denn eine List-View-Fensterklasse?

C-/C++-Quelltext

1
2
3
4
5
INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(icex);
    icex.dwICC = ICC_LISTVIEW_CLASSES;
    if (!InitCommonControlsEx( &icex ))
        LOG_ERROR_RET( "Common-Control-Classes konnten nicht initialisiert werden.", false );

Ich weiss jetzt auf Anhieb nicht, ob es eine einfachere Möglichkeit gibt, um eine einzelne Vorlagenklasse zu registrieren, da in meinem Original-Code mehr als nur die List-View-Fensterklasse registiert wurde, also ICC_LISTVIEW_CLASSES noch um einige Konstanten ergänzt wurde...

7

26.02.2006, 12:46

Danke, wieder was gelernt, aber ich hab meinen Fehler gefunden *sich erwürg*

ich hab kein Listenelement, wie es in VS6 bezeichnet wird, sondern ein Listenfeld genommen ...

Nuja, sorry für den Aufriss und danke für deine Beteiligung!

Werbeanzeige