Newsgroup: it.comp.programmare.win32
Titolo: Visiualizzare Bitmap su Dialog

Salve a tutti,
sono alle prime armi e sto cercando di visiualizzare un'immagine su un
dialog. SO che ci sono mille post, sull'argomento ma non riesco a far
funzionare il codice.
Visualizzo un secondo dialog in fullscreen sul secondo schermo e
premendo un bottone sul dialog sul primo schermo vorrei che mi
visualizzazze l'immagine.
Sono riuscito a creare 2 dialog e a spostarne 1 sul secondo schermo.
Riesco a caricare il Bitmap:
CString sImaggine;
sImmagine="c:\\imagine.bmp";
HBITMAP hBitmap=(HBITMAP) ::LoadImag(NULL, sImmagine, IMAGE_BITMAP, 0,
0, LR_LOADFROMFILE | LR_CREATEDBSECTION);
Ho creato una variabile pubblica per controllare il secondo dialog
all'avvio del primo come:
m_dlgVision.Create(IDD_DVISION, this);
Creazie a tutti

mentu ha scritto:

Scusa, ma non ho ben capito qual è il problema: non riesci a 
visualizzare la dialog o la bitmap?
Poi, dovresti postare esattamente il codice che hai scritto (leggi: 
copia e incolla), invece di scrivere manualmente il codice nell'e-mail, 
o quanto meno l'esempio dovresti prima provare a compilarlo.

