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

30.11.2016, 19:43

WinAPI Probleme mit Combo boxes

Hallo zusammen

Ich habe ein Problem mit meiner Combo box und zwar habe ich eine externe Klasse für sie erstellt(werden später noch weitere kommen).
Das Compilen funktioniert problemlos und es zeigt das Fenster auch an aber die Combo box nicht.

ComboBox Header:

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
void ComboBox::Initialize()
{
    wWindow window;

    ////////////////////////////////////
    //                                //
    //      Combobox Informations     //
    //                                //
    ////////////////////////////////////
    TCHAR Combobox_File[9][16] =
    {
        TEXT("New"), TEXT("Open"), TEXT("Add"), TEXT("Save      Ctrl+S"),
        TEXT("Save As..."), TEXT("Save All"), TEXT("Exit        Alt+F4")
    };

    // Create the parameters for FILE Combobox
    //
    // Uses the CreateWindow function to create a child window of 
    // the application window. The WC_COMBOBOX window style specifies  
    // that it is a combobox.
    int xPos = 100;                 // Horizontal position of the window
    int yPos = 100;                 // Vertical position of the window
    int nWidth = 200;               // Width of the window
    int nHeight = 200;              // Height of the window
    HWND hWndParent = window[0];    // Get the window from the Window Class

    // Create the Combobox_File
    HWND hWndComboBox_File = CreateWindow(WC_COMBOBOX, TEXT(""),
                                          CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
                                          xPos, yPos, nWidth, nHeight, hWndParent, NULL, HINST_THISCOMPONENT,
                                          NULL);

    TCHAR A[16];
    int k = 0;

    memset(&A, 0, sizeof(A));
    // Go trough every TEXT in the string
    for (k = 0; k <= 8; k += 1)
    {
        // Copies a string
        wcscpy_s(A, sizeof(A) / sizeof(TCHAR), (TCHAR*)Combobox_File[k]);

        // Add string to combobox
        SendMessage(hWndComboBox_File, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)A);
    }

    // Send the CB_SETCURSEL message to display an initial item 
    // in the selection field  
    SendMessage(hWndComboBox_File, CB_SETCURSEL, (WPARAM)2, (LPARAM)0);

    return;
}


In Window.cpp rufe ich die Funktion in der Initialize Funktion von Window.cpp auf.
Hab den restlichen Teil in der Initialize Funktion weggelassen, weil es das Window richtig erstellt und dort nicht der Fehler sein könnte.

Window.cpp:

C-/C++-Quelltext

1
m_comboBox->Initialize();


Weiss jemand was der Fehler sein könnte, denn ich komme nicht drauf :(

-SlyGamer

2

30.11.2016, 20:34

Vielleicht hilft es, nach jedem WinAPI aufruf, zu gucken ob alles geklappt hat. GetLastError kann da eventuell Klarheit schaffen.

3

30.11.2016, 20:42

Erstmal nutze den Konstruktor und keine Init-Methoden!

Dann kommt mir auf den ersten Blick die Variable window[0] komisch vor.

Du nutzt sie als array sie wird aber lokal nicht als array erzeugt.

Ansonsten nutz den Debugger der hilft unheimlich viel weiter.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

4

30.11.2016, 20:48

@Hannes
Stimmt hast recht, den könnte ich ja mal benutzen :D

@Koschi
Könnte ich auch die Init Methode im Konstruktor aufrufen und dann so weitergeben oder wie
würdest du es mir empfehlen?
Und das window[0] ist ein operator, damit ich keine getter funktion verwenden muss

Window.h:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
HWND& operator[](int index)
    {
        switch (index)
        {
        case 0:
            return m_hwnd;
            break;

        default:
            throw std::out_of_range("Index in operator[] of Window.h is out of range");
        }
    }

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

30.11.2016, 21:12

Und das window[0] ist ein operator, damit ich keine getter funktion verwenden muss
Welchen Vorteil genau siehst du denn da?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

30.11.2016, 21:16

@BlueCobold
Ich sehe keine Vorteile darin, habe mich einfach nur daran gewöhnt es so zu
schreiben und Gewohnheiten werde ich schlecht wieder los :rolleyes:

Siehst du denn irgendwelche Vorteile oder Nachteile in dieser Methode? :huh:

7

30.11.2016, 21:31

Was bedeutet eigentlich -> HINST_THISCOMPONENT? Ich hab da immer GetModuleHandle(0) genommen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

30.11.2016, 21:40

Siehst du denn irgendwelche Vorteile oder Nachteile in dieser Methode?
Vorteile? Nein. Nachteile? Jede Menge:
- Es ist unintuitiv den []-Operator dafür zu verwenden
- Es ist semantischer Quatsch ihn dafür zu verwenden, weil es sich nicht um einen Container handelt oder ähnliches
- Es kann nur einen []-Operator geben, der nur einen einzigen Typ zurückliefern kann. Benötigst du mehrere, landest du ohnehin wieder bei get
- [] sagt nichts aus, eine aussagekräftige get-Methode schon eher
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

01.12.2016, 12:50

@Hannes

HINST_THISCOMPONENT ist ein Befehl um das jetzige HINSTANCE aufzurufen

// Acessing the current module's HINSTANCE from a static library
#ifndef HINST_THISCOMPONENT
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
#endif

PS:Kann kein c++ Code auswählen, Option nicht verfügbar(im Tor Browser)

10

01.12.2016, 12:52

@BlueCobold
Soll ich deiner Meinung also lieber getter funktionen verwenden?

Weiss noch niemand, was der Fehler sein könnte?

Werbeanzeige