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

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

1

01.06.2006, 08:37

hwnd als Datenmember in Direct3D-Klasse ergibt 'unused'

da mir eingehenst erklärt wurde, dass in c++ globale variablen absolut nix zu suchen haben, bin ich gerade dabei, für meine 2d-cutscene-engine eine D3DKlasse zu basteln, die mir mein Render-Device fertig initialisiert und die variablen kapselt.
soweit funktioniert auch alles, allerding gibts ein problem mit dem windows handle hwnd.

zur zeit hab ichs mal wie folgt implementiert - auf diese weise gehts, aber hierbei ist eben hwnd kein datenmember sondern einfach als referenz übernommen.


main.cpp

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 WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow )
{
    // :::::::::::::::::::::::::::::::::::::

    //  Ausgabe-Fenster erzeugen

    // :::::::::::::::::::::::::::::::::::::

    // 

    WNDCLASSEX  wc;
    HWND        hWnd;
    CreateOutputWindow( wc, hWnd, hInstance );
    

    // :::::::::::::::::::::::::::::::::::::

    //  DX initialisierungen ...

    // :::::::::::::::::::::::::::::::::::::

    //

    cDX_Interface* DX_DEVICE = cDX_Interface::Create();

    BOOL initOk = DX_DEVICE->InitDirectX(hWnd);

    // ... etc ..

}


meine cDX_Interface-Klasse:

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
class cDX_Interface
{
    protected:

        static  cDX_Interface* pDX_Interface;

                LPDIRECT3D9         m_D3DObject; 
                LPDIRECT3DDEVICE9   m_D3DDevice;                

        cDX_Interface();
        ~cDX_Interface(){}

    public:

        static  cDX_Interface*  Create();
                HRESULT         Destroy();

                BOOL            InitDirectX(HWND &hWnd);
                HRESULT         CleanUpDirectX();

};

cDX_Interface* cDX_Interface::pDX_Interface = NULL;

cDX_Interface::cDX_Interface(): m_D3DObject(NULL),
                                m_D3DDevice(NULL)

{
    //

}

cDX_Interface* cDX_Interface::Create()
{
    if (pDX_Interface==NULL)
    {
        pDX_Interface = new cDX_Interface;
        return pDX_Interface;
    }
    return pDX_Interface;
}

HRESULT cDX_Interface::Destroy()
{
    // Speicherbereich mit 0 auffüllen

    // Pointer löschen

    // Point-to Adresse löschen

    if (pDX_Interface)
    {
        SecureZeroMemory(&pDX_Interface,sizeof(pDX_Interface));
        delete pDX_Interface;
        pDX_Interface = NULL;
        return S_OK;
    }
    // Keine Objektinstanz zum löschen vorhanden

    // RETURN: Invalid_Pointer

    return E_POINTER;
}

BOOL cDX_Interface::InitDirectX(HWND &hWnd)
{
    // D3D Objekt erzeugen

    m_D3DObject = Direct3DCreate9(D3D_SDK_VERSION);
    if (m_D3DObject == NULL)
    {
        return E_FAIL;
    }

    // Darstellungsparameter

    D3DPRESENT_PARAMETERS presParams;
    SecureZeroMemory(&presParams,sizeof(presParams));
    presParams.Windowed         = TRUE;
    presParams.SwapEffect       = D3DSWAPEFFECT_DISCARD;
    presParams.BackBufferFormat = D3DFMT_UNKNOWN;
    presParams.BackBufferCount  = 1;

    // D3D Device erzeugen

    HRESULT hr = m_D3DObject->CreateDevice(
                        D3DADAPTER_DEFAULT,
                        D3DDEVTYPE_HAL,
                        hWnd,
                        D3DCREATE_HARDWARE_VERTEXPROCESSING,
                        &presParams,
                        &m_D3DDevice
                        );


    // wenn Grafikkarte HARDWARE_VERTEXPROCESSING nicht unterstützt ->

    // SOFTWARE_VERTEXPROCESSING verwenden

    if (FAILED(hr))
    {

        hr = m_D3DObject->CreateDevice(
            D3DADAPTER_DEFAULT,
            D3DDEVTYPE_HAL,
            hWnd,
            D3DCREATE_SOFTWARE_VERTEXPROCESSING,
            &presParams,
            &m_D3DDevice
            );


    if(FAILED(hr))
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }   
}


wenn ich das ganze aber zb. so anlege:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class cDX_Interface
{
protected:
 HWND m_hwnd;

//...

};


BOOL cDX_Interface::InitDirectX(HWND &hWnd)
{
  m_hwnd = hWnd;
//...

};


schlägt meine m_D3DObject->CreateDevice(...) fehl.
beim debuggen sehe ich, dass mein m_hwnd 'unused' ist.

kann/darf man das win-handle nicht kopieren? muss ja möglich sein oder?

hab mir die winnt.h angesehen und dort find ich folgendes:

C-/C++-Quelltext

1
2
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name


demnach ist ja HWND 'nur' ein struct mit einem int und müsste ja problemlos über den default-kopierkonstruktor laufen oder?

ratlos ich bin ... :-)

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

01.06.2006, 08:57

Versuchs mal mit nem Pointer:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class cDX_Interface
{
protected:
 HWND* m_hwnd;

//...

};


BOOL cDX_Interface::InitDirectX(HWND* hWnd)
{
  m_hwnd = hWnd;
//...

}; 

mit

C-/C++-Quelltext

1
BOOL initOk = DX_DEVICE->InitDirectX(&hWnd);

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

3

01.06.2006, 09:12

ahhhhh cooool super *freuuu* danke!!!

und bei CreateDevice muss ich meinen Pointer dereferenzieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    // D3D Device erzeugen

    HRESULT hr = m_D3DObject->CreateDevice(
                        D3DADAPTER_DEFAULT,
                        D3DDEVTYPE_HAL,
                        (*m_hWnd),//hWnd,

                        D3DCREATE_HARDWARE_VERTEXPROCESSING,
                        &presParams,
                        &m_D3DDevice
                        );


bah wär ich selber nie drauf gekommen ... nochmals danke!

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

4

01.06.2006, 09:14

- obwohl - neugierig bin ich schon ... warum geht das eigentlich nur über die pointer-lösung?

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

5

01.06.2006, 09:45

vermutlich zeigt irgendein Objekt auf das Original, deswegen ist die Kopie nutzlos

Anonymous

unregistriert

6

01.06.2006, 19:00

Die Initialisierung gefällt mir nicht. Was passiert wenn es einen Fehler gibt bei der Initialisierung? Oder wenn die GraKa oder sogar der Treiber kein Hardwarevertexprocessing unterstützt?

Ich sag nur: Bumm.

http://www.germangamedev.de/index.php?site=article&id=4

ext

Treue Seele

  • Private Nachricht senden

7

01.06.2006, 19:25

Du kannst das HWND auch einfach per value übergeben. Ein Handle ist sowas wie nen Zeiger, das kopiert man in aller Regel, da es klein ist.
Aber teste mal spaßeshalber bei deiner Referenzvariante ob ein SetWindowText( hWnd, TEXT( "Na also geht doch" ) ); funktioniert.

Anonymous

unregistriert

8

01.06.2006, 19:29

ext
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/iswindow.asp

ext

Treue Seele

  • Private Nachricht senden

9

01.06.2006, 19:56

Cool, thx.

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

10

02.06.2006, 09:40

guten morgen allerseits ("i seh no nix aus de augn...")

@nix da:
ich hab mir deinen artikel natürlich schon mal durchgesehen!
hab mich aber nicht daran orientiert. *duck*

1)
meine INIT hat ausserdem noch andere massive probleme:
momentan kann das zeugs noch nicht in einen fullscreen mode schalten.
hab gestern am abend noch ein paar seiten über backpuffer und surfaces gelesen.
aber: wenn HW-Vert.Prozessing nicht unterstützt wird, wird ja auf SW umgeschalten und wenn das auch nicht geht geb ich false zurück und in main ist die message box mit der info über den fehler und eine postmessage die das programm beendet.(den teil hab ich nicht mitgepostet).
ich möchte/muss das ganze so oder so noch soweit ausbauen, dass aus einer .ini datei diverse settings geladen werden.
danach möcht ich die GrKa-Caps mit den .ini werten vergleichen und wenn da was nicht passt läuft die APP so oder so nicht an.

2)
kann ich inzwischen ein Sprite-Objekt initialisieren und eine Textur darauf anwenden.
was allerdings seltsam ist: für testzwecken hab ich ein png mit animationsframes von amiga-lemmings. jedes einzelframe ist 48px breit, jedoch wird mein RECT-Ausschnitt nicht richtig dargestellt.
hab aber noch nichts gefunden, warum das so ist.
ich vermute mal, dass die textur-bmp in einer gewissen proportion sein muss.
weiters hatte ich noch den eindruck beim herumtesten, dass das RECT auch nur richtig arbeitet, wenn man werte die durch 8 teilbar sind verwendet.

3)
wegen HWND:
wie zum teufel grabt's ihr immer diese sachen aus dem msdn hervor?
i find da nix :-(
aber ich such halt bei mir offline - ist online mehr inhalt?
ich bin mir mal nicht sicher, was ich mit der IsWindow(hWnd) anfangen soll ... *grübel* ich weiss ja zu dem zeitpunkt, dass ich ein window habe.
ah, oder ist damit gemeint, dass ich mir mit dem beim debuggen helfen könnt?

4)
TEST:
MessageBox(0,TEXT("als text"), ERR_MSG_BOX_CAPTION, MB_ICONSTOP|MB_OK);
funktioniert
SetWindowText( hWnd, TEXT( "Na also geht doch" ) );
funktioniert auch(text steht in fenstertitel)

offtopic nachtrag:
@Spik)evil( - dein foto erinnert mich total an den film jarhead :-)

Werbeanzeige