|
From: Krzysztof K. <sa...@op...> - 2003-06-20 12:34:14
|
Hello Vlada,
Friday, June 20, 2003, 2:23:39 PM, you wrote:
VD> ----- Original Message -----
VD> From: "Krzysztof 'Saveman' Kapuscik" <sa...@ze...>
VD> To: <dev...@li...>
VD> Sent: Friday, June 20, 2003 1:48 PM
VD> Subject: Re: [Dev-C++] display bitmap
>> Hello Vlada,
>>
>> Friday, June 20, 2003, 12:27:55 PM, you wrote:
>>
>> VD> Hi.
>> VD> In this piece of code, I try to load bitmap image from a file and
VD> display it
>> VD> in a window. When I run the program, nothing happens. After the call
VD> to
>> VD> LoadImage(), I call the error() function, which calls GetLastError()
VD> and
>> VD> displays a message box with error description. In this way, I receive
VD> a
>> VD> message "Not enough storage is available to process this command".
VD> Now, I'm
>> VD> not sure if there something wrong with the code, or I realy run out of
>> VD> memory (which I doubt). My computer is Pentium 2 with 128 MB RAM and
VD> 20GB
>> VD> hard drive. This code is actually the only code in this program,
VD> except for
>> VD> standard Windows code, so I don't think there should be any memory
VD> leak. Can
>> VD> you tell me if the code is OK?
>> VD> P.S. I should also say that there's no message "Could not load image",
VD> so I
>> VD> guess the bitmap handle is valid?
>> VD> How can that be if LoadImage() could not be completed?
>> VD> -------------------------------------
>> VD> ------------
>> VD> Vlada
>>
>> I don't know what's wrong with you code, because it works on my machine :)
>>
>> But I changed it a bit - look there:
>> (i putted it into WindowProcedure)
>>
>> HBITMAP hBitmap;
>> LPTSTR szFileName = TEXT("bitmapa.bmp");
>> BITMAP bmp;
>> HBITMAP hOldBMP;
>> PAINTSTRUCT ps;
>> HDC hDC;
>> HDC memDC;
>>
>> switch (message) /* handle the messages */
>> {
>> case WM_PAINT:
>> hBitmap =(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName,
>> IMAGE_BITMAP, 0, 0,
VD> LR_LOADFROMFILE|LR_CREATEDIBSECTION);
>> if(hBitmap)
>> {
>> GetObject(hBitmap, sizeof(BITMAP), &bmp);
>> hDC = BeginPaint(hwnd, &ps);
>> memDC = CreateCompatibleDC(hDC);
>> hOldBMP = (HBITMAP)SelectObject(memDC, hBitmap);
>> BitBlt(hDC, 0, 0, bmp.bmWidth, bmp.bmHeight, memDC, 0, 0,
VD> SRCCOPY);
>> SelectObject(memDC, hOldBMP);
>> DeleteDC(memDC);
>> EndPaint(hwnd, &ps);
>> DeleteObject(hBitmap);
>> }
>> else
>> {
>> // you could get additional info about error here
>> // using GetLastError()
>> MessageBox(hwnd, "Could not load image", "Error", MB_OK);
>> }
>> break;
>> case WM_DESTROY:
>> PostQuitMessage (0); /* send a WM_QUIT to the message
VD> queue */
>> break;
>> default: /* for messages that we don't deal
VD> with */
>> return DefWindowProc (hwnd, message, wParam, lParam);
>> }
>>
>>
>> Check if your "bitmapa.bmp" file is inside default program directory...
>>
>> --
>> Best regards,
>> Krzysztof
>>
>> mailto:sa...@op...
>> http://www.saveman.w.pl
>>
>>
VD> I got it working now. The thing is that I was using the code in response to
VD> WM_LBUTTONDOWN message, and now I changed it to use GetDC() for obtaining
VD> device context instead of BeginPaint(). Thanks for help, guys.But would like
VD> to now why I was getting that strange error. I can't believe it's that wrong
VD> to use BeginPaint() outside the WM_PAINT message?
From MSDN:
An application should not call BeginPaint except in response
to a WM_PAINT message. Each call to BeginPaint must have a
corresponding call to the EndPaint function.
--
Best regards,
Krzysztof
mailto:sa...@op...
http://www.saveman.w.pl
|