已经写好用兼容DC贴图的函数BOOL CDlgLogin::OnBkgnd(CDC *pDC)。。
登陆界面子类也建立好了为CDlgLogin,并在APP的initinstance中DoModal了一个实例,现在我想给这个登陆界面贴上背景图案,想使用OnBkgnd这个函数。。我是这样处理的:
CDlgLogin ssdlg;
if(ssdlg.DoModal()!=IDOK)
return false;
CDC *pDC;
ssdlg.OnBkgnd(pDC);
结果出错了
我试着在CDlgLogin类中响应OnInitDialog消息,
CDC *pDC;
OnBkgnd(pDC);
结果也出错了。。我知道自己是对DC拉,CDC拉这些理解的不透彻,所以导致使用中出错有朋友能指教吗?告诉我怎么才能在登陆界面中正确贴图,最好能帮我分析下出错原因
登陆界面子类也建立好了为CDlgLogin,并在APP的initinstance中DoModal了一个实例,现在我想给这个登陆界面贴上背景图案,想使用OnBkgnd这个函数。。我是这样处理的:
CDlgLogin ssdlg;
if(ssdlg.DoModal()!=IDOK)
return false;
CDC *pDC;
ssdlg.OnBkgnd(pDC);
结果出错了
我试着在CDlgLogin类中响应OnInitDialog消息,
CDC *pDC;
OnBkgnd(pDC);
结果也出错了。。我知道自己是对DC拉,CDC拉这些理解的不透彻,所以导致使用中出错有朋友能指教吗?告诉我怎么才能在登陆界面中正确贴图,最好能帮我分析下出错原因
return false;
此时对话框已被撤销,执行下面就会出错.
CDC *pDC;
ssdlg.OnBkgnd(pDC);重载对话框的OnPaint()
LZ代码的逻辑有问题。
void CDlgLogin::OnPaint(CDC *pDC)
{
OnBkgnd(pDC);
}
结果没用,什么都没显示出来图片仍然没有。。
对了,我想问下在任何地方创建CDC对象,都必须要进行初始化吗??直接创建就可以用了?
{
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);BITMAP bmp;
bitmap.GetBitmap(&bmp);CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);dcCompatible.SelectObject(&bitmap);CRect rect;
//GetClientRect(&rect);
GetWindowRect(&rect);pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,
0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return TRUE;
}我开始是怀疑GetClientRect(&rect);这里是不是不适应对话框。。
改成GetWindowRect(&rect);后还是不行
void CDlgLogin::OnPaint()
{
CDC *pDC;
OnBkgnd(pDC);
}
改成这样了也不行
重载函数应该是可以改变其参数的吧。。
谢谢小李飞刀,多次帮助过我
OnBkgnd(pDC);另外,GetClientRect(&rect);可以的,GetWindowRect(&rect);肯定是错的你这样再试试
CDC *pDC = GetDC();
OnBkgnd(pDC);不能这样用:
CDC *pDC;
OnBkgnd(pDC);
OnBkgnd(pDC);
你上面的pDC指针是野指针,不错才怪
应该为CDC *pDC=GetDC();
{
CPaintDC dc(this); // device context for painting
OnBkgnd(&dc);
}
CDlgLogin ssdlg;
if(ssdlg.DoModal()!=IDOK)
return false; 在登陆界面的子类CDlgLogin的OnPaint()中是如下语句:
void CDlgLogin::OnPaint()
{
CDC *pDC = GetDC();
OnBkgnd(pDC);
}
改完了,没有报错,不过还是显示不出图片。是不是对话框上要打开什么属性才行啊?
到底是怎么一回事呢,我先忘了告诉大家,我这个工程是基于对话框的,不是单文档。。这应该对显示图片没什么影响吧
BOOL CDlgLogin::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return CDialog::OnEraseBkgnd(pDC);
}
改成
BOOL CDlgLogin::OnEraseBkgnd(CDC* pDC)
{
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);BITMAP bmp;
bitmap.GetBitmap(&bmp);CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);dcCompatible.SelectObject(&bitmap);CRect rect;
//GetClientRect(&rect);
GetWindowRect(&rect);pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,
0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return TRUE;}就可以了`~~~~~~~``
你可以试试,就是新建一个对话框和对应的cxxxDlg子类,再试着重载OnPaint函数会发现代码突然失效了,不知道是怎么回事
BOOL CDlgLogin::OnEraseBkgnd(CDC* pDC) 这个确实能行谢谢了啊。。另外要是在对话框上的按钮上贴图要怎么办呢?
且返回return TRUE ;一定不要使用WM_PAINT消息
CBitmap Mybit;
Mybit.LoadBitmap(IDB_**);//IDB_**是你的bitmap的ID
m_bit.SetBitmap(Mybit.operator HBITMAP()); //m_bit是button的control变量