CheckFrame Control
Sometimes it can be handy to exclude a set of options based on the users choice. For instance if the user do not want to save a log file, then it should be signalled, to the user, which options are relevant.

fig.1 The checkframe control are disabled, and so is its the
contained controls.

fig. 2 The check frame is enabled and the controls can be used.
The header file: CheckFrm.h
BOOL IsRectContainedInRect(CRect &rcChild, CRect &rcMother);
class CCheckFrame : public CObject
{
public:
virtual void Enable(BOOL bEnable);
void Set(CWnd *pParentWnd,UINT nFrmCtl);
CWnd* m_pFrame;
CWnd* m_pDialog;
CRect m_rFrm;
CDWordArray m_adwWndHandles;
protected:
};
The impementation file: CheckFrm.cpp
The code are futher commented in the source files.
#include "stdafx.h"
#include "Checkfrm.h"
//////////////////////////////////////
// EnumChildWnds Callback
BOOL CALLBACK EnumChildWnds(HWND hwnd, CCheckFrame *pObj)
{
CRect R;
GetWindowRect(hwnd, &R);
pObj->m_pDialog->ScreenToClient(&R);
if (hwnd != pObj->m_pFrame->m_hWnd)
{
if (IsRectContainedInRect(R, pObj->m_rFrm))
pObj->m_adwWndHandles.Add((DWORD)hwnd);
}
return TRUE;
}
//////////////////////////////////////
// Function name : Set
void CCheckFrame::Set(CWnd *pParentWnd, UINT nFrmCtl)
{
m_pDialog = pParentWnd;
// Calculate the size of the rect that should contain the controls
m_pFrame = m_pDialog->GetDlgItem(nFrmCtl);
if (!m_pFrame)
{
AfxMessageBox("Unable to find frame control");
return;
}
m_pFrame->GetWindowRect(&m_rFrm);
m_pDialog->ScreenToClient(&m_rFrm);
// Make sure the array is empty
m_adwWndHandles.RemoveAll();
// The (control) windows contained within the boundaries of the frame control
// are enumerated and their associated window-handles collected in an array.
EnumChildWindows(m_pDialog->m_hWnd, (WNDENUMPROC)EnumChildWnds, (LONG)(CCheckFrame *)this);
}
//////////////////////////////////////
// Function name : CCheckFrame::Enable
void CCheckFrame::Enable(BOOL bEnable)
{
for (int i=0 ; i<m_adwWndHandles.GetSize() ; i++)
EnableWindow((HWND)m_adwWndHandles[i], bEnable);
}
//////////////////////////////////////
// Function name : IsRectContainedInRect
BOOL IsRectContainedInRect(CRect &rcChild, CRect &rcMother)
{
if (rcMother.PtInRect(CPoint(rcChild.left, rcChild.top)) &&
rcMother.PtInRect(CPoint(rcChild.left, rcChild.bottom)) &&
rcMother.PtInRect(CPoint(rcChild.right, rcChild.top)) &&
rcMother.PtInRect(CPoint(rcChild.right, rcChild.bottom)))
return TRUE;
return FALSE;
}
Known problems:
If the checkbox control it self is disabled when the progrma
exits, try to move it some pixels away from the border of the
frame control.
Download the sample project (31 kb)
Posted : March 12, 98

Comments
Very useful some suggestions
Posted by Legacy on 06/23/2003 12:00amOriginally posted by: Colin Undery
Reply
A much easier way
Posted by Legacy on 10/16/2002 12:00amOriginally posted by: Yair Konfino
1. using the resource editor , position your check box over
the frame.
2. set an id for the frame . something other then
IDC_STATIC ( like IDC_STATIC_FRAME ).
3. inside OnInitDialog() do the follwing :
GetDlgItem(IDC_STATIC_FRAME)->
ModifyStyle(0,WS_CLIPSIBLINGS);
thats it ...
Enjoy
Yair
ReplyExcellent Piece of work
Posted by Legacy on 05/27/2002 12:00amOriginally posted by: Joe Sonderegger
This is excellent piece of work.
I have used it also for disabling a complete dialog (by making the frame invisible.
Thanx
Joe Sonderegger
Reply