R
Hallo,
ich habe eine DLL geschrieben, in der ich eine Klassenhierarchie von OpenGL Renderingkontexten für technische Zwecke (technische Zeichnung, 3D Kontexte zur Simulation von CNC Programmen usw.) untergebracht habe. Den Inhalt (die Darstellung) dieser Kontexte soll man auch zu Papier bringen, also drucken koennen. Das funktioniert auch. Leider werden dabei aber die Farben
"invertiert(?)". Das heißt, aus ROT wird BLAU und aus BLAU wird ROT. GRÜN bleibt GRÜN. Ich habe nicht die Reihenfolge bei der Definition vertauscht. Es werden die gleichen Funktionen für das Zeichnen auf dem Bildschirm und das Drucken aufgerufen. Die "Vertauschung" der Farben erfolgt sowohl bei Objekten, die ich über Darstellungslisten anzeige als bei direkt gezeichneten Objekten. Hier nun der Code der Funktion zum Drucken. Der Parameter "HDC hDc" ist der Handle für den DeviceContext des Druckers und der Parameter "HFONT hFont" der Handle des Druckerfonts.
/////////////////////////////////////////////////////////////////////////////
// Drucken
void GLBaseContext::Print(HDC hDc, HFONT hFont, int left, int top, int right,
int bottom, int dist, double scale, const char* headline){
TEXTMETRIC tm;
int nPixelFormat,
charHeight, charWidth,
cx, cy, pleft, ptop, pbottom, width, height;
double scl;
PIXELFORMATDESCRIPTOR pfd;
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = 0;
pfd.dwFlags |= PFD_SUPPORT_GDI;
pfd.dwFlags |= PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = ColorBits; // Farbtiefe
pfd.cRedBits = RedBits;
pfd.cRedShift = RedShift;
pfd.cGreenBits = GreenBits;
pfd.cGreenShift = GreenShift;
pfd.cBlueBits = BlueBits;
pfd.cBlueShift = BlueShift;
pfd.cAlphaBits = AlphaBits; // Alpha Buffer
pfd.cAlphaShift = AlphaShift;
pfd.cAccumBits = AccumBits; // Accumulation Buffer
pfd.cAccumRedBits = AccumRedBits;
pfd.cAccumGreenBits = AccumGreenBits;
pfd.cAccumBlueBits = AccumBlueBits;
pfd.cAccumAlphaBits = AccumAlphaBits;
pfd.cDepthBits = DepthBits; // Z-Buffer
pfd.cStencilBits = StencilBits; // Stencil Buffer
pfd.cAuxBuffers = AuxBuffers; // Auxiliary Buffer
pfd.iLayerType = PFD_MAIN_PLANE;
pfd.bReserved = 0; // reserviert
pfd.dwLayerMask = LayerMask;
pfd.dwVisibleMask = VisibleMask;
pfd.dwDamageMask = DamageMask;
// Ausdehnungen der Seite holen...
cx = ::GetDeviceCaps(hDc, HORZRES);
cy = ::GetDeviceCaps(hDc, VERTRES);
::GetTextMetrics(hDc, &tm);
charHeight = tm.tmHeight;
charWidth = tm.tmAveCharWidth;
// automatische Auswahl des Pixelformates, das am besten passt
nPixelFormat = ::ChoosePixelFormat(hDc, &pfd);
if(nPixelFormat == 0){ // Fehler...
::DeleteDC(hDc);
::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ::GetLastError(), 0, SystemMessage,
255, NULL);
SetMsg("ChoosePixelFormat: ",SystemMessage);
OGLMessage("OpenGL-Intialisierung fuer Druckerkontext!", MR_ERROR);
return; // zurueck...
}
// Pixelformat fuer den Device Context setzen und auf Fehler pruefen...
if(!::SetPixelFormat(hDc, nPixelFormat, &pfd)){
::DeleteDC(hDc);
::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ::GetLastError(), 0, SystemMessage,
255, NULL);
SetMsg("SetPixelFormat: ",SystemMessage);
OGLMessage("OpenGL-Intialisierung fuer Druckerkontext!", MR_ERROR);
return; // zurueck...
}
HGLRC hPRC = wglCreateContext(hDc); // Renderingkontext erzeugen...
wglMakeCurrent(hDc, hPRC); // und verbinden...
Printing = true; // es wird gedruckt...
if((PrintFont2D = Create2DFont(hDc, hFont, 32, 96)) == NULL){ // DruckFont erzeugen
wglMakeCurrent(NULL, NULL);
wglDeleteContext(hPRC);
Printing = false; // es wird nicht mehr gedruckt
::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ::GetLastError(), 0, SystemMessage,
255, NULL);
SetMsg("Create2DFont: ",SystemMessage);
OGLMessage("OpenGL-Intialisierung fuer Druckerkontext!", MR_ERROR);
return; // zurueck...
}
glClearColor(1.0f, 1.0f, 1.0f, 0.0f); // weiss als Hintergrundfarbe...
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Farb- und Tiefenpuffer loeschen
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
pleft = left * charWidth; // linke Position berechnen...
pbottom = bottom * charHeight; // untere Position berechnen...
width = cx - pleft - right * charWidth; // Breite berechnen...
height = cy - pbottom - (top + 2) * charHeight; // Hoehe berechnen...
ptop = pbottom + height;
if(headline){ // Titelzeile drucken...
ptop -= charHeight; // obere Position berechnen...
glViewport(pleft, ptop, width, charHeight); // Viewport setzen...
glColor3f(0.0f, 0.0f, 0.0f); // Druckfarbe setzen...
glRasterPos2f(-1.0f, -0.5f); // Ausgabeposition bestimmen...
Draw2DText(headline); // Ueberschrift ausgeben...
height -= (dist + 1) * charHeight; // Hoehe um Ueberschrift und Leerzeilen verringern
}
scl = (double(Width) / double(Height)) / (double(width) / double(height));
if(scl > 1.0){ // Hoehe skalieren?...
height = int(double(width) * double(Height) / double(Width)); // neue Hoehe berechnen...
if(headline){ // mit Titelzeile drucken...
pbottom = ptop - height; // untere Position verschieben...
height -= dist * charHeight; // Hoehe um Leerzeilen verringern
}
}
PrintGL(pleft, pbottom, width, height, scale); // Drucken der eigentlichen Objekte...
glFinish(); // Grafikausgabe abschliessen...
Printing = false; // es wird nicht mehr gedruckt...
wglMakeCurrent(NULL,NULL); // Verbindung mit Druckerkontext aufheben...
wglDeleteContext(hPRC); // Renderingkontext loeschen...
if(PrintFont2D) delete PrintFont2D; // DruckFont vorhanden? => loeschen
PrintFont2D = NULL; // kein Druckfont mehr vorhanden
}
Warum werden die Farben invertiert dargestellt?
Vielen Dank schon mal im Voraus.
Gruß RastowMax