1

工具:Visual Studio 2019、MFC、cpp

我正在寻找如何更改CFileDialog对话框的背景颜色。我找到了这个链接 ==> Q115087: HOWTO: Change the Background Color of a Common Dialog

我已经提取了这段代码并将其全部插入到我的项目中,然后是两个文件mydlg.h和 m ydlg.cpp。我将CFileDialog对象替换为mydlg.

该代码包括:

头文件 ==> mydlg.h

// 
#include <dlgs.h>
#define BACKGROUNG_COLOR RGB(0, 0, 255)
 ////////////////////////////////////////////////////////////////////// 
// CMyDlg dialog
class CMyDlg : public CFileDialog
{
// Construction
public:
CMyDlg(CWnd* pParent = NULL);   // standard constructor
// Add a CBrush pointer to store the new background brush
CBrush m_pBkBrush;
// Dialog Data
//{{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()
};

代码文件 CMyDlg.cpp

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 message handlers

HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
m_pBkBrush.CreateSolidBrush(BACKGROUNG_COLOR);
switch (nCtlColor) {   // ==>  breakpoint here

case CTLCOLOR_STATIC:
{
// Set the static text to white on blue.
pDC->SetBkColor(BACKGROUNG_COLOR); return (m_pBkBrush);
}
case CTLCOLOR_DLG: return (m_pBkBrush);
default: return CFileDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

我怎么称呼它

CMyDlg FileOpenDialog(TRUE,NULL,local_File,OFN_FILEMUSTEXIST |
OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,
OpenFilter,                     // filter
AfxGetMainWnd());               // the parent window 

CString local_string= Current_Dir();
FileOpenDialog.m_ofn.lpstrInitialDir = local_string;
    
status = Mess.LoadString(IDS_STRING191);
FileOpenDialog.m_ofn.lpstrTitle = Mess;

if (FileOpenDialog.DoModal() == IDOK)
{
pszSource = FileOpenDialog.m_ofn.lpstrFile;
return true;
}
return false;

编译OK

观察背景颜色不会改变当我在函数中的开关上放置一个停止点时,OnCtlColor我们不会通过那里。

你有什么想法,你能帮我吗?谢谢

4

1 回答 1

1

您是否阅读过这篇文章如何更改通用对话框 Q117778 的背景颜色 -在它说的地方不起作用:

更改标准文件对话框的背景颜色似乎是可能的,但比简单对话框需要更多的步骤。

如果更改颜色绝对至关重要且没有更简单的解决方案,请考虑以下摘要:

  • 从 派生一个类CFileDialog
  • 在构造函数中,获取变量的值m_ofn.lpfnHook并存储到变量中。写入m_ofn.lpfnHook新钩子程序的地址。新的钩子程序将调用旧的钩子程序。
  • 在新的钩子过程中,拦截WM_INITDIALOG消息并执行以下操作:获取父级HWND并获取父级的GWL_WNDPROC值(旧窗口过程)并将其存储在变量中。将此过程替换为新的窗口过程。新的窗口过程将调用旧的。
  • 在新窗口程序中,拦截WM_CTLCOLORDLG消息并按照文档和上述帖子中的说明进行操作。

链接的对话线程的日期为 2009 年,比您的链接教程更新。

于 2021-06-22T08:20:23.810 回答