M
Hallo.
In mein Programm ist eine dialogfeldbasierende Anwendung. Ich habe eine Klasse CDialog welche mein
Anwendungsfenster erstellt. Ihr habe ich ein Element CDialog als Steuerelement zugeordnet, welches durch einen
seperaten Thread verwaltet wird.
//Init des Anwendungsfensters
m_cSteuerelementDlg.Init(this);
m_cSteuerelementDlg.Create(IDD_STEUERELEMENT, this);
m_cSteuerelementDlg.SetWindowPos(GetWindow(IDD_ANWENDUNGSFENSTER_DIALOG), 0,0,1,1,SWP_NOSIZE);
m_cSteuerelementDlg.ShowWindow(SW_SHOW);
//Nun wird ein Thread gestartet, der die OpenGL Initialisierungen und Zeichenrotinen, ... übernimmt
BOOL CSteuerelementDlg::CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat;
WNDCLASS wc;
DWORD dwExStyle;
DWORD dwStyle;
RECT WindowRect;
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;
m_hInstance = GetModuleHandle(NULL);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = m_hInstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "OpenGL";
if (!RegisterClass(&wc))
{
MessageBox("Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle=WS_OVERLAPPEDWINDOW;
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
//Ich übernehme das HANDLE der Klasse CSteuerelementDlg
//Würde ich ein eigenenes Fenster aufbauen, wie ich es bei anderen Programmen mache, so habe ich keinerlei Probleme
//in Bezug der Zeichenungenauigkeiten
m_hWnd = GetParent()->Detach();
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
bits,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
bits,
//Wenn ich hier 32 einsetze, erscheint das letztgezeichnete Objekt
//nicht mehr im Vordergrund, Zeichenungenauigkeiten bleiben bestehen
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
if (!(m_hDC=GetDC()->Detach()))
{
KillGLWindow();
MessageBox("Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if (!(PixelFormat=ChoosePixelFormat(m_hDC,&pfd)))
{
KillGLWindow(); // Reset The Display
MessageBox("Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if(!SetPixelFormat(m_hDC,PixelFormat,&pfd))
{
KillGLWindow(); // Reset The Display
MessageBox("Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if (!(m_hRC=wglCreateContext(m_hDC)))
{
KillGLWindow(); // Reset The Display
MessageBox("Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if(!wglMakeCurrent(m_hDC,m_hRC))
{
KillGLWindow(); // Reset The Display
MessageBox("Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
ShowWindow(SW_SHOW);
SetForegroundWindow();
SetFocus();
ReSizeGLScene(45.0, width, height);
if (!InitGL())
{
KillGLWindow();
MessageBox("Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
return TRUE;
}
Ich habe mittlerweile eine andere Möglichkeit, mein Programm zu realisieren, gefunden, doch wäre ich auch an einer
Lösung des jetzigen Problems interessiert.