如图所示,我的LineTo的代码如下:
pDC->MoveTo(m_rcBottom.CenterPoint());
pDC->LineTo(m_pIRBottom->m_rect.CenterPoint());
是从红色大方框下的白色小方块,画到蓝色大方框的中点,不知道为什么中断了

解决方案 »

  1.   

    m_rcBottom.CenterPoint();
    m_pIRBottom->m_rect.CenterPoint();
    都应该是相对对话框的坐标
      

  2.   

    你调试一下呀。看是不是那个画线的语句执行了两次。一次怎么可能画出2条线。所以你一直调试到窗口初始化结束,看看到底执行了几次。还有可能窗口重绘时,又一次调用ONDRAW函数,两次线坐标不一样。看是不是这种可能。
      

  3.   

    pDC->MoveTo(m_rcBottom.CenterPoint());
    pDC->LineTo(m_pIRBottom->m_rect.CenterPoint());afxDump << m_rcBottom.CenterPoint() << " to " << m_pIRBottom->m_rect.CenterPoint();
      

  4.   

    pDC是不是对话框的DC?。
    对话框有没有“ClipChild”属性?
      

  5.   

    这是单文档框架的,是在view类中画的,刚试过了,去掉这个属性后是好了,不过窗口会闪,估计是画子窗口的原因吧,有没什么解决方法呢
      

  6.   

    子窗口是:class CControl : public CRectTracker, public CStatic
    实际上就是一个静态框,没有重写它的重绘过程。就是响应了view中的WM_CTLCOLOR,并返回一个有色的brush
      

  7.   

    子窗口是:class CControl : public CRectTracker, public CStatic
    双继承?
      

  8.   

    Yes,想要能动态改变大小,所以就继承了CRectTracker
      

  9.   

    那么这2个类的ClientRect你是如何处理的,
    是CStatic的还是CRectTracher的。
    看看你的class CControl 定义。头文件(这个名与系统的重了吧)
      

  10.   


    class CControl : public CRectTracker, public CStatic
    {
    DECLARE_DYNAMIC(CControl)public:

    CControl(char *name, int style, bool acceptIR);
    virtual ~CControl();
        virtual void OnChangedRect(const CRect& rectOld);
        const char* getName() { return m_name.c_str(); }
        BOOL Create(CRect rc, CWnd* pParent);
        void updateRect(CRect &rc);
        bool isSelected() { return m_isSelected; }
        void setSelected(bool bSelected) { m_isSelected = bSelected; }
        int getStyle() { return m_style; }
        void setPos(CRect &rc);
        CRect* getRCLeft() { return &m_rcLeft; }
        CRect* getRCRight() { return &m_rcRight; }
        CRect* getRCTop() { return &m_rcTop; }
        CRect* getRCBottom() { return &m_rcBottom; }
        bool acceptIR() { return m_acceptIR; }
        CControl** getIRLinkByPoint(CPoint point);
        void drawIRLinks(CDC* pDC);
        void drawIRRects(CDC* pDC, CPoint& cursorPoint);
    private:
        void drawIRRect(CRect& rc,CDC* pDC, CPoint& cursorPoint);
    //virtual void fillProperty(CommonProperties& ComProp) = 0;
    protected:
    DECLARE_MESSAGE_MAP()private:
        int m_style;
        std::string m_name; 
        bool m_isSelected;
        CRect m_rcLeft;
        CRect m_rcRight;
        CRect m_rcTop;
        CRect m_rcBottom;
        CRect m_rcLeftTop;
        CRect m_rcRightTop;
        CRect m_rcLeftBottom;
        CRect m_rcRightBottom;
        bool m_acceptIR;
        CControl* m_pIRLeft;
        CControl* m_pIRRight;
        CControl* m_pIRTop;
        CControl* m_pIRBottom;    /* 对应每个控件的属性 */
        typedef std::map<std::string, std::string> AttrMap;
        typedef std::map<std::string, std::string>::iterator AttrMapIter;
    };
      

  11.   

    一下子看不出问题在哪里。
    看看:CRectTracker::OnChangedRect(const CRect& rectOld)
    不知道为什么搞这么复杂。
      

  12.   

        char buf[50];
        sprintf(buf, "X : %d, Y : %d, W : %d, H : %d", m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height());
        CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());
        pFrame->setStatusBarTips(buf);
        updateRect(m_rect);
        updateRect主要做一些CRect的赋值,就不贴了
      

  13.   

    去哪里可以将子控件的Invalidate设置为false呢?那样就不用重绘了
      

  14.   

    "哪里可以将子控件的Invalidate设置为false呢?"
    其实Invalidate有个兄弟叫Validate你调用Validate那么参考就不会重绘了。