我创建了个基于对话框的工程,我的意思是要用一副位图替换原来的灰色对话框背景的,我通过在对话框的OnEraseBkgnd函数中增加类似如下的代码来实现
BOOL CTestBackgroundDlg::OnEraseBkgnd(CDC* pDC)
{
CRect objRect; GetClientRect(&objRect);
pDC->FillSolidRect(&objRect, RGB(0, 255, 0)); return TRUE; //CDialog::OnEraseBkgnd(pDC);
}
在一般情况下,对话框的背景的确显示成绿色了,达到了我的目的,但是如果有另外一个对话框在上面移动(稍微快点),结果就成了绿色/原来的灰色间隔的背景底图出现了,很奇怪.
BOOL CTestBackgroundDlg::OnEraseBkgnd(CDC* pDC)
{
CRect objRect; GetClientRect(&objRect);
pDC->FillSolidRect(&objRect, RGB(0, 255, 0)); return TRUE; //CDialog::OnEraseBkgnd(pDC);
}
在一般情况下,对话框的背景的确显示成绿色了,达到了我的目的,但是如果有另外一个对话框在上面移动(稍微快点),结果就成了绿色/原来的灰色间隔的背景底图出现了,很奇怪.
然后重载OnPaint在其中进行背景绘制
CDialogEx::SetBackgroundImage
Sets the background image of the dialog box.
void SetBackgroundImage(
HBITMAP hBitmap,
BackgroundLocation location=BACKGR_TILE,
BOOL bAutoDestroy=TRUE,
BOOL bRepaint=TRUE
);
BOOL SetBackgroundImage(
UINT uiBmpResId,
BackgroundLocation location=BACKGR_TILE,
BOOL bRepaint=TRUE
);
SetBackgroundColor 和SetBackgroundImage ,分别是设置背景颜色和背景图片。一个函数就可以搞定。例如,背景颜色,只要在对话框初始化函数OnInitDialog() 中添加以下代码就行了:
SetBackgroundColor(RGB(255,0,255));
没理由啊
我都是这么做的
你代码怎么写的
OnPaint里要用CPaintDC
如果你打算给对话框背景添加导入的位图,那么应该这样做:CTestBackgroundDlg::CTestBackgroundDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestBackgroundDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestBackgroundDlg)
//}}AFX_DATA_INIT
m_cBitmap.LoadBitmap(IDB_SKY);//IDB_SKY is your picture's ID
//CBitmap m_cBitmap is one member
}
// ADD the picture as dialog's background
BOOL CTestBackgroundDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rectbk;// 客户区的大小
CDC memDC;// 内存设备描述表
CBitmap* pOldMemBmp = NULL;
BITMAP stBitmap;
GetClientRect(&rectbk); // 得到窗口区域
//1.构造内存设备环境,并将位图装入
memDC.CreateCompatibleDC(pDC);
pOldMemBmp = memDC.SelectObject(&m_cBitmap);
//read the cBitmap's size
m_cBitmap.GetBitmap(&stBitmap);
int stBMPwidth = stBitmap.bmWidth;
int stBMPHeigth = stBitmap.bmHeight;
// 将背景位图复制到窗口客户区
pDC->StretchBlt(0, 0, rectbk.Width(), rectbk.Height(), &memDC, 0, 0,
stBMPwidth, stBMPHeigth, SRCCOPY);
// 绘图完成后的清理
memDC.SelectObject(pOldMemBmp); return TRUE;
}
你自己可以试试,用VC6.0创建一个基于对话框的程序,然后加上我上面说的代码,然后启动这个对话框程序,这时候对话框背景是绿色的是正确的,这时候如果你用另外一个程序(比如Notepad等等)在你的对话框上面移动移动,就会出现我给出图片的那个效果了,如果去掉Title Bar属性,就没这个问题. 建议你自己试试!
引用 10 楼 visualeleven 的回复:
App类的InitInstance()函数里直接SetDialogBkColor(RGB(0, 255, 0));不行吗 这样设置不满足我的要求,我本意是要把对话框背景用位图填充的,现在只是为了简化问题而已.
[/Quote
那就在OnPaint()里处理吧,贴图干什么都成,OnEraseBkgnd直接返回TRUE;
BOOL CCpDlg::OnEraseBkgnd(CDC *pDC)
{
pDC dc(this);
dc.SetBkMode(TRANSPARENT);
CRect rt;
GetClientRect(&rt);
CBrush cbSel;
cbSel.CreateSolidBrush(RGB(223, 233, 243));
dc.FillRect(&rt, &cbSel);
return TRUE;
}
HBRUSH Initvolum::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
//HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
HBRUSH hbr=::CreateSolidBrush(RGB(38,123,165));
return hbr;
}
然后重载OnPaint在其中进行背景绘制
特别是在OnPaint里面的实现
下面是我的实现
void CTestDialogPaintDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CDC memDC;
CBitmap bitmap, *pOldBitmap;
CRect rcClient;
GetClientRect(rcClient);
memDC.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
pOldBitmap = memDC.SelectObject(&bitmap);
memDC.FillRect(rcClient, &CBrush(RGB(0, 255, 0)));
dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap); }
}BOOL CTestDialogPaintDlg::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
我把代码上传了,在下面:
http://download.csdn.net/source/2343861
可以和系统配置有关……
我遇到的问题是GDI+的http://topic.csdn.net/u/20100510/09/a483f7a8-039f-4ac3-9b23-1603f36be7db.html