Power Builder - Error

 
Vista:

Error

Publicado por Guillermo (20 intervenciones) el 16/10/2007 18:18:06
Hola Amigos del Foro.
Cuando inserto una imagen que tiene un ancho mayor a 4000 pixeles en un Picture Box, me sucede el siguiente error:

"Image too wide for this implementacion"

Pienso que podria solucionarlo restiriengo el ancho del Archivo JPG, pero no encuentro una funcion que me devuelva el ancho de la imagen.

Espero algunos comentarios,
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error

Publicado por alberto (73 intervenciones) el 16/10/2007 18:24:12
Bueno, creo que eres el mismo de la pregunta que ya respondí.
Lo que necesitas es crear un CompatibleDevice con api del windows, para escalar la imágen antes de asignar a tu control.

En Gdi32.lib tienes funciones api para el manejo de mapas de bits

BOOL GetBitmapDimensionEx(
HBITMAP hBitmap, // handle to bitmap
LPSIZE lpDimension // dimensions
);

typedef struct tagSIZE {
LONG cx;
LONG cy;
} SIZE, *PSIZE;

hBitmap debe ser un handle a un bitmap, que puedes crear con otras funciones de API

Por ejemplo con esta función
HBITMAP LoadBitmap(
HINSTANCE hInstance, // handle to application instance
LPCTSTR lpBitmapName // name of bitmap resource
);

Ahora. para escalar la imágen, haces esto (sacado de MSDN de Microsoft) :

hdcScaled = CreateCompatibleDC(hdcScreen);

hbmScaled = CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen, HORZRES) * 2,
GetDeviceCaps(hdcScreen, VERTRES) * 2);

if (hbmScaled == 0)
errhandler("hbmScaled", hwnd);

// Select the bitmaps into the compatible DC.

if (!SelectObject(hdcScaled, hbmScaled))
errhandler("Scaled Bitmap Selection", hwnd);

case WM_COMMAND: // message: command from application menu
switch(wParam)
{
case IDM_SCALEX1:
if (fBlt)
{
fScaled = FALSE;
hdcWin = GetDC(hwnd);
BitBlt(hdcWin,
0,0,
bmp.bmWidth, bmp.bmHeight,
hdcCompatible,
0,0,
SRCCOPY);
ReleaseDC(hwnd, hdcWin);
}
break;

case IDM_SCALEX2:
if (fBlt)
{
fScaled = TRUE;
StretchBlt(hdcScaled,
0, 0,
bmp.bmWidth * 2, bmp.bmHeight * 2,
hdcCompatible,
0, 0,
bmp.bmWidth, bmp.bmHeight,
SRCCOPY);

hdcWin = GetDC(hwnd);
BitBlt(hdcWin,
0,0,
bmp.bmWidth, bmp.bmHeight,
hdcScaled,
0,0,
SRCCOPY);
ReleaseDC(hwnd, hdcWin);
}
break;

Esto lo puedes implementar llamando a todas estas api desde powerbuilder o bien en una librería en C o C++

EL WM_* es un evento en powerbuilder. tienes que repintar la imágen cada vez que se hace un resize del layout (tu ventana)
y en el evento paint

Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error

Publicado por alberto (73 intervenciones) el 16/10/2007 18:27:51
Otra cosa. Si no te "sientes cómodo" con C y api's del windows me avisas y te preparo un ejemplo en powerbuilder.
me darás un poco de tiempo, pq no lo tengo en abundancia :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar