如何给对话框添加背景画面??还有BUTTON加背景位图,及背景颜色??请高手做答,做好有例子和代码!!谢谢!!! 问题如上,发到邮箱也行 [email protected] 谢谢咯~~我用的是 CFormView类 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CPaintDC dc(this) ;this.BitBlt()DrawItem(LPDRAWSTRUCT lpDrawStruct) 呵呵,原理的楼上的说的差不多,我给你发了一个BUTTON例子,和对话框背景图片的原理,你自己改改就行了, ON_WM_ERASEBKGND()//背景色方法2,这个要加到消息影射中 在OninitDialog下 m_bitmapBkgnd.LoadBitmap(IDB_BITMAP_BACK); GetClientRect( &m_rRect ); ///// BOOL CLockTxtProDlg::OnEraseBkgnd( CDC* pDC ) { CDC dc; dc.CreateCompatibleDC(pDC); CBitmap* pOldBitmap = dc.SelectObject(&m_bitmapBkgnd); pDC->BitBlt (m_rRect.left, m_rRect.top, m_rRect.Width(), m_rRect.Height(), &dc, 0, 0, SRCCOPY); dc.SelectObject(pOldBitmap); return FALSE; } 在离开时释放,如 OnClose()下。 m_bitmapBkgnd.DeleteObject(); 更改选项卡控件中选项卡的颜色十分简单,但要将属性表的颜色翻新则需要大量的工作,不下很大决心是做不到的。对于选项卡,基本思想是使控件成为所有者描述的控件,然后处理 WM_DRAWITEM。如果您使用 MFC,则可以重写虚函数 DrawItem。在 Microsoft Systems Journal1998 年 3 月发行的那一期中,我介绍了如何实现一个选项卡控件类 — CtabCtrlWithDisable,它支持禁用选项卡。作为禁用选项卡的一部分,当选项卡禁用时,CTabCtrlWithDisable 将选项卡的文本颜色变为浅灰色。本月,我从 CTabCtrlWithDisable 借用了一些代码,实现了一个新的类 — CcolorTablCtrl,它可以使您更改选项卡的颜色(请参见图 5)。要使用 CcolorTablCtrl,请在您的属性表中创建一个实例: class CMyPropSheet : public CPropertySheet {protected: CColorTabCtrl m_tabCtrl;};您必须在属性表的 OnInitDialog 处理程序中子类化选项卡控件(以便 MFC 可以使用它),然后将前景色和背景色设置成您喜欢的任何颜色: // in CMyPropSheet::OnInitDialog()HWND hWndTab = (HWND)SendMessage(PSM_GETTABCONTROL);m_tabCtrl.SubclassDlgItem(::GetDlgCtrlID(hWndTab), this);m_tabCtrl.SetColor(WHITE, RED);这里的 WHITE 和 RED 是标准的 COLORREF 值,即 RGB(255, 255, 255) 和 RGB(255,0,0)。一旦您实例化并初始化 CcolorTabCtrl,颜色选项卡控件就会完成剩下的工作(请参见图 6)。图 6 颜色选项卡控件CColorTabCtrl 重写了 SubclassDlgItem,它调用 ModifyStyle 来将风格更改为TCS_OWNERDRAWFIXED。进行重写的较好位置是在 PreSubclassWindow 中,因为不管控件是子类化还是通过 CreateWindow 创建都会调用这个函数(但由于杂志篇幅有限,我必须对代码进行压缩,因此我采用了这样的捷径)。注意,SubclassDlgItem 是一个简单的重写,而不是虚函数。为了设置颜色,SetColor 将颜色保存在两个成员变量 m_clrBackground 和 m_clrForeground 中。一旦风格设置为所有者描述的,每次需要 Windows? 绘制选项卡时,它都会发送 WM_DRAWITEM 消息。MFC 捕获这个消息并调用选项卡控件的虚函数 DrawItem,CColorTabCtrl 通过用新的颜色绘制文本来实现这个函数: // in CColorTabCtrl::DrawItemdc.FillSolidRect(rc, m_clrBackground);dc.SetBkColor(m_clrBackground);dc.SetTextColor(m_clrForeground);dc.DrawText(...);这些都非常简单,所以要了解具体实现请查看源代码。由于您可能不想只更改选项卡颜色而不更改页面颜色,所以我也实现了一个 CcolorPropertyPage,它可以让您将属性页的背景颜色改成匹配的颜色,如图 6 所示。对于属性表,更改背景颜色最简单的方式就是处理 WM_ERASEBKGND: BOOL CColorPropertyPage::OnEraseBkgnd(CDC* pDC){ CRect rc; GetClientRect(&rc); pDC->FillSolidRect(rc, m_clrBackground); return TRUE;}如果您自己试运行这段代码,您会发现有各种令人苦恼的问题。首先,如果您更改页面颜色,所有控件的背景色都会是错误的,所以还必须修正。对此,您必须处理 WM_CTLCOLOR 和 WM_ERASEBKGND。有关详细信息,可以参阅 1997 年 5 月一期中我的 MSJ 专栏。另一个问题是选项卡控件仍然使用系统 3D 颜色来绘制选项卡的边缘和圆角。唉!要修正这个问题,只能自己处理 WM_PAINT 并负责所有的绘图操作。包括画出选项卡在被选定时与其他选项卡的偏移,以便它以前景色显示。此时,您就要开始对选项卡控件进行一番彻底改造了。每个使用 Windows 的编程人员都知道,更改控件颜色无一例外都是很痛苦的事情,一旦您走上了这条路,要做的事情就似乎没有尽头了。相信很快标准颜色就会比它们原先的颜色漂亮许多,否则您会产生疑问,为什么不转为使用 .NET Framework,它要更改颜色只需简单地写成: ctl.BackColor = Color.Aquamarine; 如何给对话框添加背景画面:http://blog.csdn.net/scq2099yt/archive/2008/03/27/2223595.aspx1、把你的图包含到程序的“Bitmap资源”里,提示说该资源使用了大于256色的调色板,在VC里无法编辑等等,点确定就可以 2、定位到 void CXXXDlg::OnPaint(),在if()...else()中的else()下添加如下代码 else { //CDialog::OnPaint();//要禁止这个调用 CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP); //IDB_BITMAP是你自己的图对应的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); } BUTTON加背景位图,及背景颜色:http://blog.csdn.net/scq2099yt/archive/2008/03/28/2225220.aspx第一种:Button属性页里Style的Bitmap点上CBitmap Bitmap;Bitmap.LoadBitmap(IDB_BITMAP1);HBITMAP hBitmap=(HBITMAP)Bitmap.Detach();CButton *pButton=(CButton*)GetDlgItem(IDCANCEL);pButton->SetBitmap(hBitmap);感觉效果不是很好。因为图片不会自动拉伸。第二种:可以采用CButtonST控件,挺好用的,比MFC的那些封装好用。第三种:把button按钮属性设置为ower draw然后映射onDrawItem消息在ondraw函数内自己绘制就可以了void CUi6Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct){if(nIDCtl == IDC_HELLO_CFAN){//绘制按钮框架UINT uStyle = DFCS_BUTTONPUSH;//是否按下去了?if (lpDrawItemStruct->itemState & ODS_SELECTED)uStyle |= DFCS_PUSHED;CDC dc;dc.Attach(lpDrawItemStruct->hDC);dc.DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, uStyle);//输出文字dc.SelectObject(&m_Font);dc.SetTextColor(RGB(0, 0, 255));dc.SetBkMode(TRANSPARENT);CString sText;m_HelloCFan.GetWindowText(sText);dc.TextOut(lpDrawItemStruct->rcItem.left + 20, lpDrawItemStruct->rcItem.top + 20, sText);//是否得到焦点if(lpDrawItemStruct->itemState & ODS_FOCUS){//画虚框CRect rtFocus = lpDrawItemStruct->rcItem;rtFocus.DeflateRect(3, 3);dc.DrawFocusRect(&rtFocus);}return;}CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);}第四种: 1,按钮属性 Onwer Drew选上,按钮ID: IDC_BUTTON12,定义private变量:CBitmapButton m_button;3,在初始化里边m_button.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);//IDB_BITMAP1:平时;IDB_BITMAP2:按下m_button.SubclassDlgItem(IDC_BUTTON1, this);m_button.SizeToContent(); 对于这个问题,其实可以由几种不同的方法来实现,具体如下: 方法一:调用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(); 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;//返加绿色刷子 编译并运行即可。 关于如何改变对话框背景颜色的问题,可能还有很多种不同方法可以实现,笔者在这仅举出四种常见的方法。其中方法三的编程似乎有点不太规范,方法四则要比方法三正统些,笔者这样的对比举例是为了拓宽VC编程爱好者特别是初学者的编程思路,读者可以根据实际情况选用其中的一种。 用线程处理图像遇到的问题 writeFile readFile这样用有问题吗 问个关于字符串格式化输出后的问题 关于一个模版的问题。请指点 程序调试(在线等) 不知道有谁用过这个类没有? CMDITabs 能否直接从从_variant_t中取出字符串 创建对话框程序 请问COM是什么?COM编程是什么?ActiveX又是什么?有什么用? 哪里有最新的masm32下载?怎么MS主页上找不到? 关于启动画面 怎么样hook得到 邮件发送的寄件人和发件人的地址(不hook send函数)
this.BitBlt()
DrawItem(LPDRAWSTRUCT lpDrawStruct)
你自己改改就行了, ON_WM_ERASEBKGND()//背景色方法2,这个要加到消息影射中
m_bitmapBkgnd.LoadBitmap(IDB_BITMAP_BACK);
GetClientRect( &m_rRect );
/////
BOOL CLockTxtProDlg::OnEraseBkgnd( CDC* pDC )
{
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dc.SelectObject(&m_bitmapBkgnd);
pDC->BitBlt (m_rRect.left,
m_rRect.top,
m_rRect.Width(),
m_rRect.Height(),
&dc,
0, 0, SRCCOPY);
dc.SelectObject(pOldBitmap);
return FALSE;
}
在离开时释放,如
OnClose()下。
m_bitmapBkgnd.DeleteObject();
protected:
CColorTabCtrl m_tabCtrl;
};您必须在属性表的 OnInitDialog 处理程序中子类化选项卡控件(以便 MFC 可以使用它),然后将前景色和背景色设置成您喜欢的任何颜色: // in CMyPropSheet::OnInitDialog()
HWND hWndTab = (HWND)SendMessage(PSM_GETTABCONTROL);
m_tabCtrl.SubclassDlgItem(::GetDlgCtrlID(hWndTab), this);
m_tabCtrl.SetColor(WHITE, RED);这里的 WHITE 和 RED 是标准的 COLORREF 值,即 RGB(255, 255, 255) 和 RGB(255,0,0)。一旦您实例化并初始化 CcolorTabCtrl,颜色选项卡控件就会完成剩下的工作(请参见图 6)。图 6 颜色选项卡控件CColorTabCtrl 重写了 SubclassDlgItem,它调用 ModifyStyle 来将风格更改为TCS_OWNERDRAWFIXED。进行重写的较好位置是在 PreSubclassWindow 中,因为不管控件是子类化还是通过 CreateWindow 创建都会调用这个函数(但由于杂志篇幅有限,我必须对代码进行压缩,因此我采用了这样的捷径)。注意,SubclassDlgItem 是一个简单的重写,而不是虚函数。为了设置颜色,SetColor 将颜色保存在两个成员变量 m_clrBackground 和 m_clrForeground 中。一旦风格设置为所有者描述的,每次需要 Windows? 绘制选项卡时,它都会发送 WM_DRAWITEM 消息。MFC 捕获这个消息并调用选项卡控件的虚函数 DrawItem,CColorTabCtrl 通过用新的颜色绘制文本来实现这个函数: // in CColorTabCtrl::DrawItem
dc.FillSolidRect(rc, m_clrBackground);
dc.SetBkColor(m_clrBackground);
dc.SetTextColor(m_clrForeground);
dc.DrawText(...);这些都非常简单,所以要了解具体实现请查看源代码。由于您可能不想只更改选项卡颜色而不更改页面颜色,所以我也实现了一个 CcolorPropertyPage,它可以让您将属性页的背景颜色改成匹配的颜色,如图 6 所示。对于属性表,更改背景颜色最简单的方式就是处理 WM_ERASEBKGND: BOOL CColorPropertyPage::OnEraseBkgnd(CDC* pDC)
{
CRect rc;
GetClientRect(&rc);
pDC->FillSolidRect(rc, m_clrBackground);
return TRUE;
}如果您自己试运行这段代码,您会发现有各种令人苦恼的问题。首先,如果您更改页面颜色,所有控件的背景色都会是错误的,所以还必须修正。对此,您必须处理 WM_CTLCOLOR 和 WM_ERASEBKGND。有关详细信息,可以参阅 1997 年 5 月一期中我的 MSJ 专栏。另一个问题是选项卡控件仍然使用系统 3D 颜色来绘制选项卡的边缘和圆角。唉!要修正这个问题,只能自己处理 WM_PAINT 并负责所有的绘图操作。包括画出选项卡在被选定时与其他选项卡的偏移,以便它以前景色显示。此时,您就要开始对选项卡控件进行一番彻底改造了。每个使用 Windows 的编程人员都知道,更改控件颜色无一例外都是很痛苦的事情,一旦您走上了这条路,要做的事情就似乎没有尽头了。相信很快标准颜色就会比它们原先的颜色漂亮许多,否则您会产生疑问,为什么不转为使用 .NET Framework,它要更改颜色只需简单地写成: ctl.BackColor = Color.Aquamarine;
2、定位到 void CXXXDlg::OnPaint(),在if()...else()中的else()下添加如下代码
else
{
//CDialog::OnPaint();//要禁止这个调用
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP);
//IDB_BITMAP是你自己的图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
Button属性页里Style的Bitmap点上CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
HBITMAP hBitmap=(HBITMAP)Bitmap.Detach();
CButton *pButton=(CButton*)GetDlgItem(IDCANCEL);
pButton->SetBitmap(hBitmap);感觉效果不是很好。因为图片不会自动拉伸。第二种:
可以采用CButtonST控件,挺好用的,比MFC的那些封装好用。第三种:
把button按钮属性设置为ower draw
然后映射onDrawItem消息
在ondraw函数内自己绘制就可以了
void CUi6Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(nIDCtl == IDC_HELLO_CFAN)
{
//绘制按钮框架
UINT uStyle = DFCS_BUTTONPUSH;
//是否按下去了?
if (lpDrawItemStruct->itemState & ODS_SELECTED)
uStyle |= DFCS_PUSHED;
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
dc.DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, uStyle);
//输出文字
dc.SelectObject(&m_Font);
dc.SetTextColor(RGB(0, 0, 255));
dc.SetBkMode(TRANSPARENT);
CString sText;
m_HelloCFan.GetWindowText(sText);
dc.TextOut(lpDrawItemStruct->rcItem.left + 20, lpDrawItemStruct->rcItem.top + 20, sText);
//是否得到焦点
if(lpDrawItemStruct->itemState & ODS_FOCUS)
{
//画虚框
CRect rtFocus = lpDrawItemStruct->rcItem;
rtFocus.DeflateRect(3, 3);
dc.DrawFocusRect(&rtFocus);
}
return;
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}第四种:
1,按钮属性 Onwer Drew选上,按钮ID: IDC_BUTTON1
2,定义private变量:
CBitmapButton m_button;
3,在初始化里边
m_button.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);//IDB_BITMAP1:平时;IDB_BITMAP2:按下
m_button.SubclassDlgItem(IDC_BUTTON1, this);
m_button.SizeToContent();
方法一:调用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();
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;//返加绿色刷子
编译并运行即可。
关于如何改变对话框背景颜色的问题,可能还有很多种不同方法可以实现,笔者在这仅举出四种常见的方法。其中方法三的编程似乎有点不太规范,方法四则要比方法三正统些,笔者这样的对比举例是为了拓宽VC编程爱好者特别是初学者的编程思路,读者可以根据实际情况选用其中的一种。