MFC设定窗口背景

SetDialogBkColor()

CWinApp::SetDialogBkColor

This function is obsolete.

这个函数已经被废弃,我在VC++6.o测试的确可以在初始化的时候设置窗口的背景

BOOL CTest_ColorApp::InitInstance()
{
/*	CColorDialog cdlg;
	if(IDCANCEL != cdlg.DoModal())
	{
		COLORREF cl = cdlg.GetColor();
		SetDialogBkColor( cl, 	RGB(0, 0, 0) );
	}
*/
	SetDialogBkColor(RGB(255,255,0),RGB(0,0,0));
	CTest_ColorDlg dlg;
	m_pMainWnd = &dlg;
	int nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with OK
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with Cancel
	}

	// Since the dialog has been closed, return FALSE so that we exit the
	//  application, rather than start the application's message pump.
	return FALSE;
}

运行效果:MFC设定窗口背景_第1张图片

 

 

后面我又在VS2012中进行了测试:

BOOL CColorDlgApp::InitInstance()
{
	
	SetDialogBkColor(RGB(255,255,0),RGB(0,0,0));
	CShellManager *pShellManager = new CShellManager;
	CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
	CColorDlgDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: 在此放置处理何时用
		//  “确定”来关闭对话框的代码
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: 在此放置处理何时用
		//  “取消”来关闭对话框的代码
	}
	else if (nResponse == -1)
	{
		TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
		TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
	}

	// 删除上面创建的 shell 管理器。
	if (pShellManager != NULL)
	{
		delete pShellManager;
	}

	// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
	//  而不是启动应用程序的消息泵。
	return FALSE;
}


运行效果:

MFC设定窗口背景_第2张图片

注意上面的那个函数属于CWinAPP;不是属于CDialog下面的;如果你不小心写在了你的派生类对话框的Init函数当中,就会出现未定义的错误


既然这个函数被废弃,那么取而代之的是什么?

WM_CTLCOLOR消息用来完成对EDIT、STATIC、BUTTON等控件设置背景和字体颜色,

利用类向导自动生成OnCtlColor()函数

该函数中设置所需颜色后再返回一个画刷句柄便可重绘控件背景色。OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的。常用的此类消息有:

CTLCOLOR_DLG 对话框

CTLCOLOR_EDIT 编辑框

CTLCOLOR_MSGBOX 消息框

CTLCOLOR_SCROLLBAR 滑动条

.............

HBRUSH CTest_ColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	if (pWnd->GetDlgCtrlID() == IDC_STATIC)
	{
		pDC->SetBkMode(TRANSPARENT);
		pDC->SetTextColor(RGB(255,255,46));
		HBRUSH B = CreateSolidBrush(RGB(0,0,88));
		return (HBRUSH)B;
	}

	switch (nCtlColor)
	{
	case CTLCOLOR_BTN: //没有用
		{
			pDC->SetBkMode(TRANSPARENT);
			HBRUSH B = CreateSolidBrush(RGB(0,0,255));
			return (HBRUSH)B;
		}
		
	case CTLCOLOR_DLG:
		{ 
			pDC->SetBkMode(TRANSPARENT);
			HBRUSH B = CreateSolidBrush(RGB(255,0,255));
			return (HBRUSH)B;
		}
	case CTLCOLOR_EDIT:                
		{  
			COLORREF bkColor = RGB(255,255,0);       
			CRect rect;       
			pWnd->GetClientRect(&rect); 
			CBrush br;              
			br.CreateSolidBrush(bkColor);         
			pDC->FillRect(rect, &br);          
			pDC->SetBkColor(bkColor); 
			pDC->SetTextColor(RGB(255,255,0));
			HBRUSH B = CreateSolidBrush(RGB(125,125,255));
			
		}
		
	default:
		return  hbr;
	}
	
	return  hbr;
}


MFC设定窗口背景_第3张图片

 

 

在VS2012下面:

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

	if (pWnd->GetDlgCtrlID() == IDC_COLOR_EDIT)
	{
		pDC->SetBkMode(TRANSPARENT);
		pDC->SetTextColor(RGB(0,255,0));
		HBRUSH B = CreateSolidBrush(RGB(255,255,0));
		return (HBRUSH)B;
	}

	
	switch (nCtlColor)
	{
	case CTLCOLOR_BTN:
		{
			pDC->SetBkMode(TRANSPARENT);
			HBRUSH B = CreateSolidBrush(RGB(0,0,255));
			return (HBRUSH)B;

		}
		
	case CTLCOLOR_DLG:
		{ 
			pDC->SetBkMode(TRANSPARENT);
			HBRUSH B = CreateSolidBrush(RGB(0,0,255));
			return (HBRUSH)B;
		}
	case CTLCOLOR_EDIT:                
		{  
			COLORREF bkColor = RGB(255,0,0);       
			CRect rect;       
			pWnd->GetClientRect(&rect); 
			CBrush br;              
			br.CreateSolidBrush(bkColor);         
			pDC->FillRect(rect, &br);          
			pDC->SetBkColor(bkColor); 
			pDC->SetTextColor(RGB(255,255,0));
			HBRUSH B = CreateSolidBrush(RGB(125,125,255));
			
		}
		
	default:
		return  CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
		

	}
		

}


MFC设定窗口背景_第4张图片

 

但是这个消息不能够设定Button按钮;我尝试了多次都不可以,虽然它有CTLCOLOR_BTN;但是没有效果!!

WM_CTLCOLOR消息对下列五类控件是适用的:   

1.Check box, radio button, push button:用选定的brush画出该控件所被放置的矩形区,控件的形状和文本再在其上画出;  

  2.Edit control:画出编辑区; 

   3.Group box:画出标题文本之下的矩形区域;  

  4.Scroll bar:画出滑块的轨迹; 

   5.List box:画出列表区域。   

 静态文本、边框和矩形不受该消息的影响。   

 还须注意的是,虽然WM-CTLCOLOR消息对Push button是适用的,但是从Windows 3.0及其以后的版本的系统中,加入了用户程序不能修改按钮外观颜色的限制,如果要达到您想要的效果的话,您需要使用owner-drawn button。

 

怎么修改Button按钮的颜色还没有研究,以后需要再研究把,今天只是想修改下背景的颜色,扯出来这么多知识点!

 

 

 

你可能感兴趣的:(VS2012,MFC,windows编程)