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,