MFC LineTo问题,画的一条线分成两截 如图所示,我的LineTo的代码如下:pDC->MoveTo(m_rcBottom.CenterPoint());pDC->LineTo(m_pIRBottom->m_rect.CenterPoint());是从红色大方框下的白色小方块,画到蓝色大方框的中点,不知道为什么中断了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 m_rcBottom.CenterPoint();m_pIRBottom->m_rect.CenterPoint();都应该是相对对话框的坐标 你调试一下呀。看是不是那个画线的语句执行了两次。一次怎么可能画出2条线。所以你一直调试到窗口初始化结束,看看到底执行了几次。还有可能窗口重绘时,又一次调用ONDRAW函数,两次线坐标不一样。看是不是这种可能。 pDC->MoveTo(m_rcBottom.CenterPoint());pDC->LineTo(m_pIRBottom->m_rect.CenterPoint());afxDump << m_rcBottom.CenterPoint() << " to " << m_pIRBottom->m_rect.CenterPoint(); pDC是不是对话框的DC?。对话框有没有“ClipChild”属性? 这是单文档框架的,是在view类中画的,刚试过了,去掉这个属性后是好了,不过窗口会闪,估计是画子窗口的原因吧,有没什么解决方法呢 子窗口是:class CControl : public CRectTracker, public CStatic实际上就是一个静态框,没有重写它的重绘过程。就是响应了view中的WM_CTLCOLOR,并返回一个有色的brush 子窗口是:class CControl : public CRectTracker, public CStatic双继承? Yes,想要能动态改变大小,所以就继承了CRectTracker 那么这2个类的ClientRect你是如何处理的,是CStatic的还是CRectTracher的。看看你的class CControl 定义。头文件(这个名与系统的重了吧) 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;}; 一下子看不出问题在哪里。看看:CRectTracker::OnChangedRect(const CRect& rectOld)不知道为什么搞这么复杂。 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的赋值,就不贴了 去哪里可以将子控件的Invalidate设置为false呢?那样就不用重绘了 "哪里可以将子控件的Invalidate设置为false呢?"其实Invalidate有个兄弟叫Validate你调用Validate那么参考就不会重绘了。 全局钩子捕获WM_NCLBUTTONUP消息问题 程序在xp下能正常运行,在2000没有反应,怎么办? 组件(com)的卸载和更新 高分请教高手一个难题:如何获取一个类成员函数被调用的位置?? 关于对话框数据传递的问题 我是菜鸟,请帮忙,进来看吧,送分题 一个关于Progress控件的问题 为什么我的view类的头文件中没有自动包含doc类的头文件? 怎么生成一个类,不需从其它类继承 程序图标问题 谁能帮忙解释一下为什么 求帮忙
m_pIRBottom->m_rect.CenterPoint();
都应该是相对对话框的坐标
pDC->LineTo(m_pIRBottom->m_rect.CenterPoint());afxDump << m_rcBottom.CenterPoint() << " to " << m_pIRBottom->m_rect.CenterPoint();
对话框有没有“ClipChild”属性?
实际上就是一个静态框,没有重写它的重绘过程。就是响应了view中的WM_CTLCOLOR,并返回一个有色的brush
双继承?
是CStatic的还是CRectTracher的。
看看你的class CControl 定义。头文件(这个名与系统的重了吧)
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;
};
看看:CRectTracker::OnChangedRect(const CRect& rectOld)
不知道为什么搞这么复杂。
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的赋值,就不贴了
其实Invalidate有个兄弟叫Validate你调用Validate那么参考就不会重绘了。