在mfc中绘制背景

Posted

技术标签:

【中文标题】在mfc中绘制背景【英文标题】:paint background in mfc 【发布时间】:2015-03-04 16:31:31 【问题描述】:

我正在尝试使用 MFC 库在 C++ 中绘制窗口的背景。我必须使用这个框架,因为我正在开发 MFC 应用程序。我尝试了几种不同的方法,但无法让它发挥作用。所以我最近打开了一个空白项目,只想弄清楚如何绘制背景,但它不起作用。任何帮助都会很棒。这是我的代码...

class CExerciseApp : public CWinApp
   
     //a pointer to our window class object
     Basic_Window *bwnd; 

     BOOL InitInstance()
       
         bwnd = new Basic_Window();
         m_pMainWnd = bwnd;
         bwnd->ShowWindow(1);

         HWND hWnd = GetActiveWindow();

         CRect drawing_area;
         GetClientRect(hWnd, &drawing_area);

         CBrush newBrush;
         newBrush.CreateSolidBrush(RGB(255,255,255));

         CDC* dc = bwnd->GetDC();
         dc->FillRect(&drawing_area, &newBrush);
         bwnd->RedrawWindow();
         return TRUE;
        
;  

【问题讨论】:

见 WM_ERASEBKGND msdn.microsoft.com/en-us/library/windows/desktop/… 我应该在调用 FillRect 之前发布 WM_ERASEBKGND 消息吗? 你不发WM_ERASEBKGND,系统会在适当的时候发。您应该覆盖CWnd::OnEraseBkgnd 并在那里进行背景绘画。这就是它的全部内容。 什么是 Basic_Window?那不是 MFC 窗口。您需要将所有像 FillRect() 这样的绘制代码放入 Basic_Window 的绘制过程中,而不仅仅是在只调用一次的 InitInstance 中绘制它。它不起作用,因为一旦另一个窗口(您的或其他应用程序的)覆盖它然后又打开它,您的绘画就不会再次出现,因此消失了。 但是如果在InitInstance中进行了绘画操作,应该 【参考方案1】:

在我自己的帖子https://***.com/a/22875542/383779 中,我可以保证我已经完成了这项工作。我使用这种方法在商业应用程序上实现主题/皮肤。

您需要在 Basic_Window 类中添加一个 OnCtlColor 方法。 在您的 .h 文件中,添加到 Basic_Window 类:

const CBrush m_BackgroundBrush;

afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor);

在 .cpp 文件中,构造函数将初始化新变量

Basic_Window::Basic_Window()
: m_BackgroundBrush(RGB(255,255,255))

//...

并实施

HBRUSH Basic_Window::OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor)

    if(some_exception)
        return __super::OnCtlColor( pDC, pWnd, nCtlColor);

    return (HBRUSH) m_BackgroundBrush.GetSafeHandle();

some_exception 在这里表示您需要默认行为而不是您自己的绘画的情况。也许它是某种类型的控件,为此存在nCtlColor 参数。

不要忘记将ON_WM_CTLCOLOR() 添加到您的消息映射中。

【讨论】:

以上是关于在mfc中绘制背景的主要内容,如果未能解决你的问题,请参考以下文章

MFC:当没有选项卡存在时,如何绘制 CTabView 背景?

在mfc的油漆背景

MFC中richedit控件设置为透明后出现文字残留现象

在 mfc 中绘制父对话框

mfc中让编辑框透明为啥总显示黑色背景的编辑框啊?

在 MFC 中重绘时闪烁