15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как изменить фоновый цвет общего диалога

Классы общих диалогов ( File Open и Print ) содержащиеся в MFC можно использовать для изменения фонового цвета этих общих диалогов. Для этого необходимо наследовать MFC класс, от одного из классов для стандартных диалогов, а затем переопределить функции-члены OnCtlColor() и OnDestroy().

Нижеприведённый пример использует класс CFileDialog стандартного диалога. Чтобы сгенерировать функцию-обработчик для сообщения WM_CTLCOLOR, использовался визард ( Class Wizard ). Функция называется "CMyDlg::OnCtlColor()".

Пример кода

   // mydlg.h : заголовочный файл
   // 
   #include <dlgs.h>
   ////////////////////////////////////////////////////////////////////// 
   // CMyDlg dialog

   class CMyDlg : public CFileDialog
   {
   // Construction
   public:
       CMyDlg(CWnd* pParent = NULL);   // standard constructor

       // Добавляем указатель CBrush для хранения новой кисти фона
       CBrush m_pBkBrush;

   // Данные диалога
       //{{AFX_DATA(CMyDlg)
       enum { IDD = FILEOPENORD };
           // NOTE: the ClassWizard will add data members here
       //}}AFX_DATA

   // Implementation
   protected:
       virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV support

       // Generated message map functions
       //{{AFX_MSG(CMyDlg)
       afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
       //}}AFX_MSG
       DECLARE_MESSAGE_MAP()
   };

   // mydlg.cpp : исходник
   // 
   #include "stdafx.h"
   #include <afxdlgs.h>
   #include "mydlg.h"

   #ifdef _DEBUG
   #undef THIS_FILE
   static char BASED_CODE THIS_FILE[] = __FILE__;
   #endif

   ////////////////////////////////////////////////////////////////////// 
   // CMyDlg dialog

   CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
       : CFileDialog(TRUE, NULL, NULL, OFN_HIDEREADONLY)
   {
       //{{AFX_DATA_INIT(CMyDlg)
           // NOTE: the ClassWizard will add member initialization here
       //}}AFX_DATA_INIT
   }

   void CMyDlg::DoDataExchange(CDataExchange* pDX)
   {
       CDialog::DoDataExchange(pDX);
       //{{AFX_DATA_MAP(CMyDlg)
           // NOTE: the ClassWizard will add DDX and DDV calls here
       //}}AFX_DATA_MAP
   }

   BEGIN_MESSAGE_MAP(CMyDlg, CFileDialog)
       //{{AFX_MSG_MAP(CMyDlg)
       ON_WM_CTLCOLOR()
       //}}AFX_MSG_MAP
   END_MESSAGE_MAP()

   ////////////////////////////////////////////////////////////////////// 
   // Обработчики сообщений для CMyDlg

   HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
   {
       switch (nCtlColor) {

       case CTLCOLOR_STATIC:
           // Устанавливаем цвет статического текста белый на синем.
           pDC->SetTextColor(RGB(255, 255, 255));
           pDC->SetBkColor(RGB(0, 0, 255));
           // Drop through to return the background brush.

       case CTLCOLOR_DLG:
           return (HBRUSH)(m_pBkBrush.GetSafeHandle());

       default:
            return CFileDialog::OnCtlColor(pDC, pWnd, nCtlColor);
       }
   }