已经写好用兼容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拉这些理解的不透彻,所以导致使用中出错有朋友能指教吗?告诉我怎么才能在登陆界面中正确贴图,最好能帮我分析下出错原因

解决方案 »

  1.   

    if(ssdlg.DoModal()!=IDOK)   
    return   false;  
    此时对话框已被撤销,执行下面就会出错.
    CDC *pDC;
    ssdlg.OnBkgnd(pDC);重载对话框的OnPaint()
      

  2.   

    luohongming(lhm)说的对。
    LZ代码的逻辑有问题。
      

  3.   

    重载了OnPaint()。
    void CDlgLogin::OnPaint(CDC *pDC)
    {
       OnBkgnd(pDC);
    }
    结果没用,什么都没显示出来图片仍然没有。。
    对了,我想问下在任何地方创建CDC对象,都必须要进行初始化吗??直接创建就可以用了?
      

  4.   

    应该是OnBkgnd(pDC)函数中的代码有问题。
      

  5.   

    代码是这个BOOL CDlgLogin::OnBkgnd(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;
    }我开始是怀疑GetClientRect(&rect);这里是不是不适应对话框。。
    改成GetWindowRect(&rect);后还是不行
      

  6.   

    重载了OnPaint(),会有void CDlgLogin::OnPaint(CDC *pDC)?
      

  7.   

    那到底要怎么弄哦,我头都快晕了。。
    void CDlgLogin::OnPaint()
    {  
       CDC *pDC;
       OnBkgnd(pDC);
    }
    改成这样了也不行
    重载函数应该是可以改变其参数的吧。。
    谢谢小李飞刀,多次帮助过我
      

  8.   

    CDC *pDC = GetDC();
    OnBkgnd(pDC);另外,GetClientRect(&rect);可以的,GetWindowRect(&rect);肯定是错的你这样再试试
    CDC *pDC = GetDC();
    OnBkgnd(pDC);不能这样用:
    CDC *pDC;
    OnBkgnd(pDC);
      

  9.   

    CDC *pDC;
    OnBkgnd(pDC);
    你上面的pDC指针是野指针,不错才怪
    应该为CDC *pDC=GetDC();
      

  10.   

    void CDlgLogin::OnPaint()
    {
    CPaintDC dc(this); // device context for painting
             OnBkgnd(&dc);
    }
      

  11.   

    APP的InitInstance里加了如下语句:
        CDlgLogin ssdlg; 
        if(ssdlg.DoModal()!=IDOK)   
        return   false;  在登陆界面的子类CDlgLogin的OnPaint()中是如下语句:
    void CDlgLogin::OnPaint()
    {  
     CDC *pDC = GetDC();
       OnBkgnd(pDC);
    }
    改完了,没有报错,不过还是显示不出图片。是不是对话框上要打开什么属性才行啊?
    到底是怎么一回事呢,我先忘了告诉大家,我这个工程是基于对话框的,不是单文档。。这应该对显示图片没什么影响吧
      

  12.   

    将你的代码复制并运行,完全可以看到正确的绘制结果,对话框是自动生成,没有更改任何属性。是不是你制作的IDB_BITMAP1位图上的问题。
      

  13.   

    响应对话框的WM_ERASEBKGND消息
    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;}就可以了`~~~~~~~``
      

  14.   

    WM_ERASEBKGND消息对话框要在classwizard里的class info中的message filter:改成window才会有`
      

  15.   

    用由cxxxDlg自动生成的对话框用上面的代码确实是可以,但是我的登陆界面是另外创建的,并创建了cxxxDlg子类CDlgLogin,然后再重载函数OnPaint()写入代码就不行了。。
    你可以试试,就是新建一个对话框和对应的cxxxDlg子类,再试着重载OnPaint函数会发现代码突然失效了,不知道是怎么回事
      

  16.   

    再重载函数OnPaint()写入代码就不行了?怎么个不行法?
      

  17.   

    响应对话框的WM_ERASEBKGND消息
    BOOL CDlgLogin::OnEraseBkgnd(CDC* pDC) 这个确实能行谢谢了啊。。另外要是在对话框上的按钮上贴图要怎么办呢?
      

  18.   

    背景图像贴图要用到WM_ERASEBKGND消息
    且返回return TRUE ;一定不要使用WM_PAINT消息
      

  19.   

    在OnInitDialog()中添加如下代码:
    CBitmap Mybit;
    Mybit.LoadBitmap(IDB_**);//IDB_**是你的bitmap的ID
    m_bit.SetBitmap(Mybit.operator HBITMAP());  //m_bit是button的control变量