Avatar billede jakobdo Ekspert
10. september 2003 - 15:06 Der er 21 kommentarer og
1 løsning

Baggrundsbillede i applikation.

Hej,
jeg sidder og leger med SDK windows kode.
Altså helt uden nogen hjælp fra Visual dit og dat.
Men nu mangler jeg en måde at lægge baggrundsbillede i mit program! Jeg har bare en kedelig hvis baggrund, med en grå button...

Nogle som lige kan give mig et tip til at komme videre?

Problemet er jo at jeg ved IMAGE kan bruges i Borland Builder, men jeg vil lave det fra bunden...
Avatar billede bertelbrander Novice
10. september 2003 - 17:58 #1
Jeg har til en anden lavet dette:
http://home20.inet.tele.dk/midgaard/apprun2.zip

Her vises der et billede som baggrund på en dialog box. Det burde kunne kompilere med de fleste windows kompilere.
Hvad er det for en applikation du har?
Avatar billede jakobdo Ekspert
10. september 2003 - 21:57 #2
Jeg skal bare lege lidt med Windows programmering fra bunden! Så jeg startede helt fra createwindowex, showwindow, wm_command osv... Nu har jeg lavet et icon til min exe fil, så nu skulle jeg også lige bruge lidt baggrund billede på programmet! Men intet interessant! PT har det en button, som siger: JEG ER TRYKKET! (altså i tekst) og en funktion som også svarer i tekst når selve programmet trykkes, så rimelig basic, men stadig væk lidt nyt for mig!
Avatar billede jpk Nybegynder
11. september 2003 - 09:58 #3
Jeg er lidt i tvivl om dit problem er:
1) Hvordan du skal tegne et billede?
2) Hvor du skal indsætte koden til at tegne baggrunden?

Hvis 2, er svaret meget simpelt. Når du modtager den message der er defineret som WM_ERASEBKGND, skal du tegne baggrunden i et vindue. wParam er da et handle til det DC du skal bruge.
Avatar billede jakobdo Ekspert
11. september 2003 - 11:31 #4
Ok, måske jeg ikke har udtrykket mig klart nok!

Jeg har lavet en vindue:

Ren firkant...

Der vil jeg gerne have et billede... F.eks. på position 10,10...
Billede skal bare være naturlig størrelse!

Altså hvordan indsætter jeg et billede med ren C++ kode, uden Visual dit og dat...

Har lavet en resource fil, hvor jeg har loadet filen ind: mainBack BITMAP windows.bmp

men et eller andet sted skal jeg jo så bruge mainBack, så billedet vises i mit program...
Avatar billede jpk Nybegynder
11. september 2003 - 12:54 #5
Lav disse variabler:

static HBITMAP hBmp;    // handle of bitmap to display
static HDC hdcCompat;    // DC for copying bitmap

Tilføj koden til at loade bitmappen i WM_CREATE
case WM_CREATE:
      // Load the bitmap resource.
      hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
        // Create a device context (DC) to hold the bitmap.
      // The bitmap is copied from this DC to the window's DC
      // whenever it must be drawn.
      hdc = GetDC(hWnd);
      hdcCompat = CreateCompatibleDC(hdc);
      SelectObject(hdcCompat, hBmp);
    ReleaseDC(hWnd, hdc);
break;

Når du får en VM_PAINT message tegner du så bitmappen
case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    BitBlt(ps.hdc, 10, 10, 138, 138, hdcCompat, 1, 1, SRCCOPY);
    EndPaint(hWnd, &ps);
break;


Og endelig, ved WM_DESTROY, sørger du for at nedlægge objekterne
case WM_DESTROY:
      DeleteDC(hdcCompat);
      DeleteObject(hbmp);
      PostQuitMessage(0);
break;
Avatar billede jakobdo Ekspert
11. september 2003 - 14:11 #6
Er dette helt forkert?

Source: www.damgaard-olsen.dk/src/windows.cpp

