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

Korowai

unregistriert

1

08.07.2016, 07:06

WINAPI OpenGL DialogBox Handling

Moin,

wenn ich einen modalen Dialog erstelle, an welcher Stelle setze ich das Handling für OpenGL, um im Hauptfenster (bzw. in einer Editbox) mit OpenGL Bitmaps abzusetzen und zu zeichnen?

[code]
BOOL CALLBACK RaumkarteProc(HWND hDlg30, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
HDC hdcRaumkarteMem;
HDC hdcZeichnung;
RECT rect;
static HWND hwndOpenGL;
static HGLRC hrc;
RECT ScreenRect;
RECT ClientRect;

static PIXELFORMATDESCRIPTOR pfd;
pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion=1;
pfd.dwFlags=PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
pfd.iPixelType=PFD_TYPE_RGBA;
pfd.cColorBits=16;
pfd.cRedBits=0;
pfd.cRedShift=0;
pfd.cGreenBits=0;
pfd.cGreenShift=0;
pfd.cBlueBits=0;
pfd.cBlueShift=0;
pfd.cAlphaBits=0;
pfd.cAlphaShift=0;
pfd.cAccumBits=0;
pfd.cAccumRedBits=0;
pfd.cAccumGreenBits=0;
pfd.cAccumBlueBits=0;
pfd.cAccumAlphaBits=0;
pfd.cDepthBits=16;
pfd.cStencilBits=0;
pfd.cAuxBuffers=0;
pfd.iLayerType=PFD_MAIN_PLANE;
pfd.bReserved=0;
pfd.dwLayerMask=0;
pfd.dwVisibleMask=0;
pfd.dwDamageMask=0;

hdcZeichnung=GetDC(hDlg30);
int PixelFormat;
PixelFormat=ChoosePixelFormat(hdcZeichnung, &pfd);

if (!PixelFormat)
{
MessageBox(0,"Kann das PixelFormat nicht finden", "Error", MB_OK|MB_ICONERROR);
return FALSE;
}
if (!SetPixelFormat(hdcZeichnung,&pfd))
{
MessageBox(0,"Kann das PixelFormat nicht setzen","Error",MB_OK|MB_ICONERROR);
return FALSE;
}
if (!hrc)
{
MessageBox(0,"Kann das GLRC nicht erschaffen","Error",MB_OK|MB_ICONERROR);
return FALSE;
}
if (!wglMakeCurrent(hdcZeichnung,hrc))
{
MessageBox(0,"Kann das GLRC nicht aktivieren","Error",MB_OK|MB_ICONERROR);
return FALSE;
}
static HBITMAP hRaumkarte;
static BITMAP Raumkarte;
static HWND hwndRaumkarteAktion1, hwndRaumkarteAktion2,
hwndRaumkarteHScroll, hwndRaumkarteVScroll;

static int rightWidth=1100;
static int lowerHeight=650;
static int leftWidth=300;
static int upperHeight=50;

static int iAktions1index;
static int Aktion1auslesen;
static char Aktion1auswahl[100];

switch (message)
{
case WM_INITDIALOG:
{

hRaumkarte= (HBITMAP)LoadImage(NULL,"C:\\Daten\\...\\Raumkarte.bmp",IMAGE_BITMAP,800,600,
LR_LOADFROMFILE);

if (hRaumkarte==NULL)
{
MessageBox(hDlg30,"Raumkarte konnte nicht geladen werden","Error",0);
return TRUE;
}

GetObject(hRaumkarte, sizeof (Raumkarte), &Raumkarte);

if (CreateGLContexts(hDlg30,hdcZeichnung,hrc))
{
GetClientRect(hDlg30,&ClientRect);
InitGL(ClientRect.right,ClientRect.bottom);
}
else
EndDialog(hDlg30,0);

return FALSE;
};

case WM_PAINT:
{
hdc=BeginPaint(hDlg30,&ps);
hdcRaumkarteMem=CreateCompatibleDC(hdc);
SelectObject(hdcRaumkarteMem, hRaumkarte);
BitBlt(hdc,300,50,Raumkarte.bmWidth,Raumkarte.bmHeight,
hdcRaumkarteMem,0,0,SRCCOPY);

DeleteObject(hRaumkarte);
ReleaseDC(hDlg30, hdcRaumkarteMem);
ReleaseDC(hDlg30,hdc);

DeleteDC(hdcRaumkarteMem);
DrawGLScene();
glFinish();
SwapBuffers(hdcZeichnung);
EndPaint(hDlg30,&ps);
}
break;



case WM_COMMAND:

switch (LOWORD (wParam))
{
case VK_ESCAPE:
{
ChangeDisplaySettings(NULL,0);
wglMakeCurrent(hdcZeichnung,NULL);
wglDeleteContext(hrc);
ReleaseGLContexts(hDlg30,hdcZeichnung,hrc);
ReleaseDC(hDlg30,hdcZeichnung);

EndDialog(hDlg30,0);

return TRUE;
}

case ID_RAUMKARTEAKTIONSLISTE34:
{


return FALSE;
}



}


return FALSE;
}





}
break;


}


