[RESOLVED] [WIN32] - how add an image to main window?
sometimes i don't understand these API functions :(
Code:
.......................
HBITMAP g_hbmBall=NULL;
switch (message) /* handle the messages */
{
case WM_CREATE:
{
g_hbmBall =(HBITMAP) LoadImage(NULL,"C:\\Chrysanthemum.bmp",IMAGE_BITMAP,LR_DEFAULTSIZE,LR_DEFAULTSIZE,LR_LOADFROMFILE);
if(g_hbmBall == NULL)
MessageBox(hwnd, "Could not load the image!", "Error", MB_OK | MB_ICONEXCLAMATION);
}
break;
case WM_PAINT:
{
BITMAP bm;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld =(HBITMAP) SelectObject(hdcMem, g_hbmBall);
GetObject(g_hbmBall, sizeof(bm), &bm);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
}
break;
.........................
but why, with WM_PAINT message, the BitBlt() isn't showed the image? :(
the main window is created with WS_EX_CLIENTEDGE and WS_OVERLAPPEDWINDOW styles.
(i can share the rest of code)
Re: [WIN32] - how add an image to main window?
Where is your error checking for the function calls in WM_PAINT? Every function call needs to be checked for errors like you do in the WM_CREATE case.
Re: [WIN32] - how add an image to main window?
Quote:
Originally Posted by
2kaud
Where is your error checking for the function calls in WM_PAINT? Every function call needs to be checked for errors like you do in the WM_CREATE case.
my error was another one with g_hbmBall: or i must do it static or i just:
Code:
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HBITMAP g_hbmBall=(HBITMAP) LoadImage(NULL,"C:\\Users\\Joaquim\\Documents\\Visual C 98\\CatchDiamonds\\Debug\\Images\\Chrysanthemum.bmp",IMAGE_BITMAP,LR_DEFAULTSIZE,LR_DEFAULTSIZE,LR_LOADFROMFILE);
i'm getting an error here: the image isn't showed with original size, can you advice me?
Re: [WIN32] - how add an image to main window?
Quote:
Originally Posted by
Cambalinho
my error was another one with g_hbmBall: or i must do it static or i just:
Code:
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HBITMAP g_hbmBall=(HBITMAP) LoadImage(NULL,"C:\\Users\\Joaquim\\Documents\\Visual C 98\\CatchDiamonds\\Debug\\Images\\Chrysanthemum.bmp",IMAGE_BITMAP,LR_DEFAULTSIZE,LR_DEFAULTSIZE,LR_LOADFROMFILE);
i'm getting an error here: the image isn't showed with original size, can you advice me?
resolved ;)
i had 1 class builded by me, that i had forgot:
Code:
//Image.h
struct ImageInfo
{
HBITMAP ImageImage;
BITMAP Imagebm;
HDC ImagehdcMem;
HBITMAP ImageMaskImage;
BITMAP ImageMaskbm;
HDC ImageMaskhdcMem;
};
enum DrawWay {Normal, Stretch};
class Image
{
//if MaskColor is -3 then the transparency is ignored;
//if MaskColor is -2 then the transparent color is the pixel width, height
//if MaskColor is -1 then the transparent color is the pixel 0,0
public : void Load(ImageInfo &imagem, char *FileName,COLORREF MaskColor=-3)
{
int posx;
int posy;
COLORREF b;
//Load the image
imagem.ImageImage = (HBITMAP)LoadImage(0, FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(imagem.ImageImage , sizeof(BITMAP), &imagem.Imagebm);
imagem.ImagehdcMem = CreateCompatibleDC(NULL);
SelectObject(imagem.ImagehdcMem, imagem.ImageImage);
//Create the mask
if (MaskColor==-3)
{
//don't do the mask
}
else
{
imagem.ImageMaskImage = (HBITMAP)LoadImage(0, FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(imagem.ImageMaskImage , sizeof(BITMAP), &imagem.ImageMaskbm);
imagem.ImageMaskhdcMem = CreateCompatibleDC(NULL);
SelectObject(imagem.ImageMaskhdcMem, imagem.ImageMaskImage);
if (MaskColor==-2)
MaskColor= GetPixel(imagem.ImageMaskhdcMem,imagem.Imagebm.bmWidth-1,imagem.Imagebm.bmHeight-1);
if (MaskColor==-1)
MaskColor= GetPixel(imagem.ImageMaskhdcMem,0 ,0);
for (posy=0;posy<imagem.Imagebm.bmHeight;posy++)
{
for (posx=0;posx<imagem.Imagebm.bmWidth ;posx++)
{
b=GetPixel(imagem.ImageMaskhdcMem,posx,posy);
if (b==MaskColor)
SetPixel(imagem.ImageMaskhdcMem,posx,posy,RGB(255,255,255));
else
SetPixel(imagem.ImageMaskhdcMem,posx,posy,RGB(0,0,0));
}
}
}
}
public: void Draw(HDC &Destination, ImageInfo &Origem, int PosX=0, int PosY=0, int Width=0, int Height=0, BOOL Transparent=false,DrawWay dwDraw=Normal)
{
if (Transparent==TRUE)
{
if (dwDraw==Stretch)
{
StretchBlt (Destination,
PosX, PosY,
Width, Height,
Origem.ImagehdcMem,
0, 0,
Origem.Imagebm.bmWidth, Origem.Imagebm.bmHeight,SRCINVERT);
StretchBlt (Destination,
PosX, PosY,
Width, Height,
Origem.ImageMaskhdcMem,
0, 0,
Origem.Imagebm.bmWidth, Origem.Imagebm.bmHeight, SRCAND);
StretchBlt (Destination,
PosX, PosY,
Width, Height,
Origem.ImagehdcMem,
0, 0,
Origem.Imagebm.bmWidth, Origem.Imagebm.bmHeight, SRCINVERT);
}
else if (dwDraw==Normal)
{
BitBlt( Destination,
PosX, PosY,
Origem.Imagebm.bmWidth, Origem.Imagebm.bmHeight,
Origem.ImagehdcMem,
0, 0,
SRCINVERT);
BitBlt( Destination,
PosX, PosY,
Origem.Imagebm.bmWidth, Origem.Imagebm.bmHeight,
Origem.ImageMaskhdcMem,
0, 0,
SRCAND);
BitBlt( Destination,
PosX, PosY,
Origem.Imagebm.bmWidth, Origem.Imagebm.bmHeight,
Origem.ImagehdcMem,
0, 0,
SRCINVERT);
}
}
else
{
if (dwDraw==Stretch)
{
StretchBlt (Destination,
PosX, PosY,
Width, Height,
Origem.ImagehdcMem,
0, 0,
Origem.Imagebm.bmWidth, Origem.Imagebm.bmHeight,SRCCOPY);
}
else
{
BitBlt( Destination,
PosX, PosY,
Origem.Imagebm.bmWidth, Origem.Imagebm.bmHeight,
Origem.ImagehdcMem,
0, 0,
SRCCOPY);
}
}
}
public: void Destroy(ImageInfo &BitmapImage)
{
DeleteDC(BitmapImage.ImagehdcMem);
DeleteObject((HBITMAP)BitmapImage.ImageImage);
}
};
//in window procedure:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
ImageInfo test;
Image imOperators;
imOperators.Load(test,"C:\\Users\\Joaquim\\Documents\\Visual C 98\\CatchDiamonds\\Debug\\Images\\Chrysanthemum.bmp");
imOperators.Draw(hdc,test);
imOperators.Destroy(test);
EndPaint(hwnd, &ps);
}
break;
the image is showed with original size ;)
ok.. i must rebuild these function, but can draw the image ;)
thanks to all