|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 18.11.2020, 22:34 Titel: Bitmaps drucken durch WinApi? |
|
|
Wie kann ich neben Texten auch Bitmap-Dateien drucken? Gibt es da eine Möglichkeit, einen speziellen Befehl dafür? Ich habe zum Beispiel auf dem Computer eine Bilddatei die ich auf dem Bildschirm an einer bestimmten Position mit ausdrucken will. Habe schon mal im Internet ein wenig gesucht, aber nichts gefunden...
Edit:
Jetzt habe ich doch etwas gefunden, das allerdings in C++ programmiert ist. Muss mich da mal ein wenig einarbeiten. Vielleicht kriege ich das hin? _________________ SHELL SHUTDOWN -s -t 05
Zuletzt bearbeitet von ALWIM am 20.11.2020, 00:33, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 20.11.2020, 00:46 Titel: |
|
|
Sebastian hat Folgendes geschrieben: | Hi ALWIM,
naja, WinAPI ist WinAPI, egal, ob du's von einem C-, FreeBASIC- oder VB6-Programm aus aufrufst. Die gleichen Funktionen kannst du auch in FreeBASIC nutzen, nur die Syntax der Aufrufe ist etwas anders.
Viele Grüße!
Sebastian | Doch nicht so einfach wie ich dachte! Vor allem, wenn man von C++ keine Ahnung hat. Ich stehe etwas auf dem Schlauch, muss ich zugeben. Das was ich gefunden habe, ist wahrscheinlich doch nicht so ganz das richtige. Nichts mit WinApi?
Code: | BitBlt(
hdcMem, // handle to destination DC
0, // x-coord of destination upper-left corner
0, // y-coord of destination upper-left corner
188, // width of destination rectangle
145, // height of destination rectangle
hdcMem, // handle to source DC
0, // x-coordinate of source upper-left corner
0, // y-coordinate of source upper-left corner
SRCCOPY // raster operation code
); |
Eventuell kann ich die Grafik per Hand zeichnen? Das wäre zumindest mein Lösungsansatz im Moment. Ich lade eine Datei mit Zahlen. Jede Zahl steht für eine Farbe und dann gehe ich jede Zahl einzeln durch. Schritt für Schritt.
In etwa so:
Code: |
88888888777777771111111133333333
88888888777777771111111133333333
88888888777777771111111133333333
88888888777777771111111133333333
88888888777777771111111133333333
88888888777777771111111133333333
88888888777777771111111133333333
88888888777777771111111133333333 |
_________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 20.11.2020, 01:03 Titel: |
|
|
Die WinAPI - Funktion BitBlt ist da ein ganz heisser Kandidat.
Gruß
grindstone
EDIT:
Ich sehe, du hast sie schon entdeckt, und eigentlich müsste sie funktionieren. Eventuell muß vorher noch irgendein Objekt initialisiert werden. Code: | case WM_CREATE:
hBitmap = (HBITMAP)LoadImage(hInst, L"c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
break;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc;
BITMAP bitmap;
HDC hdcMem;
HGDIOBJ oldBitmap;
hdc = BeginPaint(hWnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
oldBitmap = SelectObject(hdcMem, hBitmap);
GetObject(hBitmap, sizeof(bitmap), &bitmap);
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, oldBitmap);
DeleteDC(hdcMem);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0; |
_________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 21.11.2020, 05:28 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Die WinAPI - Funktion BitBlt ist da ein ganz heisser Kandidat.
Gruß
grindstone
EDIT:
Ich sehe, du hast sie schon entdeckt, und eigentlich müsste sie funktionieren. Eventuell muß vorher noch irgendein Objekt initialisiert werden. Code: | case WM_CREATE:
hBitmap = (HBITMAP)LoadImage(hInst, L"c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
break;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc;
BITMAP bitmap;
HDC hdcMem;
HGDIOBJ oldBitmap;
hdc = BeginPaint(hWnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
oldBitmap = SelectObject(hdcMem, hBitmap);
GetObject(hBitmap, sizeof(bitmap), &bitmap);
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, oldBitmap);
DeleteDC(hdcMem);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0; |
|
Wie wäre es damit:
Code: | DO
IF FILEEXISTS("Logo.txt") THEN
OPEN "Logo.txt" FOR INPUT AS #f ' laden
DO UNTIL EOF(f)
LINE INPUT #f, text ' Zeile einlesen
IF LogoLogo(e) = 0 THEN LogoLogo(e) = 1: t = e: e = 1: EXIT DO
e += 1
LOOP
CLOSE #f
END IF
FOR k = 1 TO 32
IF MID(text, k, 1) = "8" THEN SetDCPenColor(Printer.hdc, &h808080)
IF MID(text, k, 1) = "7" THEN SetDCPenColor(Printer.hdc, &hb3b3b3)
IF MID(text, k, 1) = "2" THEN SetDCPenColor(Printer.hdc, &h008000)
IF k = 1 THEN MoveToEx(Printer.hdc, 300, (50+(t*5)), Null)
LineTo(Printer.hdc, (300+(k*5)), (50+(t*5)))
NEXT
IF t > 31 THEN EXIT DO
LOOP |
Vielleicht nicht so ganz die Ideale Lösung, aber sie funktioniert! Besser als gar nichts... _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 22.11.2020, 01:41 Titel: |
|
|
Erinnert mich irgendwie an die gute alte Zeit, als es noch keine grafikfähigen Drucker gab (zumindest keine bezahlbaren) und Bilder mit Buchstaben und Zahlen erzeugt wurden.
Kurze Frage: Wenn du zuerst eine Linie zum Drucker schickst und danach einen Text, der über dieser Linie steht, wird das korrekt ausgedruckt, oder steht der Text dann unter der Linie? Soll heissen: Kannst du dich beim Positionieren der Elemente auch nach oben bewegen und sorgt der Druckertreiber für eine korrekte Anordnung der Elemente?
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 22.11.2020, 02:06 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Erinnert mich irgendwie an die gute alte Zeit, als es noch keine grafikfähigen Drucker gab (zumindest keine bezahlbaren) und Bilder mit Buchstaben und Zahlen erzeugt wurden.
Kurze Frage: Wenn du zuerst eine Linie zum Drucker schickst und danach einen Text, der über dieser Linie steht, wird das korrekt ausgedruckt, oder steht der Text dann unter der Linie? Soll heissen: Kannst du dich beim Positionieren der Elemente auch nach oben bewegen und sorgt der Druckertreiber für eine korrekte Anordnung der Elemente?
Gruß
grindstone | Es wird alles korrekt ausgedruckt! Vielleicht habe ich von vorn herein die richtige Anordnung? Bei einem Testdruck, wurde alles so ausgedruckt, wie es sein soll.
Zitat: | Wenn du zuerst eine Linie zum Drucker schickst und danach einen Text, der über dieser Linie steht, wird das korrekt ausgedruckt, oder steht der Text dann unter der Linie? | Keine Ahnung? Müsste ich vielleicht mal testen. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|