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

Anonymous

unregistriert

1

26.12.2004, 12:19

EnumDialog Problem beim Auslesen der Combo

hi,

und zwar habe ich ein Problem mit dem Auslesen des ComboBox Inhaltes.
Es handelt sich um eine Enumeration. Ich lese erst alle VideoModes aus und schiebe diese in die ComboBox. Jedoch muss ich später beim BackBufferFormat den aktuell gewählten VideoMode herausbekommen. Die ComboBox für den Backbuffer bleibt aber leer. Die VideoMode Combo
wird also falsch ausgelesen. Aber warum? Im Buch vom David ruft er erst noch die tbMemAlloc Funktion auf!Ich denke mal daran wirds liegen!Jedoch müsste es doch auch ohne die Funktion gehen?!Oder?!Hier erstmal die Funktion für die VideoModes:

Quellcode

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
VOID CDXEnum::VideoModes(VOID){

    SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_RESETCONTENT, 0, 0);

    INT iNumVideoModes;
    char cVideoModes[1000] = "";
    char Format[256];
    
    INT iIndex = 0;
    
    //D3DFORMATS's for test
    D3DFORMAT d3dFormats[] = {D3DFMT_X8R8G8B8, D3DFMT_A2R10G10B10, D3DFMT_R5G6B5, D3DFMT_X1R5G5B5};

                                            
    for(int iVideoFormats = 0; iVideoFormats < 4; iVideoFormats++)
    {

        iNumVideoModes = m_lpD3D->GetAdapterModeCount(m_iChoosenAdapter, d3dFormats[iVideoFormats]);
        
        D3DDISPLAYMODE* pVideoModes = new D3DDISPLAYMODE[iNumVideoModes];
        

        for(int iVideoModes = 0; iVideoModes < iNumVideoModes; iVideoModes++)
        {
            
            m_lpD3D->EnumAdapterModes(m_iChoosenAdapter, d3dFormats[iVideoFormats], iVideoModes,
                &pVideoModes[iVideoModes]);

            ReturnFormatString(pVideoModes[iVideoModes].Format, Format);
            
            sprintf(cVideoModes, "NumModus %d: %d x %d x %d Hz with %s", 
                iVideoModes,
                pVideoModes[iVideoModes].Width,
                pVideoModes[iVideoModes].Height,
                pVideoModes[iVideoModes].RefreshRate,
                Format);

            //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            iIndex = (INT)SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_ADDSTRING, 0, (LPARAM)cVideoModes);
            SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_SETITEMDATA, iIndex, (LPARAM)(pVideoModes));
                        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        
        }

        delete[] pVideoModes;

    }

    SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_SETCURSEL, 0, 0);

}


So und nun die BackBufferfunktion die die Videomodes auslesen soll(aus der ComboBox).:

Quellcode

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
VOID CDXEnum::GetBackBufferFormats(VOID){

    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    INT iVideoModes;
    D3DDISPLAYMODE* pVideoModes = NULL;
    iVideoModes = (INT)SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_GETCURSEL, 0, 0);
    pVideoModes = (D3DDISPLAYMODE*)SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_GETITEMDATA, iVideoModes, 0);
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboAdapterFormats, CB_RESETCONTENT, 0, 0);

    GetCurrentDisplayMode();
    
    D3DFORMAT d3dFormats[] = {D3DFMT_X8R8G8B8, D3DFMT_A8R8G8B8, D3DFMT_R5G6B5, D3DFMT_A2R10G10B10,
        D3DFMT_A1R5G5B5, D3DFMT_X1R5G5B5};
    char cFormats[256];
    char cBufferFormats[256];
        
    for(int iNumFormats = 0; iNumFormats < 6; iNumFormats++)
    {

        //!!!!!!!!!!!!!!!!!!!pVideoMode falsch ausgelesen?!!!!!
        if(SUCCEEDED(m_lpD3D->CheckDeviceFormat(m_iChoosenAdapter, m_d3dDevType, pVideoModes->Format, D3DUSAGE_RENDERTARGET,
            D3DRTYPE_SURFACE,
            d3dFormats[iNumFormats])))
        {

        (...)

Hier mal noch die zwei Funktion fürs in die Liste schreiben/lesen.
Axo, die auskommentierten "SendDlgItemMessage" ist die andere Variante die ich probiert
hatte und die auch nicht ging.

VOID* CDXEnum::GetSelectedItem(INT Handles) {
    WPARAM nI = (WPARAM)((int)(DWORD)SendDlgItemMessage(m_hDlg, Handles, CB_GETCURSEL, 0, 0));
    return ((void*)SendDlgItemMessage(m_hDlg,Handles,CB_GETITEMDATA,nI,0));
}


VOID CDXEnum::AddItem(INT Handles, char *ch, void *pData) {
    WPARAM nI = (WPARAM)((int)(DWORD)SendDlgItemMessage(m_hDlg, Handles, CB_ADDSTRING, 0, (LPARAM)ch));
    SendDlgItemMessage(m_hDlg, Handles, CB_SETITEMDATA, nI, (LPARAM)pData);
}


Wäre supi wenn mir jemand helfen könnte!

mfg

KG
[/code]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

26.12.2004, 12:51

pVideoModes ist doch ein zeiger auf einen Array und nicht auf eine einzelne Instanz.

C-/C++-Quelltext

1
2
3
4
5
D3DDISPLAYMODE* pVideoModes = new D3DDISPLAYMODE[iNumVideoModes]; 

D3DDISPLAYMODE* pVideoModes = NULL; 
   iVideoModes = (INT)SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_GETCURSEL, 0, 0); 
    pVideoModes = (D3DDISPLAYMODE*)SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_GETITEMDATA, iVideoModes, 0);

