Библиотека Интернет Индустрии 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 г. Все авторские права соблюдены. |
|