Forum: PC-Programmierung LoadImage findet BMP nicht


von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

Hey zusammen,

ich hatte mal ein Bsp. wie man eine *.bmp in der Konsole anzeigt.
Gefühlt vor ca. 10-15 Jahren hat es noch funktioniert,
jetzt sagt der Error-Code, dass die Datei nicht gefunden wird.

Wisst Ihr evtl. eine Lösung?
1
#include <windows.h>
2
#include <stdio.h>
3
#include <tchar.h>
4
#pragma comment(lib,"gdi32.lib")
5
6
int LoadBmp2Console(char *szBitmap, int PosX, int PosY)
7
{
8
  DWORD err;
9
10
  HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, LPCWSTR("D:\\a.bmp"),
11
    IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
12
  if (!hBitmap)
13
  {
14
    err = GetLastError();
15
    return 1;
16
  }
17
18
  BITMAP bmp;
19
  GetObject(hBitmap, sizeof(bmp), &bmp);
20
21
  HWND hwnd = FindWindow(L"ConsoleWindowClass", NULL);
22
  if (!hwnd) return 2;
23
24
  HDC hDC = GetDC(hwnd);
25
  if (!hDC) return 3;
26
27
  HDC hBitmapDC = CreateCompatibleDC(hDC);
28
  if (!hBitmapDC) return 4;
29
30
  SelectObject(hBitmapDC, hBitmap);
31
32
  BitBlt(hDC, PosX, PosY, bmp.bmHeight, bmp.bmWidth, hBitmapDC, 0, 0, SRCCOPY);
33
34
  DeleteObject(hBitmap);
35
  ReleaseDC(hwnd, hBitmapDC);
36
  ReleaseDC(hwnd, hDC);
37
38
  return 0;
39
}
40
41
int main()
42
{
43
  char buf[32] = "D:\\a.bmp";
44
  int Status = LoadBmp2Console(buf, 10, 10);
45
  if (Status != 0)printf("Fehler: %i", Status);
46
47
  getchar();
48
  return 0;
49
}

Edit:
Kompiliert ohne Fehler mit VisualStudio 2017.

Original war es von "www.cpp-programming.de.vu" (siehe Anhang)

: Bearbeitet durch User
von Mario M. (thelonging)


Lesenswert?

Was sagt denn GetLastError?

von Programmierer (Gast)


Lesenswert?

Adam P. schrieb:
> , LPCWSTR("D:\\a.bmp")

Versuche mal L"D:\\a.bmp". Was du da machst ist ein Cast, das klappt 
nicht. Ggf. auch LoadImageW statt LoadImage.

von Programmierer (Gast)


Lesenswert?

Mit doppelten Backslash natürlich... warum entfernt das Forum die??

von Adam P. (adamap)


Lesenswert?

Programmierer schrieb:
> Versuche mal L"D:\\a.bmp". Was du da machst ist ein Cast, das klappt
> nicht. Ggf. auch LoadImageW statt LoadImage.

Auch schon versucht.

Mario M. schrieb:
> Was sagt denn GetLastError?

2 = File not found

Programmierer schrieb:
> Mit doppelten Backslash natürlich... warum entfernt das Forum die??

Sind doch 2.

von Programmierer (Gast)


Lesenswert?

Adam P. schrieb:
> Sind doch 2.

Ah, nur die Mobilversion zeigt die nicht an, macht natürlich Sinn. 
Desktop-Version am Mobilgerät ist auch korrekt. Im Code-Tag ists auch 
richtig...

Adam P. schrieb:
> Auch schon versucht.

