Avatar billede nameless Nybegynder
04. januar 2004 - 03:11 Der er 11 kommentarer og
1 løsning

inkludering af filer / billede

Hvordan er det muligt at inkludere et billede eller en fil i c++ ?

Bruger Borland C++ compiler (prompt)

Skal bare have sådan den inkludere et .bmp billede og bruger det i baggrunden af en tom form.
Avatar billede jakobdo Ekspert
04. januar 2004 - 12:55 #1
Du kan evt bruge loadbitmap().
Du kan også i starten lave en ressource, og så compilere den med din kode til sidst...
Avatar billede bertelbrander Novice
04. januar 2004 - 14:34 #2
Avatar billede jakobdo Ekspert
04. januar 2004 - 14:56 #3
bertelbrander: Jeg tror du tænker på Borland Builder... Han bruger C++ (i dos)
Avatar billede bertelbrander Novice
04. januar 2004 - 20:39 #4
Ja, jeg blev forvirret af han han skrev form, form er vist noget man kun laver i Builderen.
Avatar billede bertelbrander Novice
04. januar 2004 - 22:57 #5
Jeg lavede lige et lille program der viser en .bmp i et vindue.
Det forsøger at vise et billede der hedder sample.bmp, det kan ændres i kaldet til LoadBMP(...).
Programmet burde kunne kompilere med alle windows kompilere, herunder kommandolinie versionen af BorlandC++.

#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <string.h>
#include <stdio.h>

HINSTANCE hInst;
HWND hwndMain;
HBITMAP Bitmap;
UINT ImageWidth, ImageHeight;

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);

HBITMAP LoadBMP(const char *FileName, UINT *Width, UINT *Height)
{
  BITMAPFILEHEADER BitmapFileHeader;
  BITMAPINFOHEADER BitmapInfoHeader;

  FILE *fp;
  if((fp = fopen(FileName, "rb")) == NULL)
  {
    char msg[1024];
    sprintf(msg, "Can't open:\r\n %s", FileName);
    MessageBox(hwndMain, msg, "Bitmap", MB_OK);
    return 0;
  }
  fread(&BitmapFileHeader, sizeof(BitmapFileHeader), 1, fp);
  fread(&BitmapInfoHeader, sizeof(BitmapInfoHeader), 1, fp);
  if(BitmapFileHeader.bfType != (('M' << 8) | 'B'))
    MessageBox(hwndMain, "Wrong Type", "Draw", MB_OK);

  *Width = BitmapInfoHeader.biWidth;
  *Height = BitmapInfoHeader.biHeight;
  fclose(fp);

  return (HBITMAP )LoadImage(0, FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
}

static BOOL InitApplication(void)
{
  WNDCLASS wc;

  memset(&wc,0,sizeof(WNDCLASS));
  wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ;
  wc.lpfnWndProc = (WNDPROC)MainWndProc;
  wc.hInstance = hInst;
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  wc.lpszClassName = "BitmapWndClass";
  wc.hCursor = LoadCursor(NULL,IDC_ARROW);
  wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
  if (!RegisterClass(&wc))
    return 0;

  Bitmap = LoadBMP("sample.bmp", &ImageWidth, &ImageHeight);

  return 1;
}

HWND CreateBitmapWndClassWnd(void)
{
  return CreateWindow("BitmapWndClass","Bitmap",
                      WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZEBOX|
                      WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME,
                      CW_USEDEFAULT,0,CW_USEDEFAULT,0,
                      NULL,
                      NULL,
                      hInst,
                      NULL);
}

void OnPaint(HWND hwnd)
{
  PAINTSTRUCT PaintStruct;
  HDC dc = BeginPaint(hwnd, &PaintStruct);
  HDC MemDC = CreateCompatibleDC(dc);
  HBITMAP OldBitmap = (HBITMAP )SelectObject(MemDC, Bitmap);
  BitBlt(dc, 0, 0, ImageWidth, ImageHeight, MemDC, 0, 0, SRCCOPY);
  SelectObject(MemDC, OldBitmap);
  DeleteObject(MemDC);
  EndPaint(hwnd, &PaintStruct);
}

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
  switch (msg)
  {
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    case WM_PAINT:
      OnPaint(hwnd);
      return TRUE;
    default:
      return DefWindowProc(hwnd,msg,wParam,lParam);
  }

  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
  MSG msg;

  hInst = hInstance;
  if (!InitApplication())
    return 0;

  if ((hwndMain = CreateBitmapWndClassWnd()) == (HWND)0)
    return 0;
  ShowWindow(hwndMain,SW_SHOW);

  while (GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}
Avatar billede nameless Nybegynder
19. januar 2004 - 13:59 #6
Hmm.. Sorry jeg først svare nu. Spørgsmålet gik egentligt ud på om det var muligt at inkludere et billede i selve "exe" filen istedet for at ligge det ved siden af :)

Mit mål er at opnå EN exefil og intet ved siden af, da det er små programmer jeg laver
Avatar billede jakobdo Ekspert
19. januar 2004 - 14:06 #7
Derfor skal du også lave det først som en ressource...
Den compilere så sammen med exe-filen, og du har en exe-fil med hele svineriet! :o)
Mener den hedder BRC32 de laver så en .res fil...
Avatar billede bertelbrander Novice
19. januar 2004 - 17:45 #8
Du kan lave erstatte LoadBMP() fra ovenstående med:

HBITMAP LoadBMP(int id, UINT *Width, UINT *Height)
{
  HBITMAP Ret = LoadImage(0, MAKEINTRESOURCE(id), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  SIZE Size;
  GetBitmapDimensionEx(Ret, &Size);
  *Width = Size.cx;
  *Height = Size.cy;
  return Ret;
}

Og give dit BMP en id f.ex:

#define IDI_BITMAP 1111

Og kalde LoadBMP med:

Bitmap = LoadBMP(IDI_BITMAP, &ImageWidth, &ImageHeight);

Så skal du lave en .rc fil med følgende indhold:

IDI_BITMAP BITMAP MOVEABLE PURE "sample.bmp"

Til slut kompile og linke.
Avatar billede bertelbrander Novice
19. januar 2004 - 18:19 #9
Der var jeg for hurtig. LoadBMP() skal se sådan ud:

HBITMAP LoadBMP(int id, UINT *Width, UINT *Height)
{
  HBITMAP Ret = LoadBitmap(hInst, MAKEINTRESOURCE(id));
  BITMAP BitMapInfo;
  GetObject(Ret, sizeof(BitMapInfo), &BitMapInfo);

  *Width = BitMapInfo.bmWidth;
  *Height = BitMapInfo.bmHeight;
  return Ret;
}

Og du skal huske at lave din "#define IDI_BITMAP 1111" et sted hvor den kan ses af din .rc fil, f.ex. i en header-fil.

Du kan bruge følgende kommandoer til at kompile og linke hvis din .c fil hedder bitm.c og .rc filen hedder bitm.rc:

bcc32 -c -tWM- -w -w-par -w-inl -W -a1 -Od /c bitm.c
brcc32 -X -R /r bitm
ilink32 -aa -V4.0 -c -x -Gn bitm.obj c0w32.obj, bitm.exe,, import32.lib cw32.lib,,bitm.res
Avatar billede nameless Nybegynder
28. januar 2004 - 14:19 #10
Hmm har fundet en anden løsning så har ikke haft kigget på det
bertelbrander smid et svar og få poins
Avatar billede bertelbrander Novice
28. januar 2004 - 19:44 #11
Jeg forsøger at undgå point.
Avatar billede nameless Nybegynder
29. januar 2004 - 11:14 #12
...
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