Annonceindlæg fra Conscia
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