Genau so?
1
LoadImageW(NULL, L"D:\\a.bmp",
2
    IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

Den char *szBitmap Parameter müsstest du auch nach LPCWSTR ändern, und 
buf auf wchar_t, wenn du das für den Dateinamen verwendest...

von Adam P. (adamap)


Lesenswert?

Programmierer schrieb:
> Den char *szBitmap Parameter müsstest du auch nach LPCWSTR ändern, und
> buf auf wchar_t, wenn du das für den Dateinamen verwendest...

Vielen Dank,
das wchar_t wars.

von Programmierer (Gast)


Lesenswert?

Adam P. schrieb:
> Vielen Dank,
> das wchar_t wars.

Das "buf" wurde im originalen Code aber gar nicht verwendet :|

Kannst du mal einen Screenshot vom Ergebnis zeigen? Ich bin gespannt wie 
sowas aussieht...

von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

Programmierer schrieb:
> Das "buf" wurde im originalen Code aber gar nicht verwendet :|

Ja das stimmt.

Zu beachten ist natürlich, dass jeder Output im Bereich der BMP, die BMP 
zerstört.

Weiterhin ist mir aufgefallen, dass man den darzustellenden Bereich mal 
2 rechnen muss...kp warum. Sonst zeichnet er nur das halbe Bild.
1
BitBlt(hDC, PosX, PosY, bmp.bmHeight*2, bmp.bmWidth*2, hBitmapDC, 0, 0, SRCCOPY);

von Programmierer (Gast)


Lesenswert?

Hmm, verrückt. Bilder hab ich sonst immer per GUI-Anwendung dargestellt 
;-)

von Adam P. (adamap)


Lesenswert?

Programmierer schrieb:
> Hmm, verrückt. Bilder hab ich sonst immer per GUI-Anwendung dargestellt
> ;-)

Ja ich suche einen einfachen Weg, um eine BMP darzustellen.
Jedoch werde ich mir wohl aus meinem Konsolen-Prog. ein richtiges 
Fenster erzeugen und sie dort zeichnen.

Ziel:
Da ich nicht immer meine Hardware (µC, Display, usw.) mitschleppen 
möchte (Arbeit / Wohnung), will ich mir eine kleine Umgebung schreiben, 
in der ich das Display simuliere.
So kann ich von überall Menüsteuerungen oder Zeichenroutinen 
weiterentwicklen, da sich so nur der Treiber unterscheidet.

von Programmierer (Gast)


Lesenswert?

Adam P. schrieb:
> Jedoch werde ich mir wohl aus meinem Konsolen-Prog. ein richtiges
> Fenster erzeugen und sie dort zeichnen.

Ist sicherlich flexibler... Der Code zum Zeichnen ist beim Win32-API 
dann sogar identisch, nur halt mit vorgegebenem HWND. Allerdings ist die 
Programmierung mit Win32-API schon ziemlich mühsam.

Adam P. schrieb:
> will ich mir eine kleine Umgebung schreiben,
> in der ich das Display simuliere.

Sowas hab ich mal mit einer Gtk+-Anwendung gemacht.

von Adam P. (adamap)


Lesenswert?

Programmierer schrieb:
> Der Code zum Zeichnen ist beim Win32-API
> dann sogar identisch, nur halt mit vorgegebenem HWND. Allerdings ist die
> Programmierung mit Win32-API schon ziemlich mühsam.

Ja deshalb sollte der Aufwand überschaubar sein.

Programmierer schrieb:
> Sowas hab ich mal mit einer Gtk+-Anwendung gemacht.

Ich wollte mich jetzt nicht unbedingt noch in eine LIB einarbeiten.

von Programmierer (Gast)


Lesenswert?

Adam P. schrieb:
> Ich wollte mich jetzt nicht unbedingt noch in eine LIB einarbeiten.

Kommt darauf an wie viel Erfahrung du mit GUI-Programmierung mit dem 
WinAPI hast. Wenn da keine ist, lohnt es sich kaum sich da 
einzuarbeiten, denn es ist umständlich und natürlich nicht portabel. Da 
kannst du dich besser in so etwas wie Gtk+ bzw. GTKmm, wxWidgets o.ä. 
einarbeiten, das ist einfach und geht fix.

von Adam P. (adamap)


Lesenswert?

Ja das sollte schon passen.

Hab früher ein wenig mit MFC gearbeitet, wxWidgets auch mal ausprobiert, 
sonst VCL genutzt - aber das RADStudio ist halt wie es ist.

von Adam P. (adamap)


Lesenswert?

Adam P. schrieb:
> Ja das sollte schon passen.

Also OK, ich tu mir das mit der WIN API und GDI doch nicht an :)

Ich habe jetzt wieder die "liballeg"[1] ans laufen bekommen und werde 
die nutzen. Wozu das Rad neu erfinden.

[1] https://liballeg.org/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.