Anonymous

unregistriert

3

26.12.2004, 13:32

huh?
das wäre aber doch ne Neudefinition?!:

Quellcode

1
2
3
D3DDISPLAYMODE* pVideoModes = new D3DDISPLAYMODE[iNumVideoModes]; 

D3DDISPLAYMODE* pVideoModes = NULL;


Ich denke mal das stimmt schon soweit nur irgendwie muss da noch der Speicher in ne Liste geschrieben(tbMemAlloc).
Hier mal der Code von David:

Quellcode

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
tbResult EnumVideoModes(HWND hDlg)
{
    int             iSelectedAdapter;
    int             iNumVideoModes;
    D3DFORMAT       aFormat[] = {D3DFMT_X8R8G8B8, D3DFMT_R8G8B8, D3DFMT_R5G6B5, D3DFMT_X1R5G5B5};
    D3DDISPLAYMODE* pVideoMode;
    char            acFormatString[256];
    char            acVideoModeString[256];
    int             iIndex;


    // Gewählten Adapter abfragen
    iSelectedAdapter = (int)(SendDlgItemMessage(hDlg, IDC_D3DS_ADAPTERS, CB_GETCURSEL, 0, 0));

    // Liste der Videomodi leeren
    DeleteListData(hDlg, IDC_D3DS_VIDEO_MODES);

    // Anzahl der verfügbaren Videomodi erfragen.
    // Wir gehen dabei Format für Format durch.
    for(int iFormat = 0; iFormat < 4; iFormat++)
    {
        iNumVideoModes = g_pD3DTemp->GetAdapterModeCount(iSelectedAdapter, aFormat[iFormat]);
        
        // Jeden Videomodus durchgehen und Informationen über ihn abfragen
        for(int iVideoMode = 0; iVideoMode < iNumVideoModes; iVideoMode++)
        {
            // Speicher für diesen Videomodus reservieren
            pVideoMode = (D3DDISPLAYMODE*)(tbMemAlloc(sizeof(D3DDISPLAYMODE)));

            // Informationen abfragen
            g_pD3DTemp->EnumAdapterModes(iSelectedAdapter, aFormat[iFormat], iVideoMode, pVideoMode);

            // Textbeschreibung für diesen Videomodus generieren
            GetFormatString(pVideoMode->Format, acFormatString);
            if(pVideoMode->RefreshRate != 0) sprintf(acVideoModeString, "%d x %d (%s, %d Hz)", pVideoMode->Width, pVideoMode->Height, acFormatString, pVideoMode->RefreshRate);
            else sprintf(acVideoModeString, "%d x %d (%s)", pVideoMode->Width, pVideoMode->Height, acFormatString);
            
            // Einen neuen Listeneintrag anlegen
            iIndex = (int)(SendDlgItemMessage(hDlg, IDC_D3DS_VIDEO_MODES, CB_ADDSTRING,
                                              0, (LPARAM)(acVideoModeString)));

            // Daten dem Eintrag zuweisen
            SendDlgItemMessage(hDlg, IDC_D3DS_VIDEO_MODES, CB_SETITEMDATA,
                               iIndex, (LPARAM)(pVideoMode));
        }
    }

    // Ersten Videomodus auswählen
    SendDlgItemMessage(hDlg, IDC_D3DS_VIDEO_MODES, CB_SETCURSEL, 0, 0);

    return TB_OK;
}


Ich habe mir die tbMemAlloc mal angeschaut, aber das is mir irgendwie zu hoch. Ich suche halt ne Möglichkeit ohne die Funktion auszukommen(oder halt den Speicher zu reservieren, so das ichs versteh ;-)). Denn so wie ich es verstanden hab muss man den Speicher reservieren um aus der ComboBox den Inhalt auslesen zu können.

mfg

KG[/code]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

26.12.2004, 13:45

