VC++6 PlgBlt

Hallo,

Ich versuche mit VC++6 ein ActiveX Control um 90° gedreht zu drucken (siehe Code-Fragment unten) und versuche das mit PlgBlt zu erreichen (zu groß um mit SetPixel/GetPixel zu arbeiten), das funktioniert auch am Bildschirm und auch wenn ich mit einem speziellen Druckertreiber in ein PDF drucke, wenn ich es allerdings auf einem Drucker ausgebe wird eine Achse total verzerrt, die andere jedoch richtig skaliert. Was auch komisch ist, wenn ich das ganze nach links statt nach rechts drehe sind zusätzlich vertikale schwarze Streifen auf dem Ausdruck, die da nicht sein sollten. Drehung um 180° funktioniert übrigens wunderbar.

In der Doku habe ich was gefunden, das mir allerdings nicht ganz klar wird:

„Scaling, translation, and reflection transformations are allowed in the source device context; however, rotation and shear transformations are not. (…) If the source transformation has a rotation or shear, an error is returned.“

Die Funktion gibt bei mir TRUE zurück, also wohl kein Fehler.

Ich habe übrigens bereits gegoogelt und bei CodeProject usw. gesucht, aber nichts gefunden. Nachdem ich jetzt bereits so ungefähr das halbe Jahresbudget an Druckerpapier unserer Abteilung verschwendet habe bräuchte ich dringend mal Hilfe. Also falls sich jemand damit auskennt.

Also, hier mal mein Code (Ich weiß, die Variablennamen sind scheiße, ist ja aber nur zum Testen):

 CPrintDialog printDlg(FALSE);
 if (printDlg.DoModal() == IDOK)
 {
 CDC dc;
 dc.Attach(printDlg.GetPrinterDC());

 CPrintInfo Info;
 Info.m\_rectDraw.SetRect(0, 0, dc.GetDeviceCaps(VERTRES), dc.GetDeviceCaps(HORZRES));

 DOCINFO di;
 ::ZeroMemory (&di, sizeof (DOCINFO));
 di.cbSize = sizeof (DOCINFO);
 di.lpszDocName = "TEST";

 CDC memdc;
 memdc.CreateCompatibleDC(&dc);
 CBitmap membm;
 membm.CreateCompatibleBitmap(&dc, dc.GetDeviceCaps(VERTRES), dc.GetDeviceCaps(HORZRES));
 memdc.SelectObject(&membm);

 Draw((long)&memdc, (long)&Info.m\_rectDraw);

 POINT\* p = new POINT[3];
 p[0].x = dc.GetDeviceCaps(HORZRES);
 p[0].y = 0;
 p[1].x = dc.GetDeviceCaps(HORZRES);
 p[1].y = dc.GetDeviceCaps(VERTRES);
 p[2].x = 0;
 p[2].y = 0;

 CBitmap b;
 dc.StartDoc(&di);
 dc.PlgBlt(p, &memdc, 0, 0, dc.GetDeviceCaps(VERTRES), dc.GetDeviceCaps(HORZRES), b, 0, 0);
 dc.EndDoc();

 delete p;
 }

Grüße Tobias

Ergänzung
hab jetzt mal was anderes probiert, leider exakt derselbe Effekt:

 CPrintDialog printDlg(FALSE);
 if(printDlg.DoModal() == IDOK)
 {
 CDC dc;
 dc.Attach(printDlg.GetPrinterDC());

 CPrintInfo Info;
 Info.m\_rectDraw.SetRect(0, 0, dc.GetDeviceCaps(VERTRES), dc.GetDeviceCaps(HORZRES));

 DOCINFO di;
 ::ZeroMemory (&di, sizeof (DOCINFO));
 di.cbSize = sizeof (DOCINFO);
 di.lpszDocName = "TEST";

 XFORM x;
 x.eM11 = 0.0;
 x.eM12 = 1.0;
 x.eM21 = -1.0;
 x.eM22 = 0.0;
 x.eDx = dc.GetDeviceCaps(HORZRES);
 x.eDy = 0.0;//-dc.GetDeviceCaps(VERTRES);

 int mode = SetGraphicsMode(dc.m\_hDC, GM\_ADVANCED);
 BOOL wt = SetWorldTransform(dc.m\_hDC, &x);
 DWORD err = GetLastError();

 dc.StartDoc(&di);
 Draw((long)&dc, (long)&Info.m\_rectDraw);
 dc.EndDoc();
 }