![]() |
Библиотека Интернет Индустрии I2R.ru |
||
Элемент управления CheckFrame![]() Рис.1. CheckFrame отключен вместе со всеми содержащимися в нем элементами управления. ![]() Рис.2. CheckFrame включен и все его элементы могут использоваться. Определения. CheckFrame.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:
};
Реализация. CheckFrame.cpp Код достаточно прокоментирован #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;
// Вычисляет размер прямоугольника,
содержащий элементы управления.
m_pFrame = m_pDialog->GetDlgItem(nFrmCtl);
if (!m_pFrame)
{
AfxMessageBox("Не могу найти
элемент управления - Frame");
return;
}
m_pFrame->GetWindowRect(&m_rFrm);
m_pDialog->ScreenToClient(&m_rFrm);
// Необходимо убедится, что массив пуст
m_adwWndHandles.RemoveAll();
// В этом массиве хранятся указатели на
элементы управления окруженные
// прямоугольником рамки Frame'а.
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;
}
Проблеммы: Christian Skovdal Andersen |
|
| 2000-2008 г. Все авторские права соблюдены. |