.... ich meinte das eine ist ein zeiger auf ein array und du speicherst ihn aus so, aber du holst ihn dir als zeiger auf eine Instanz wieder.
Also die lösung sollte sein:

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
VOID CDXEnum::VideoModes(VOID){ 

    SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_RESETCONTENT, 0, 0); 

    INT iNumVideoModes; 
    char cVideoModes[1000] = ""; 
    char Format[256]; 
    
    INT iIndex = 0; 
    
    //D3DFORMATS's for test 

    D3DFORMAT d3dFormats[] = {D3DFMT_X8R8G8B8, D3DFMT_A2R10G10B10, D3DFMT_R5G6B5, D3DFMT_X1R5G5B5}; 

                                            
    for(int iVideoFormats = 0; iVideoFormats < 4; iVideoFormats++) 
    { 

        iNumVideoModes = m_lpD3D->GetAdapterModeCount(m_iChoosenAdapter, d3dFormats[iVideoFormats]); 
        
        D3DDISPLAYMODE* pVideoModes = new D3DDISPLAYMODE[iNumVideoModes]; 
        

        for(int iVideoModes = 0; iVideoModes < iNumVideoModes; iVideoModes++) 
        { 
            
            m_lpD3D->EnumAdapterModes(m_iChoosenAdapter, d3dFormats[iVideoFormats], iVideoModes, 
                &pVideoModes[iVideoModes]); 

            ReturnFormatString(pVideoModes[iVideoModes].Format, Format); 
            
            sprintf(cVideoModes, "NumModus %d: %d x %d x %d Hz with %s", 
                iVideoModes, 
                pVideoModes[iVideoModes].Width, 
                pVideoModes[iVideoModes].Height, 
                pVideoModes[iVideoModes].RefreshRate, 
                Format); 

            //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

            iIndex = (INT)SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_ADDSTRING, 0, (LPARAM)cVideoModes); 
            SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_SETITEMDATA, iIndex, (LPARAM)(pVideoModes[iVideoModes])); 
                        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

        
        } 

        delete[] pVideoModes; 

    } 

    SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_SETCURSEL, 0, 0); 

}
[/cpp]

Anonymous

unregistriert

5

26.12.2004, 13:59

jo das hatte ichauch schon probiert!das kommt dann in der Zeile:

Quellcode

1
SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_SETITEMDATA, iIndex, (LPARAM)(pVideoModes[iVideoModes])); 


folgende CompilerFehler: "error C2440: 'Typumwandlung': 'D3DDISPLAYMODE' kann nicht in 'LPARAM' konvertiert werden
Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden"

Schau dir mal bitte den Code von David an den ich gepostet hatte.
Er schreibt das so:

Quellcode

1
2
// Speicher für diesen Videomodus reservieren 
            pVideoMode = (D3DDISPLAYMODE*)(tbMemAlloc(sizeof(D3DDISPLAYMODE))); 
.

Er übergibt dann ja auch die Instanz. Sein Code und mein Code unterscheiden sich nicht bis auf die Zeile!Kannst du mir erklären wie man das ohne die Funktion machen kann?


[/code]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

26.12.2004, 14:09

-.- man sollte natrülcih einen zeiger übergeben:
SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_SETITEMDATA, iIndex, (LPARAM)(&pVideoModes[iVideoModes]));

Und dein Code unterscheidet sich sehr wohl da du mit einem array arbeitest, dave aber mit einem Zeiger auf eine Instanz.

pVideoMode->Height

Anonymous

unregistriert

7

26.12.2004, 19:34

gut, das hab ich gemacht. Jedoch ohne Erfolg. Die ComboBox bleibt leer. Die Funktionen zum
Auslesen in der GetBackBufferFormats Funktion stimmen aber doch?!:

Quellcode

1
2
iVideoModes = (INT)SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_GETCURSEL, 0, 0);
pVideoModes = (D3DDISPLAYMODE*)SendDlgItemMessage(m_hDlg, DLGHANDLES.ComboVideoModes, CB_GETITEMDATA, iVideoModes, 0);
[/code]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

27.12.2004, 00:21

debug mal den Code kurz vor dem einlesen durch.

Anonymous

unregistriert

9

27.12.2004, 10:55

hi,

das problem ist gelöst. hab noch ne memalloc function geschrieben. damit gehts:

Quellcode

1
2
3
4
5
6
7
8
VOID* CDXEnum::Test(INT iSize){

    VOID* pMemory;

    pMemory = ::operator new(iSize);

    return (BYTE*)(pMemory);
}


thx[/code]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

27.12.2004, 11:41

oha ich habe deinen Fehler thx mit dem es ist ganz einfach und du brauchst keinen zweiten, sonder musst nur das
delete[] pVideoModes;
löschen dennn sonst sind die eingespeicherten Zeiger ungültig....

Werbeanzeige