Visualizzare una bitmat su oWnd:oWndClient

Moderator: Enrico Maria Giordano

Post Reply
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Visualizzare una bitmat su oWnd:oWndClient

Post by Marco Turco »

Salve,
ho qualche problema a visualizzare una bitmap su una finestra MDI.
Sbaglio forse qualcosa nell'utilizzare la funzione drawbitmap ?

Grazie

Marco
----

#include "FiveWin.ch"

#define SRCPAINT 15597702 // 0xEE0086
#define SRCAND 8913094

static oWnd

//----------------------------------------------------------------------------//

function Main()

DEFINE WINDOW oWnd TITLE "Testing bitmaps";
MDI


@ 2, 2 BUTTON "&Display bitmap" SIZE 120, 25 ACTION SHOWBMP(OWND) OF OWND:OWNDCLIENT

ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------//

function ShowBmp( oDlg )

local oBmp1

DEFINE BITMAP oBmp1 FILENAME "..\bitmaps\Cartoon.bmp"

DrawBitmap( oWnd:oWndClient, oBmp1:hBitmap, 0, 0, 0, 0, SRCPAINT )

oBmp1:End()

return nil
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Post by pymsoft »

A me funziona in questo modo:

Code: Select all


STATIC oBitmap, MainWnd


********
FUNCTION Main()
********

   DEFINE WINDOW MainWnd FROM 0,0 to 28,80 ;
    TITLE "";
      ICON oIcon;
      COLOR CLR_WHITE, oV:nRGBSfondo; 
      MENU oMenu;
      MENUINFO 5;
      MDI               // Finestra MDI

   @MainWnd:nBottom,MainWnd:nRight BITMAP oBitMap  NAME "LOGO2_WP50" OF MainWnd:oWndClient PIXEL

   ACTIVATE WINDOW MainWnd MAXIMIZED ;
      ON RESIZE ( Muevo(), oBitMap:refresh() )

RETURN NIL
*
** eof Main

***************
STATIC FUNCTION Muevo()
***************

   local aRect := MainWnd:GetCliRect()
   local oRect := TRect():New( aRect:nTop, aRect:nLeft, aRect:nBottom,;
                               aRect:nRight )

   oRect:nTop    := Max( 0, Int( ( aRect:nBottom - oBitMap:nHeight * 2 - 10 ) ) )
   oRect:nBottom := oRect:nTop  + oBitMap:nHeight - 1
   oRect:nLeft   := Max( 0, Int( ( aRect:nRight - oBitMap:nWidth - 10  ) ) )
   oRect:nRight  := oRect:nLeft + oBitmap:nWidth - 1

   oBitMap:SetCoors( oRect )

return nil
*
** eof Muevo()


ciao
Pedro Gonzalez
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Post by Marco Turco »

Si, anche a me funziona così però vorrei visualizzare la bitmap senza creare un oggetto.

Marco
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Visualizzare una bitmat su oWnd:oWndClient

Post by Enrico Maria Giordano »

Code: Select all

function ShowBmp( oDlg ) 

local oBmp1 

DEFINE BITMAP oBmp1 FILENAME "\fwharbour\bitmaps\Cartoon.bmp" 

DrawBitmap( oWnd:oWndClient:GetDC(), oBmp1:hBitmap, 0, 0, 0, 0, SRCPAINT ) 
oWnd:oWndClient:ReleaseDC()
oBmp1:End() 

return nil
EMG
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Post by Marco Turco »

Si, è quello che volevo. Grazie.
Un chiarimento però:
considerato che devo visualizzare diverse bitmap, inserisco oWnd:oWndClient:GetDC() in una variabile, lo utilizzo per tutte le bitmap richieste e quindi faccio un ReleaseDC alla fine. E' corretto o agendo così creo perdite di risorse ?


Esempio:

function ShowBmp( oDlg )

local oBmp1,oDc

oDc:=oWnd:oWndClient:GetDC()

DEFINE BITMAP oBmp1 RESOURCE "IMAGE1"
DrawBitmap( oDC, oBmp1:hBitmap, 0, 0, 0, 0, SRCPAINT )
oBmp1:End()

DEFINE BITMAP oBmp1 RESOURCE "IMAGE2"
DrawBitmap( oDC, oBmp1:hBitmap, 0, 0, 0, 0, SRCPAINT )
oBmp1:End()

DEFINE BITMAP oBmp1 RESOURCE "IMAGE3"
DrawBitmap( oDC, oBmp1:hBitmap, 0, 0, 0, 0, SRCPAINT )
oBmp1:End()

oWnd:oWndClient:ReleaseDC()
return nil
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Post by Enrico Maria Giordano »

Corretto. Hai considerato però che con questa tecnica i bitmap spariscono se la finestra viene coperta e poi scoperta? Per evitare questo devi mettere il disegno nell'evento ON PAINT.

EMG
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Post by Marco Turco »

Ok. Si naturalmente ad ogni evento ON PAINT faccio un refresh delle bitmap.

Avevo la necessità di questa soluzione perché in alcuni casi ho la necessità di lasciare lo sfondo senza bitmap. Gestendo le bitmap come oggetto verrebbero ridisegnate automaticamente.

Grazie

Marco
Post Reply