+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

Problem beim Zeichnen von Benutzerobjekten


(Guest) #1

Hallo,

habe ein großes Problem beim Ausgeben von Benutzerobjekten.
Ich habe die Aufgabe die Ausgabe einer Strömungstechnik-Simluation in Form einer Grafik auszugeben. Für die Erstellung der Grafik wird, nach der Berechnung, die Bibliothek eines Drittanbieters verwendet (LL2-Charting kann dazu leider viel zu wenig). Nun bietet mir aber die Bibliothek nur die Möglichkeit in Pixel/Screen-Koordinaten zu zeichnen und über StretchDIBits() auf den Printer-Kontext auszugeben. Ich habe also auf den DeviceContext der Charting-Bibliothek keinen Zugriff, kann somit keinen Mapping Mode oder ähnliches einstellen.
Womit ich große Probleme habe, ist der Umstand, einen Skalierungsfaktor für sämtliche Abmessungen, Strichstärken, Fonts usw. anzugeben, damit ich in der LL12-Callback-Funktion die Chart proportional ausgeben kann (Der Anwender kann in der Vorlagendatei die Grafik natürlich völlig unabhängig von der Darstellung am Monitor skalieren).
Zunächst dachte ich schon, dass ich eine Lösung hätte, aber dann habe ich den LL12-Mapping Modus mal von MM_LOMETRIC auf MM_HIENGLISH verstellt, bzw. auch unterschiedliche Drucker mit verschiedenen Auflösungen (300 bis 2400 dpi) eingestellt, und dann hat jeder Ausgabe anders ausgesehen.
Leider bin ich zu wenig mit direkter Grafikprogrammierung vertraut um eine “offensichtliche” Lösung für das Problem zu finden (LPtoDP, DPtoLP, etc.)
Kann mir da jemand - vielleicht sogar mit einem kleinen Code-Fragment in C/C++ - weiterhelfen?

Danke im Voraus


(Guest) #2

Hm, ich verstehe nicht ganz…

Wie rufst Du das Chart-Modul auf, um eine Ausgabe zu bekommen? Welche
Parameter kannst/mußt Du ihm übergeben? Ist der Mapping-Mode wichtig?

Wenn Du eine Bitmap erzeugst, in die das Modul malen kann, und die Du
dann Blttest (warum auch immer die Indirektion nötig ist), kannst Du
doch die Größe der nötigen optimalen Bitmap über
LPtoDP(scLlObject._hRefDC,scLlObject._rcPaint) bestimmen.

Probiert habe ich das aber noch nicht in dem Punkt, aber es sieht
logisch aus :wink:

Ansonsten pi * Schnauze:

RECT rcPaint = s._rcPaint;

LPtoDP(s._hRefDC,(POINT*)&rcPaint,2);
OffsetRect(&rcPaint,-rcPaint.left,-rcPaint.top); // zero-adjusted
HDC hDC = CreateCompatibleDC(NULL); // abhängig vom
Grafikkartentreiber, evtl. s._hRefDC nehmen
HBITMAP hBmp =
CreateCompatibleBitmap(hDC,rcPaint.right,rcPaint.bottom);
HBITMAP hBmpOld = SelectObject(hDC,hBmp);
ZeichneGrafikIn(hDC,hBmp);
StretchBlt(s._hRefDC,s._rcPaint.left,…,hDC,0,0,rcPaint.right,rcPaint.bottom,SRCCOPY);
SelectObject(hDC,hBmpOld);
DeleteDC(hDC);

Paulchen

“G Marak” <mgampi@ib…> wrote in message
news:30078114200822225@combit.net

Hallo,

habe ein großes Problem beim Ausgeben von Benutzerobjekten.
Ich habe die Aufgabe die Ausgabe einer Strömungstechnik-Simluation
in Form einer Grafik auszugeben. Für die Erstellung der Grafik wird,
nach der Berechnung, die Bibliothek eines Drittanbieters verwendet
(LL2-Charting kann dazu leider viel zu wenig). Nun bietet mir aber
die Bibliothek nur die Möglichkeit in Pixel/Screen-Koordinaten zu
zeichnen und über StretchDIBits() auf den Printer-Kontext
auszugeben. Ich habe also auf den DeviceContext der
Charting-Bibliothek keinen Zugriff, kann somit keinen Mapping Mode
oder ähnliches einstellen.
Womit ich große Probleme habe, ist der Umstand, einen
Skalierungsfaktor für sämtliche Abmessungen, Strichstärken, Fonts
usw. anzugeben, damit ich in der LL12-Callback-Funktion die Chart
proportional ausgeben kann (Der Anwender kann in der Vorlagendatei
die Grafik natürlich völlig unabhängig von der Darstellung am
Monitor skalieren).
Zunächst dachte ich schon, dass ich eine Lösung hätte, aber dann
habe ich den LL12-Mapping Modus mal von MM_LOMETRIC auf MM_HIENGLISH
verstellt, bzw. auch unterschiedliche Drucker mit verschiedenen
Auflösungen (300 bis 2400 dpi) eingestellt, und dann hat jeder
Ausgabe anders ausgesehen.
Leider bin ich zu wenig mit direkter Grafikprogrammierung vertraut
um eine “offensichtliche” Lösung für das Problem zu finden (LPtoDP,
DPtoLP, etc.)
Kann mir da jemand - vielleicht sogar mit einem kleinen
Code-Fragment in C/C++ - weiterhelfen?

Danke im Voraus


(Guest) #3

Hallo Paul;

das Problem ist, dass ich kein HDC an die Charting-Library übergeben kann und auch sonst keine Möglichkeit habe, den internen Chart Device-Kontext zu manipulieren. Die Bibliothek kapselt sämtliche Zeichenfunktionen zur Gänze. Ich kann nur folgendes machen (sehr beispielhaft):

Chart myChart=new Chart(xSize, ySize);
myChart->addTitle(“Irgendwas”, “ArialBd.ttf”, 8); // 8pt Arial fett
myChart->addChartLayer(data, sizeof(data)/sizeof(data[0])

CBitmap* theBitmap=myChart->makeChart(Chart::BMP);

Erst an dieser Stelle kann ich mit StretchDIBits(bitmap) die Bitmap in das LL-Rechteck blitten.

Das Problem ist, dass ich zwar ein Rechteck angeben kann (siehe new()), aber die Skalierung der Strichstärken und vor allem Schriften ist nicht gegeben.

Ist es jetzt etwas klarer formuliert? Ich hoffe, es gibt darauf eine (richtige) Antwort.

Danke im Voraus

Hm, ich verstehe nicht ganz…

Wie rufst Du das Chart-Modul auf, um eine Ausgabe zu bekommen? Welche
Parameter kannst/mußt Du ihm übergeben? Ist der Mapping-Mode wichtig?

Wenn Du eine Bitmap erzeugst, in die das Modul malen kann, und die Du
dann Blttest (warum auch immer die Indirektion nötig ist), kannst Du
doch die Größe der nötigen optimalen Bitmap über
LPtoDP(scLlObject._hRefDC,scLlObject._rcPaint) bestimmen.

Probiert habe ich das aber noch nicht in dem Punkt, aber es sieht
logisch aus :wink:

Ansonsten pi * Schnauze:

RECT rcPaint = s._rcPaint;

LPtoDP(s._hRefDC,(POINT*)&rcPaint,2);
OffsetRect(&rcPaint,-rcPaint.left,-rcPaint.top); // zero-adjusted
HDC hDC = CreateCompatibleDC(NULL); // abhängig vom
Grafikkartentreiber, evtl. s._hRefDC nehmen
HBITMAP hBmp =
CreateCompatibleBitmap(hDC,rcPaint.right,rcPaint.bottom);
HBITMAP hBmpOld = SelectObject(hDC,hBmp);
ZeichneGrafikIn(hDC,hBmp);
StretchBlt(s._hRefDC,s._rcPaint.left,…,hDC,0,0,rcPaint.right,rcPaint.bottom,SRCCOPY);
SelectObject(hDC,hBmpOld);
DeleteDC(hDC);

Paulchen

“G Marak” <mgampi@ib…> wrote in message
news:30078114200822225@combit.net

Hallo,

habe ein großes Problem beim Ausgeben von Benutzerobjekten.
Ich habe die Aufgabe die Ausgabe einer Strömungstechnik-Simluation
in Form einer Grafik auszugeben. Für die Erstellung der Grafik wird,
nach der Berechnung, die Bibliothek eines Drittanbieters verwendet
(LL2-Charting kann dazu leider viel zu wenig). Nun bietet mir aber
die Bibliothek nur die Möglichkeit in Pixel/Screen-Koordinaten zu
zeichnen und über StretchDIBits() auf den Printer-Kontext
auszugeben. Ich habe also auf den DeviceContext der
Charting-Bibliothek keinen Zugriff, kann somit keinen Mapping Mode
oder ähnliches einstellen.
Womit ich große Probleme habe, ist der Umstand, einen
Skalierungsfaktor für sämtliche Abmessungen, Strichstärken, Fonts
usw. anzugeben, damit ich in der LL12-Callback-Funktion die Chart
proportional ausgeben kann (Der Anwender kann in der Vorlagendatei
die Grafik natürlich völlig unabhängig von der Darstellung am
Monitor skalieren).
Zunächst dachte ich schon, dass ich eine Lösung hätte, aber dann
habe ich den LL12-Mapping Modus mal von MM_LOMETRIC auf MM_HIENGLISH
verstellt, bzw. auch unterschiedliche Drucker mit verschiedenen
Auflösungen (300 bis 2400 dpi) eingestellt, und dann hat jeder
Ausgabe anders ausgesehen.
Leider bin ich zu wenig mit direkter Grafikprogrammierung vertraut
um eine “offensichtliche” Lösung für das Problem zu finden (LPtoDP,
DPtoLP, etc.)
Kann mir da jemand - vielleicht sogar mit einem kleinen
Code-Fragment in C/C++ - weiterhelfen?

Danke im Voraus