Сделать стартовой  Добавить в избранное
Воскресенье, 19.05.2024, 16:53
Главная
Регистрация
Вход
Мир софта!
Приветствую Вас Гость | RSS
Mirsoft
Меню сайта
Наш опрос
Какое радио ты любиш?
Всего ответов: 29

Элемент управления CheckFrame

Иногда может быть полезно основываясь на выборе пользователя отключить некоторый набор опций (элементов управления). Например, если пользователь не желает сохранять log файл, то это должно быть соответствующим образом отображено пользователю.


Рис.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;
}
Форма входа
Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

| Copyright MyCorp © 2024 | Используются технологии uCoz |
<