In effetti non sono stato chiaro.Per la dialog, non ci sono problemi,
riesco a crearla e spostarla sul secondo schermo. Non riesco a
visualizzare la Bitmap, nel senso che riesco a caricare in memoria
l'immagine bitmap come Hbitmap, poi non so come visualizzarlo nella
dialog.  In pratica vorrei realizzare un'immagine in fullscreen sul
secondo schermo. Uso Visual C++ 6
BOOL CFullscreenDlg::OnInitDialog()
{
....
       // TODO: Add extra initialization here
       m_dlgVision.Create(IDD_DVISION, this);
       m_dlgVision.SetWindowPos(NULL,1440,0,1024,768,SWP_SHOWWINDOW);
       m_dlgVision.ShowWindow(SW_SHOWMAXIMIZED);
	return TRUE;  // return TRUE  unless you set the focus to a control
}
void CFullscreenDlg::OnButton1()
{
CString sImmagine;
sImmagine="D:\\Programs_Data\\Matlab\\20_Present\\Pattern\
\calib1.bmp";
HBITMAP hBitmap = (HBITMAP) ::LoadImage(AfxGetInstanceHandle(),
sImmagine, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
}

mentu ha scritto:

Un esempio, utilizzando una mia classe CLayoutImage, derivata da 
CStatic, piazzando un controllo di tipo static sulla dialog.
Per disegnare direttamente sulla dialog, dovrebbe essere (quasi) la 
stessa cosa.
In questo esempio, io avevo una CBitmap caricata dalle risorse, invece 
di una HBITMAP. Per passare da HBITMAP a CBitmap, prova ad utilizzare la 
funzione CBitmap::FromHandle.
CBitmap m_bitmap;
void CLayoutImage::OnPaint()
{
	CPaintDC dc(this); // device context for painting
 
	CRect rcWindow;
	GetClientRect(&rcWindow);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(&dc, rcWindow.Width(), rcWindow.Height());
	// use a memory device context
	CDC dcMem;
	dcMem.CreateCompatibleDC(&dc);
	dcMem.SelectObject(&bmp);
	// disegna la bitmap di sfondo
	CUtility::DrawBitmap(&dcMem, &m_bitmap, 0, 0, 0, 0, 0, 0);
 
	// mostra lo stato delle macchina
	ShowStato(&dcMem);
	// copy to paint device context
	dc.BitBlt(0, 0, rcWindow.Width(), rcWindow.Height(), &dcMem, 0, 0, 
SRCCOPY);
 
	// Do not call CImage::OnPaint() for painting messages
}
BOOL CUtility::DrawBitmap(CDC* pDC, CBitmap* pBitmap, int xPos, int 
yPos, int nWidth, int nHeight, int xSrc, int ySrc)
{
	BOOL bRes = FALSE;
	CDC dcBitmap;
	if (dcBitmap.CreateCompatibleDC(pDC))
	{
		if (dcBitmap.SelectObject(pBitmap))
		{
			BITMAP bm;
			if (pBitmap->GetBitmap(&bm))
			{
				if (nWidth == 0)
					nWidth = bm.bmWidth;
				if (nHeight == 0)
					nHeight = bm.bmHeight;
				bRes = pDC->BitBlt(xPos, yPos, nWidth, nHeight, &dcBitmap, xSrc, 
ySrc, SRCCOPY);
			}
		}
	}
	return bRes;
}

Ho provato a far girare il codice ma non va. L'ho modificato
leggermente. Ho provato a fare un debug guardando cosa viene caricato
nelle variabili e bmpIma non viene visualizzata. Non deve essere
inizializzata la vairiabile?
void CFullscreenDlg::OnBfrase()
{
	// TODO: Add your control notification handler code here
	CPaintDC dc(&m_dlgVision);
	CRect rcWindow;
    GetClientRect(&rcWindow);
	HBITMAP hBitmap = NULL;
	hBitmap = (HBITMAP)LoadImage(NULL, "C:\\prova.bmp", IMAGE_BITMAP, 0,
0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
	CBitmap bmpIma;
        bmpIma.CreateCompatibleBitmap(&dc, rcWindow.Width(),
rcWindow.Height());
	bmpIma.DeleteObject();
	bmpIma.Detach();
	bmpIma.Attach(hBitmap);
    // use a memory device context
    CDC dcMem;
    dcMem.CreateCompatibleDC(&dc);
    dcMem.SelectObject(&bmpIma);
    // disegna la bitmap di sfondo
    CFullscreenDlg::DrawBitmap(&dcMem, &bmpIma, 0, 0, 0, 0, 0, 0);
    // mostra lo stato delle macchina
    //ShowStato(&dcMem);
    // copy to paint device context
    dc.BitBlt(0, 0, rcWindow.Width(), rcWindow.Height(), &dcMem, 0,
0,SRCCOPY);
   // Do not call CImage::OnPaint() for painting messages
	m_dlgVision.Invalidate();
}
BOOL CFullscreenDlg::DrawBitmap(CDC *pDC, CBitmap *pBitmap, int xPos,


mentu ha scritto:

No, non ci siamo.
L'esempio che ti ho mandato va sull'OnPaint (handler del messagio 
WM_PAINT) della dialog dove vuoi mostrare l'immagine, o meglio ancora 
sull'OnPaint di un controllo derivato da CStatic che si trova nella 
dialog dove vuoi mostrare l'immagine.
Il codice che segue l'ho provato e funziona...
void CFullscreenDlg::OnBfrase()
{
  	HBITMAP hBitmap = NULL;
  	hBitmap = (HBITMAP)LoadImage(NULL, "C:\\prova.bmp", IMAGE_BITMAP, 0,
  0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
	m_dlgVision.m_bitmap.Attach(hBitmap);
	m_dlgVision.DoModal();
}
class CDlgVision : public CDialog
{
// Construction
public:
	CDlgVision(CWnd* pParent = NULL);   // standard constructor
// Dialog Data
	//{{AFX_DATA(CDlgVision)
	enum { IDD = IDD_VISION };
		// NOTE: the ClassWizard will add data members here
	//}}AFX_DATA
	CBitmap m_bitmap;
// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CDlgVision)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL
// Implementation
protected:
	BOOL DrawBitmap(CDC* pDC, CBitmap* pBitmap, int xPos, int yPos, int 
nWidth, int nHeight, int xSrc, int ySrc);
	// Generated message map functions
	//{{AFX_MSG(CDlgVision)
	afx_msg void OnPaint();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CDlgVision, CDialog)
	//{{AFX_MSG_MAP(CDlgVision)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CDlgVision::OnPaint()
{
     CPaintDC dc(this); // device context for painting
     CRect rcWindow;
     GetClientRect(&rcWindow);
     CBitmap bmp;
     bmp.CreateCompatibleBitmap(&dc, rcWindow.Width(), rcWindow.Height());
     // use a memory device context
     CDC dcMem;
     dcMem.CreateCompatibleDC(&dc);
     dcMem.SelectObject(&bmp);
     // disegna la bitmap di sfondo
     DrawBitmap(&dcMem, &m_bitmap, 0, 0, 0, 0, 0, 0);
     // copy to paint device context
     dc.BitBlt(0, 0, rcWindow.Width(), rcWindow.Height(), &dcMem, 0, 0, 
SRCCOPY);
     // Do not call CImage::OnPaint() for painting messages
}
BOOL CDlgVision::DrawBitmap(CDC* pDC, CBitmap* pBitmap, int xPos, int 
yPos, int nWidth, int nHeight, int xSrc, int ySrc)
{
     BOOL bRes = FALSE;
     CDC dcBitmap;
     if (dcBitmap.CreateCompatibleDC(pDC))
     {
         if (dcBitmap.SelectObject(pBitmap))
         {
             BITMAP bm;
             if (pBitmap->GetBitmap(&bm))
             {
                 if (nWidth == 0)
                     nWidth = bm.bmWidth;
                 if (nHeight == 0)
                     nHeight = bm.bmHeight;
                 bRes = pDC->BitBlt(xPos, yPos, nWidth, nHeight, 


Grande Kan!
Funziona alla grande!!!!
Unico neo con il comando m_dlgVision.DoModal(); il controllo passa
alla dialog IDD_VISION (m_dlgVision) e finchè non la chiudo non posso
far nulla. La mia idea era di visualizzarla (non necessariamente in
primo piano, cmq è sul secondo monitor) e poi continuare ad eseguire
istruzioni.
 void CFullscreenDlg::OnBfrase()
 {
         HBITMAP hBitmap = NULL;
         hBitmap = (HBITMAP)LoadImage(NULL, "C:\\prova.bmp",
IMAGE_BITMAP, 0,
   0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
         m_dlgVision.m_bitmap.Attach(hBitmap);
         m_dlgVision.DoModal();
          // istruzioni
          // visualizza altra immagine
          // istruzioni
 }

mentu ha scritto:

per creare la dialog non modale:
	if (!::IsWindow(m_dlgVision.GetSafeHwnd()))
	{
		if (!m_dlgVision.Create(m_dlgVision::IDD))
			return FALSE; // errore creazione dialog
	}
	BOOL bRes = m_dlgVision.ShowWindow(SW_SHOWNORMAL);
	m_dlgVision.UpdateWindow();
	m_dlgVision.SetFocus();