return FALSE;



}

[/code]

Ich habe den code Block aus dem Dialog rausgeschnitten, ist nicht lauffähig. Ist mein bisheriger Arbeitsstand, der hoffentlich veranschaulicht, wo ich hin will...

Vorstellung von mir war:
1. Initialisierung des OpenGL Bereichs im Hauptfenster des Dialogs in WM_INITDIALOG.
2. Zeichnen in WM_PAINT über einen UpdateWindow Befehl, der in der Case WM_COMMAND Verzweigung ausgelöst wird. Die jeweiligen Zeichnungsschritte wollte ich ebenfalls über bool Variablen steuern.

Jetzt weiß ich allerdings nicht, wie ich das Message Handling steuere. Denn wenn OpenGL rendert, weiß ich nicht, wie der Message Verlauf zu steuern ist und umgekehrt.

Sollte ich stattdessen das Rendern über die win main laufen lassen, und die DialogBox über SendMessage ansteuern?

Bin augenblicklich etwas ratlos, und auch verwirrt ,da ich mit OpenGL nur einige wenige Schritte gemacht habe.

Am meisten helfen würde mir ein code Block, der funktioniert, an dem ich ablesen kann, welche OpenGL Programmteile an welcher STelle am besten sitzen und wie ich das Message Handling trotzdem durchführen kann.

Soll ich ein eigenständiges Fenster rendern und meinen Dialog mit den beiden Listboxen daneben setzen und beides über die win main steuern? Das wollte ich an sich nicht, sondern alles in einen Dialog packen...

Danke,

ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

2

09.07.2016, 10:17

Ich habe gerade selbst erst meine erste OPENGL Demo mit VS2010 Express zum laufen gebracht. Dabei bin ich über folgenden Link gestolpert. Vielleicht hilft Dir das ja weiter. ;)
http://www.mbsoftworks.sk/index.php?page=demos
Ergänzung: Ich fand die Tutorials recht gut. :)
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

09.07.2016, 11:28

Bitte die Code-Tags richtig nutzen!

ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

4

09.07.2016, 11:40

Meintest Du mich damit? Ich bin mir keiner Schuld bewusst?
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ByteJunkie« (09.07.2016, 12:48)


5

09.07.2016, 12:05

Ja genau du, du Schlingel :rolleyes:
@Korowai: Einen OpenGL-Kontext erstellst du zB nachdem du das Fenster erstellt hast oder in wm_create/initdialog, eigentlich überall im selben Thread. Zeichnen kannst du auch überall, nicht nur in wm_paint, die wird ja auch nur beim updaten des Fensterinhalts aufgerufen. Du kannst dir zB nen Timer aufsetzen und in wm_timer rendern.
In ein Fenster mit Steuerelementen rendern geht übrigens nicht gut, du solltest ein eigenes Fenster benutzen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

09.07.2016, 12:52

Meintest Du mich damit? Ich bin mir keiner Schuld bewusst?

Nein, du hast ja auch gar keinen Code gepostet.

ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

7

09.07.2016, 12:59

:huh: Also dann hier nochmal in korrekter Form ein Link auf die Tutorials. :this:
Interessante OpenGL Tutorialreihe
Ergänzung: @David habs mir schon gedacht. War mir aber nicht ganz sicher ob es mit der URL zu tun hatte.
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ByteJunkie« (09.07.2016, 13:04)


Korowai

unregistriert

8

09.07.2016, 18:56

Danke für die Antworten und Tipps.

Den link habe ich mir angeschaut.

Ich glaube, ich werde das zunächst zu Übungszwecken erstmal in ein Hauptfenster coden. ich finde auch die Nehe Tutorials ganz gut, habe die auch schon etwas ausprobiert.

Dann werde ich in meinem Spiel versuchen, das OpenGL Rendering in einem Editfenster zu erschaffen. Da ich im gleichen Dialog noch zwei Listboxes habe, die jeweils je nach Befehlsaufruf ein anderes Rendering auslösen, werde ich über bool Variablen das jeweilige rendern auslösen.

Melde mich dazu später nochmal.

Vielen Dank, das hilft mir sehr.

Werbeanzeige