在OnDraw()中调用GetClientRect()为一个RECT结构赋值,结果得到的RECT为空
本来的目的是想在弹出的对话框中画图,发现刷新后没有图形后在OnDraw()中加入了重绘图形的代码,但是发现在刷新的时候还是没有图形,个人认为可能是因为从GetClientRect得到的RECT结构为空(RECT用来装载对话框的客户区,即其所在区域),但不知应该如何修改。请大虾们看看应该如何修改,或者如果原因不在于RECT为空,应该如何修改
代码如下:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
    CImage &img=pDoc->m_image ;
CRect r;
    r.left =0;r.top =0;
    r.right  =img.Width();
r.bottom =img.Height();
img.DrawToHDC(pDC->GetSafeHdc (),r);
extern color;
if(color!=0)
{

        
//if(viewdialog!=NULL)
        CRect picrect;
this->GetClientRect(&picrect);
PAINTSTRUCT pts;
CDC * cdc=BeginPaint(&pts);
HDC  hdc=cdc->GetSafeHdc ();
HBRUSH hbrush;
        HPEN hpen;
hpen=(HPEN)GetStockObject(BLACK_PEN);
    hbrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
SelectObject(hdc,hpen);
    SelectObject(hdc,hbrush);
Rectangle(hdc,picrect.left ,picrect.top ,picrect.right,picrect.bottom);
          ..............(以下代码省略)
注:color是用来判断对话框是否存在的标志,从目前的调试看来它是有效的,即没有显示图形不是color的原因
请大虾指教,多谢!

解决方案 »

  1.   

    本来的目的是想在弹出的对话框中画图,发现刷新后没有图形后在OnDraw()中加入了重绘图形的代码
    ==你这想法都有问题。在对话框中画图,你在视图类的OnDraw中加图形绘制程序干啥呢?
      

  2.   

    肯定不是你说的原因,
    你调用BeginPaint完后,要调用EndPaint(&ps);
    且不能在调用系统默认产生的CView::OnPaint(); 
      

  3.   

    修改后可以显示,但是位置不对,且部分被对话框挡住:
    void CMyView::OnDraw(CDC* pDC)
    {
    CMyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
        CImage &img=pDoc->m_image ;
    CRect r;
        r.left =0;r.top =0;
        r.right  =img.Width();
    r.bottom =img.Height();
    img.DrawToHDC(pDC->GetSafeHdc (),r);
    extern color;
    if(color!=0)
    {

            
    //if(viewdialog!=NULL)
            CRect picrect;
            viewdialog->GetWindowRect(&picrect);
    HWND hwnd=viewdialog->m_hWnd;
            HDC hdc = ::GetDC(hwnd);
            HBRUSH hbrush;
            HPEN hpen;
    hpen=(HPEN)GetStockObject(BLACK_PEN);
         hbrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
    SelectObject(hdc,hpen);
        SelectObject(hdc,hbrush);
    //ScreenToClient(&picrect);
    Rectangle(hdc,picrect.left,picrect.top,picrect.right,picrect.bottom);
    DeleteObject(hpen);
            DeleteObject(hbrush);
    ::ReleaseDC(m_hWnd, hdc);
    if(0)
    {
    IplImage * image= img.GetImage();
    CRect picrect;
    viewdialog->GetWindowRect(&picrect);

    //this->GetClientRect(&picrect);
    PAINTSTRUCT pts;
    CDC * cdc=BeginPaint(&pts);
    HDC  hdc=cdc->GetSafeHdc ();
      HBRUSH hbrush;
                HPEN hpen;
    HPEN hpe;
    HBRUSH hbr;
                hpen=(HPEN)GetStockObject(BLACK_PEN);
            hbrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
    hpe=(HPEN)GetStockObject(WHITE_PEN);
            hbr=(HBRUSH)GetStockObject(WHITE_BRUSH); 添加ScreenToClient(&picrect);
    则在指定的位置显示矩形,但是完全被对话框挡住
    猜想是因为m_hWnd的原因,但是
    将m_hWnd改为HWND hwnd=viewdialog->m_hWnd;
            HDC hdc = ::GetDC(hwnd);
    则根本不显示矩形
    继续等高手