【问题标题】:How to change the background color of a CFiledialog (2)如何改变一个CFiledialog的背景颜色(二)
【发布时间】:2021-09-05 08:00:13
【问题描述】:

工具:Visual Studio 2019、MFC、cpp

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

我已提取此代码并将其全部插入到我的项目中,然后是两个文件mydlg.h 和 mydlg.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;

编译成功

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

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

【问题讨论】:

  • 如果您放弃了这个问题,请考虑关闭your other version
  • 请花一些时间来正确格式化您的问题。问题编辑器右上角有一个“Markdown 编辑帮助”按钮。
  • 您发布的参考资料上有旧日期(1986-2002)也许该方法适用于旧版本的 CFileDialog(在 Windows Vista 之前)我怀疑它适用于新文件对话框,因为你只对其某些程序的间接访问有限。所以你必须从头开始编写自己的对话框。或者可能有一种方法可以强制 MFC 使用旧对话框(它不漂亮)。请注意,如果您使用标准文件对话框,没有人会抱怨。

标签: c++ winapi mfc common-dialog


【解决方案1】:

你有没有读过这篇文章How To Change the Background Color of a Common Dialog Q117778 - does not work,上面写着:

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

如果改变颜色是绝对关键的并且没有更简单的解决方案,那么请考虑以下摘要:

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

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

【讨论】:

    猜你喜欢
    • 2012-04-02
    • 2022-11-18
    • 2022-09-27
    • 1970-01-01
    • 2013-07-20
    • 2015-05-23
    • 2018-03-08
    相关资源
    最近更新 更多