我想在一个对话框上动态画图,重载了该对话框的OnPaint事件,在其中写的代码如下:
void CTestDialog::OnPaint() 
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
CWnd* pWnd = GetDlgItem(IDD_DIALOG1);
CDC* pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
// Do not call CDialog::OnPaint() for painting messages
}
程序运行到CDC* pDC = pWnd->GetDC();这一句,就弹出一个应用程序错误:
“xxxxxx”指令引用的“xxxxxx”内存,该内存不能为“read”
要终止程序,单击“确定”
要调试程序,单击“取消”这是一个新建的工程,别的地方没有手动添加代码
大虾帮忙指点!!!

解决方案 »

  1.   

    察看有没有这个标识IDD_DIALOG1
      

  2.   

    你的DIALOG1对话框有没有创建呢?
    我是说显示出来。
    因为这句CWnd* pWnd = GetDlgItem(IDD_DIALOG1);
    如果你的DIALOG1对话框没有显示,他将得不到正确的指针。
    所以出错。
      

  3.   

    TO 楼上的:
    察看有没有这个标识IDD_DIALOG1
    如果没有这个根本不能顺利编译。
      

  4.   

    CWnd* pWnd = GetDlgItem(IDD_DIALOG1);
    这句话好像有问题,GetDlgItem是获取对话框内部控件的函数,你传给他的是对话框自身的资源ID.
    如果你想取得对话框的指针,this就是了。就算你取对了
    pWnd->Invalidate();
    pWnd->UpdateWindow();
    这又是干什么?你想引起死循环吗?
      

  5.   

    to  prettywolf:是不是在OnInitDialog要加一些东西?
    to  Carapee:程序我是从书上copy的,程序根本不能运行到pWnd->Invalidate();这一句
    大家继续指教
      

  6.   

    同意Carapee(山豆根) 的看法
     就是CWnd* pWnd = GetDlgItem(IDD_DIALOG1)的问题!
      

  7.   

    把CWnd* pWnd = GetDlgItem(IDD_DIALOG1);语句去掉
    然后将CDC* pDC = pWnd->GetDC();语句改为:
    CDC* pDC = this->GetDC();或
    CDC* pDC = GetDC();
    应该就可以了,先试一试吧,书上不一定都是对的,呵呵另:pWnd->UpdateWindow();语句应该也可以去掉
      

  8.   

    朋友们,DIALOG1未必是THIS。
    TO楼主,你可以在INITDIALOG中先显示这个对话框。
      

  9.   

    "CWnd* pWnd = GetDlgItem(IDD_DIALOG1);
    CDC* pDC = pWnd->GetDC();"CDC似乎用不着GetDlgItem(IDD_DIALOG1)返回吧
    CDC *hCDC = CWnd::GetDC();
    如此不就行了.要不这样:
    void Ccheck::OnPaint()
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here
    HWND hWnd = CyourDialog::GetSafeHwnd();//CyourDialog为你的IDD_DIALOG1所属的类
    CWnd* pWnd = CDialog::GetSafeOwner(CDialog::GetOwner(), &hWnd);
    CDC* pDC = pWnd->GetDC();
    pWnd->Invalidate();
    pWnd->UpdateWindow();
    // Do not call CDialog::OnPaint() for painting messages
    }
      

  10.   

    "CWnd* pWnd = GetDlgItem(IDD_DIALOG1);
    CDC* pDC = pWnd->GetDC();"CDC似乎用不着GetDlgItem(IDD_DIALOG1)返回吧
    CDC *hCDC = CWnd::GetDC();
    如此不就行了.要不这样:
    void CTestDialog::OnPaint()
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here
    HWND hWnd = CyourDialog::GetSafeHwnd();//CyourDialog为你的IDD_DIALOG1所属的类
    CWnd* pWnd = CDialog::GetSafeOwner(CDialog::GetOwner(), &hWnd);
    CDC* pDC = pWnd->GetDC();
    pWnd->Invalidate();
    pWnd->UpdateWindow();
    // Do not call CDialog::OnPaint() for painting messages
    }
    不好意思,笔误.^_^