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;
}
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.
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