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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

21

24.06.2011, 07:01

Ich glaub er weiß selber eigentlich nicht mit was er da arbeitet und was er da genau lernen will. Und falls er zumindest das letztere so ganz grob weiß, weiß er noch immer nicht, was das erstere ist. Er glaubt vermutlich, dass er den Umgang der DirectX-Windows-API mit C++ lernt. Dass das aber nicht der Fall ist (denn er lernt Managed DirectX mit C++/CLI) und dass etwas total anderes ist, auch wenn es ähnlich heißt, das ist ihm offensichtlich gar nicht bewusst.
Überhaupt ist ihm noch ziemlich wenig bewusst, das kann man aus seinen Aussagen schon ziemlich deutlich ablesen.
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]

dx11

unregistriert

22

24.06.2011, 12:18

Also bewusstd ist mir das schon allerdings drück ich mich immer etwas doof aus!
DirextX GUI verwendet kein net das ist einfach Windows API in DirectX also GUI.

Aber was ich jetzt immer noch nicht kann, ist das ich meinem 2. Thread klarmache, dass ich schon ein Form objekt habe!
Ich weis nicht wie ich es an den Thread übergeben kann.

Und das Projekt ist nich Managed DirectX C++/CLI Sondern...
Es hat angefangen mit einem leeren Projekt, dann hab ich code reingeschrieben für stink normales directx OHNE irgendeine Form.
Als ich dann weit genug war hab ich eine Form hinzugefügt und die gesammte Projektmappe Konvertiert.
Also es ist Direct X mit Windows API, aber auch Forms Anwendungen für Lade Bildschirm Menü und so weiter...
Und als beweis das es Kein Managed DirectX ist:

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
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
    // Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif

    // DXUT will create and use the best device (either D3D9 or D3D11) 
    // that is available on the system depending on which D3D callbacks are set below

    // Set general DXUT callbacks
    DXUTSetCallbackFrameMove(OnFrameMove);
    DXUTSetCallbackKeyboard(OnKeyboard);
    DXUTSetCallbackMouse(OnMouse);
    DXUTSetCallbackMsgProc(MsgProc);
    DXUTSetCallbackDeviceChanging(ModifyDeviceSettings);
    DXUTSetCallbackDeviceRemoved(OnDeviceRemoved);

    // Set the D3D11 DXUT callbacks. Remove these sets if the app doesn't need to support D3D11
    DXUTSetCallbackD3D11DeviceAcceptable(IsD3D11DeviceAcceptable);
    DXUTSetCallbackD3D11DeviceCreated(OnD3D11CreateDevice);
    DXUTSetCallbackD3D11SwapChainResized(OnD3D11ResizedSwapChain);
    DXUTSetCallbackD3D11FrameRender(OnD3D11FrameRender);
    DXUTSetCallbackD3D11SwapChainReleasing(OnD3D11ReleasingSwapChain);
    DXUTSetCallbackD3D11DeviceDestroyed(OnD3D11DestroyDevice);

    // Perform any application-level initialization here
    PlaySound(L"Media\\Musik\\Ambient_Normal.wav",0,SND_ASYNC | SND_LOOP); //Hintergrundmusik
    //Öffne Lade Form
    Kap03_01::lo1^ frmlo = gcnew Kap03_01::lo1();
    frmlo->Show();
    Application::Run(frmlo);
    DXUTInit( true, true, NULL ); // Parse the command line, show msgboxes on error, no extra command line params
    DXUTSetCursorSettings( true, true ); // Show the cursor and clip it when in full screen
    DXUTCreateWindow( L"Test" ); //Setze fenster name
    DXUTCreateDevice( D3D_FEATURE_LEVEL_10_0, true, 1366, 768 );
    frmlo->Close();
    DXUTMainLoop(); // Starte haupt Schleife RenderLopp() etc

    // Perform any application-level cleanup here

    return DXUTGetExitCode();
}

Der einstiegspunkt des Programms in WIN API!
Nur die Forms sind .NET der rest ist Directx WIN API mit C++
Wenn ihr den Quellcode haben wollt, also nur das grundgerüst nicht alles, fragt mich.
Und ich habe angefangen aus EmptyProject11 aus dem DirectX SDK JUN2010
(war schreibfaul :D )

dx11

unregistriert

23

24.06.2011, 12:43

Ich hab noch ma rumprobiert:

C-/C++-Quelltext

1
2
 Kap03_01::lo1^ frmlo = gcnew Kap03_01::lo1();
 CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)abc,(LPVOID)frmlo,0,0);

abc:

C-/C++-Quelltext

1
2
3
4
5
void abc(Kap03_01::lo1^ frmlo2)
{
  Kap03_01::lo1^ frmlo3 = frmlo2;
  frmlo3->ShowDialog();
}

aber der kompiler meckert das er Kap03_01::lo1 nicht in LPVOID umwandeln kann aber ohne LPVOID nimmt der thread es ja nicht an oder?
Bitte Hilfe!

24

24.06.2011, 12:51

Das hat dir Dot schon gesagt, du muss ein Thread von .Net Framework erstellen: System.Thread . Du kannst nicht so einfach ein .Net Objekt in ein void Zeiger casten.

dx11

unregistriert

25

24.06.2011, 13:01

Danke das weis ich auch das er es mir gesagt hat aber ich vertsehe die msdn Seite leider nett so gut als ob ich sie verwenden könnte

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

26

24.06.2011, 13:09

DirextX GUI verwendet kein net das ist einfach Windows API in DirectX also GUI.

Der Satz macht absolut keinen Sinn. DirectX ist wenn dann von mir aus Teil der WinAPI, mit GUI hat DirectX aber erstmal nichts zu tun. Und auch nur einer kleiner Teil der WinAPI. Aber egal.

Das kann so nicht funktionieren, lol1 ist ein GC Handle und kein Pointer. Willkommen in der Welt von C++/CLI. Abgesehen davon sollst du deine Form nicht einfach an den Thread übergeben sondern im Thread erzeugen. Die Form muss afaik in dem Thread erzeugt werden in dem die Message Pump laufen soll.

Um ehrlich zu sein bin ich überzeugt davon dass ich dir mehr schaden als nutzen würde wenn ich dir helf das zum Laufen zu bringen. Tu dir selbst einen Gefallen und mach ein stinknormales C++ Projekt und verwend einfach nur DirectX und WinAPI. Und lass um Gottes Willen die Finger von C++/CLI. An diesem Mischmasch wirst du nur verzweifeln. Glaub mir das, ich hatte schon meinen Spaß damit...

dx11

unregistriert

27

24.06.2011, 13:14

Ich will ja nur das das funzt sonst nichts.
Aber wenn ich die Form im Thread erzeuge dann kann ich sie in wWinMain nicht mehr schließen wie mach ich das?
Bitte Bitte Bitte :(

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

24.06.2011, 13:46

Gut, hier bitte dein Beispiel:

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
#include "Form1.h"

using namespace System::Threading;


template <typename Form>
ref class SplashScreen
{
private:
  Thread^ thread;
  EventWaitHandle^ form_created;
  Form^ form;

  delegate void CloseDelegate();

  CloseDelegate^ close;

  void Close()
  {
    form->Close();
  }

  void Run()
  {
    form = gcnew Form();
    form->Show();
    form_created->Set();
    Application::Run(form);
  }

public:

  SplashScreen()
    : thread(gcnew Thread(gcnew ThreadStart(this , &SplashScreen::Run))),
      form_created(gcnew EventWaitHandle(false, EventResetMode::ManualReset)),
      close(gcnew CloseDelegate(this, &SplashScreen::Close))
  {
  }

  void Quit()
  {
    form_created->WaitOne();
    form->Invoke(close);
  }

  void Show()
  {
    thread->Start();
  }
};


[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
  SplashScreen<Form1>^ splashscreen = gcnew SplashScreen<Form1>();
  splashscreen->Show();

  // ...

  splashscreen->Quit();

  return 0;
}

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (24.06.2011, 14:11)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

29

24.06.2011, 14:06

Dot, ich glaube mit dieser Main-Methode wird er...
... und schon hat Dot es editiert.
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

30

24.06.2011, 14:11

Ja, meine Beiträge sind vor dem 7ten Edit nie zu genießen ;)

Jetzt kann er das SplashScreen template einfach verwenden ohne wissen zu müssen was genau es tut. Ich denk das is im Moment die beste Lösung...

Werbeanzeige