Mit færdige produkt har ikke noget billede! :o(
Avatar billede jpk Nybegynder
11. september 2003 - 14:26 #7
Har du prøvet debug'e for at se om variablerne initialiseres som de skal?
Du bør også tilføje noget error handling som fx tjek for NULL efter LoadBitmap
Avatar billede jpk Nybegynder
11. september 2003 - 14:27 #8
Ligeledes efter CreateCompatibleDC
Avatar billede jpk Nybegynder
11. september 2003 - 14:34 #9
Hvordan har du defineret mainBack i din resource fil?
Avatar billede jakobdo Ekspert
11. september 2003 - 14:45 #10
Min resource fil er således ud:

mainIcon ICON     windows.ico
mainBack BITMAP windows.bmp

Skal der være #include<windows.h> i .rc filen?
Avatar billede jpk Nybegynder
11. september 2003 - 14:52 #11
Og windows.bmp ligger i det dir der er current dir for applikationen?
Har du tjekket værdien af hBmp efter LoadBitmap?
Avatar billede jakobdo Ekspert
11. september 2003 - 15:14 #12
Denne del af koden fejler:

hBmp = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(mainBack));
      if(hBmp == NULL)
          MessageBox(hwnd, "LoadBitmap.", "Error", MB_OK | MB_ICONERROR);

Der ændrede jeg også hInst -> GetModuleHandle(NULL)...

Måske det er fejlen...
Avatar billede jpk Nybegynder
11. september 2003 - 15:27 #13
Det virker fint hos mig med GetModuleHandle(NULL), men måske fejler MAKEINTRESOURCE-kaldet...

Du kan fx prøve at debugge og se om understående variabel bliver ændret i kaldet.

LPTSTR str = NULL;
str = MAKEINTRESOURCE(IDB_BITMAP1);
Avatar billede jakobdo Ekspert
11. september 2003 - 15:32 #14
Damn...
Problemet er jeg compilere med BCC55...
Kan jeg debugge med det? :o/
Avatar billede jakobdo Ekspert
11. september 2003 - 15:34 #15
Jeg har lige prøvet følgende:

LPTSTR str = NULL;
str = MAKEINTRESOURCE(mainBack);
if(str == NULL)
  MessageBox(hwnd, "MAKEINTRESOURCE", "Error", MB_OK | MB_ICONERROR);

Det kørte videre...
Måske jeg ikke kan teste på den måde...
Avatar billede jpk Nybegynder
11. september 2003 - 15:34 #16
Det kan du sikkert godt, men jeg har det ikke installeret, så jeg kan ikke sige dig hvordan...
Du kan selvfølgelig prøve at skrive værdien ud i en messagebox...
Avatar billede jakobdo Ekspert
11. september 2003 - 15:59 #17
Når jeg bruger LastError, får jeg følgende fejl i forbindelse med LoadBitmap:

The Specified resource name cannot be found in the image file.

Mit .rc fil ser sålede ud:

mainIcon ICON     windows.ico
mainBack BITMAP windows.bmp

I starten af min cpp fil, har jeg:

#define mainBack  102

Mangler jeg mere??
Avatar billede jakobdo Ekspert
11. september 2003 - 16:08 #18
JUHUUUU....
Fejlen skyldtes at jeg ikke havde lavet
Denne: #define mainBack  102 i en .h fil, men havde lagt den i toppen af CPP-filen...

:o)
Avatar billede jpk Nybegynder
11. september 2003 - 16:12 #19
Dit udviklingsmiljø skal vide hvor filen ligger.
I VC++ vil man typisk have værdien af Resource File Name sat til $(IntDir)/$(InputName).res i sit projekt. VC++ gør selv dette som default, hvordan det gøres i BCB ved jeg ikke.
Avatar billede jpk Nybegynder
11. september 2003 - 16:12 #20
okay, langt om længe...
Avatar billede jakobdo Ekspert
11. september 2003 - 16:18 #21
Takker for hjælpen!
Jeg spørg lidt meget, men når jeg starter på noget kode, så har jeg ikke tid til at læse SDK igennem, så skal der bare kodes! :o)

Måske jeg kan bruge din viden en anden dag!
Avatar billede jpk Nybegynder
12. september 2003 - 09:06 #22
Glad for at kunne hjælpe...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester