问:如何给一个单对话框加背景色或者背景图片 默认生成的对话框太土了;希望能做的漂亮一些,请给个实例,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 以前总结的:改背景色,改背景图片只要把CBrush换为你用Bitmap做的刷子就可以了。内容:改变对话框的背景色方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。 ---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下: ---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。 ---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码: BOOL CExampleDlgApp: : InitInstance ( ){… CExampleDlgDlg dlg; m_pMainWnd = &dlg;//先于DoModal()调用,将对话框设置为蓝色背景、红色文本 SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); int nResponse = dlg.DoModal();…}---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。 ---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准): void CExampleDlgDlg::OnPaint() { if (IsIconic())… else { CRect rect; CPaintDC dc(this); GetClientRect(rect); dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景 CDialog::OnPaint(); }---- 方法三:重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准): ---- ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量: class CExampleDlgDlg : public CDialog{...protected:CBrush m_brush; ...};---- ②在OnInitDialog()函数中添加如下代码: BOOL CExampleDlgDlg::OnInitDialog() {...// TODO: Add extra initialization herem_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子 ...} ---- ③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息: HBRUSH CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {/*** 这里不必编写任何代码!**下行代码要注释掉** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);*/return m_brush; //返加绿色刷子}---- 方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准): ---- 步骤①、②同上方法三中的步骤①、②。 ---- 步骤③利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息)时则有些不同: HBRUSH CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);//在这加一条是否为对话框的判断语句if(nCtlColor ==CTLCOLOR_DLG)return m_brush; //返加绿色刷子return hbr;}---- 编译并运行即可。 如何改变视窗的背景颜色 Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以防止Windows擦除窗口。//Paint area that needs to be erased.BOOL CSampleView : : OnEraseBkgnd (CDC* pDC) BOOL CSampleView : : OnEraseBkgnd (CDC* pDC){// Create a pruple brush.CBrush Brush (RGB (128 , 0 , 128) );// Select the brush into the device context .CBrush* pOldBrush = pDC—>SelcetObject (&brush);// Get the area that needs to be erased .CRect reClip ;pDC—>GetCilpBox (&rcClip);//Paint the area.pDC—> PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY );//Unselect brush out of device context .pDC—>SelectObject (pOldBrush );// Return nonzero to half fruther processing .return TRUE;} 用位图做背景:CPaintDC dc;CBitmap Bitmap;Bitmap.LoadBitmap(IDB_BITMAP1);BITMAP bm;Bitmap.GetObject(sizeof(BITMAP),&bm);CDC MemDC;MemDC.CreateComatibleDC(NULL);MemDC.SelectObject(&Bitmap);dc->BitBlt(10,10,bm.bmWidth, bm,bmHeight,&MemDC,0,0,SRCCOPY); 最简单的办法,重载COLOUR函数 如何给VC对话框加位图背景http://www.tiantiansoft.com/Article_Show.asp?ArticleID=96 用Skin++,MagicSkin换个皮肤就不土了^_^ 基于opencv旋转例程的改进。 求助,关于获取内存信息 求助:在WTL里如何给CButton加控件? CSDN上看文章让我感觉越来越心寒,鼠标随便一划,全是广告在闪............. 会evc的大虾们进来看看呀~ 很简单的问题,MFC中如何改写虚函数 关于二维数组的维数问题,着急,在线等~~ 重组ToolBar的疑问,达人请进 怪事,如何解决??(关于程序间通信) 创建的fileDialog中的文字怎么改变? 3721的安装是怎么做的啊? 一个绘图的问题,请大家帮忙
改背景色,改背景图片只要把CBrush换为你用Bitmap做的刷子就可以了。内容:改变对话框的背景色
方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。
---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下:
---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。
---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码:
BOOL CExampleDlgApp: : InitInstance ( )
{
… CExampleDlgDlg dlg;
m_pMainWnd = &dlg;
//先于DoModal()调用,将对话框设置为蓝色背景、红色文本
SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));
int nResponse = dlg.DoModal();
…}
---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。
---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准):
void CExampleDlgDlg::OnPaint()
{
if (IsIconic())
… else
{
CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景
CDialog::OnPaint();
}
---- 方法三:重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):
---- ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:
class CExampleDlgDlg : public CDialog
{...
protected:
CBrush m_brush;
...
};
---- ②在OnInitDialog()函数中添加如下代码:
BOOL CExampleDlgDlg::OnInitDialog()
{
...
// TODO: Add extra initialization here
m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子
...
}
---- ③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息:
HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
/*
** 这里不必编写任何代码!
**下行代码要注释掉
** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
*/
return m_brush; //返加绿色刷子
}
---- 方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):
---- 步骤①、②同上方法三中的步骤①、②。
---- 步骤③利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息)时则有些不同:
HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//在这加一条是否为对话框的判断语句
if(nCtlColor ==CTLCOLOR_DLG)
return m_brush; //返加绿色刷子
return hbr;
}
---- 编译并运行即可。
ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以
防止Windows擦除窗口。
//Paint area that needs to be erased.
BOOL CSampleView : : OnEraseBkgnd (CDC* pDC) BOOL CSampleView : : OnEraseBkgnd (CDC* pDC)
{
// Create a pruple brush.
CBrush Brush (RGB (128 , 0 , 128) );// Select the brush into the device context .
CBrush* pOldBrush = pDC—>SelcetObject (&brush);// Get the area that needs to be erased .
CRect reClip ;
pDC—>GetCilpBox (&rcClip);//Paint the area.
pDC—> PatBlt (rcClip.left , rcClip.top ,
rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY );//Unselect brush out of device context .
pDC—>SelectObject (pOldBrush );// Return nonzero to half fruther processing .
return TRUE;
}
CPaintDC dc;
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
BITMAP bm;
Bitmap.GetObject(sizeof(BITMAP),&bm);
CDC MemDC;
MemDC.CreateComatibleDC(NULL);
MemDC.SelectObject(&Bitmap);
dc->BitBlt(10,10,bm.bmWidth, bm,bmHeight,&MemDC,0,0,SRCCOPY);