Re: Clickable images on a dialog
Is your derived class receiving messages, such as WM_PAINT? If not you
probably missed the subclassing step. Your dialog .h file should have a
control member variable like CStaticDerived m_mystatic;
Yes, it has:
// Dialog Data
//{{AFX_DATA(CLogoDetectConfigure)
enum { IDD = IDD_LOGO_CONFIGURE };
CStaticDraw m_detection_zone;
//}}AFX_DATA
Your dialog
.cpp file should have a line in DoDataExchange like:
DDX_Control(pDX, IDC_MY_STATIC, m_mystatic);
I have the following:
void CLogoDetectConfigure::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLogoDetectConfigure)
DDX_Control(pDX, IDC_DETECTION_ZONE, m_detection_zone);
//}}AFX_DATA_MAP
}
If you add your control member variable with the wizard the wizard puts
this line in for you. This line "subclasses" the static control so your
derived class will receive the control's messages. (Also make sure you
are not using the default IDC_STATIC as the control's ID.)
Yes, my derived class of CStatic has an ID = IDC_DETECTION_ZONE
I don't know if this will help, but heres the header file of
CStaticDraw:
#if
!defined(AFX_STATICDRAW_H__C3659D43_C649_47AA_9EA1_0A2D07909AB2__INCLUDED_)
#define
AFX_STATICDRAW_H__C3659D43_C649_47AA_9EA1_0A2D07909AB2__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// StaticDraw.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CStaticDraw window
class CStaticDraw : public CStatic
{
// Construction
public:
CStaticDraw();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CStaticDraw)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CStaticDraw();
// Generated message map functions
protected:
//{{AFX_MSG(CStaticDraw)
afx_msg void OnPaint();
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately
before the previous line.
#endif //
!defined(AFX_STATICDRAW_H__C3659D43_C649_47AA_9EA1_0A2D07909AB2__INCLUDED_)
..... and heres the implementation:
// StaticDraw.cpp : implementation file
//
#include "stdafx.h"
#include "plug_ma_logodetection.h"
#include "StaticDraw.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStaticDraw
CStaticDraw::CStaticDraw()
{
}
CStaticDraw::~CStaticDraw()
{
}
BEGIN_MESSAGE_MAP(CStaticDraw, CStatic)
//{{AFX_MSG_MAP(CStaticDraw)
ON_WM_PAINT()
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStaticDraw message handlers
void CStaticDraw::OnPaint()
{
CPaintDC dc( this ); // device context for painting
//Create a memory dc
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CRect image_location;
GetClientRect( &image_location );
//create a memory bitmap, and initialize it to all white
CBitmap MemBmp;
MemBmp.CreateCompatibleBitmap(&dc,image_location.Width(),
image_location.Height());
CBitmap *pOldMemBmp = MemDC.SelectObject(&MemBmp);
MemDC.FillSolidRect(0, 0, image_location.Width(),
image_location.Height() ,RGB(255,255,255));
//create a dc to hold the original bitmap
CDC BmpDC;
BmpDC.CreateCompatibleDC(&dc);
CBitmap Bmp;
CBitmap *pOldBmp = BmpDC.SelectObject(&Bmp);
MemDC.BitBlt(0, 0, image_location.Width(), image_location.Height(),
&BmpDC,0,0,SRCCOPY);
BmpDC.SelectObject(&pOldBmp);
MemDC.SelectObject(pOldMemBmp);
}