急~!!在线等回答 MFC CStatic控件画图 10

我在DIALOG1中添加了CStatic控件,增加了DATASHOW这个类并关联起来,希望可以显示坐标轴和图形。datashow中添加了OnPaint()函数。当我把绘制... 我在DIALOG1中添加了CStatic控件,增加了DATASHOW这个类并关联起来,希望可以显示坐标轴和图形。datashow中添加了OnPaint()函数。当我把绘制坐标轴的代码放在datashow这个类的onpaint函数中没有图形显示,当放在对话框dialog1的onpaint时就可以显示坐标轴和函数图形。
初学MFC不知道哪里错误 希望指正。
下面是我的画坐标轴代码,不知道有没有影响。
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetDlgItem(IDC_SHOW)->GetClientRect(rect);
rect.Width();
rect.Height();
CWnd *pWnd = GetDlgItem(IDC_SHOW);
CDC* pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->Rectangle(0,0,nxLength,nyLength);
///////////////////////////////////////////////////////////////////
//初始化画笔和画图........
////////////////////////////////////////////////////////////////////
}
展开
 我来答
happylatch
2011-05-13 · 超过38用户采纳过TA的回答
知道小有建树答主
回答量:102
采纳率:0%
帮助的人:94.2万
展开全部
首先肯定你选择CStatic控件画图是个不错的想法。现实项目中很多图形都是在cstatic控件上绘制的,一般来说:需要从CStaitc类派生自己的类,同时映射Presubclasswindow以及onpaint等等。
目的是获取控件的实际大小,当我们拖一个cstatic控件放在对话框上,同时映射变量的话,则会发生DDX行为,导致我们映射的Presubclasswindow被调用。
给点代码参考下吧:
class CSamplePlate : public CStatic
{
// Construction
public:
CSamplePlate();

//反应杯坐标
//L Left
//B Bottom
//R Right
//T Top
struct RM
{
CPoint LB;
CPoint RB;
CPoint LT;
CPoint RT;
BOOL bDraw; //TRUE:画出四个坐标点表示的反应杯,FALSE:空缺+间隙

RM() { bDraw = TRUE;}
};

//反应杯外弧
struct RMArc
{
POINT ptInStart; //内弧起点
POINT ptInEnd; //内弧终点
POINT ptOutStart; //外弧起点
POINT ptOutEnd; //内弧终点
BOOL bDraw; //是否绘弧

RMArc() { bDraw = TRUE;}
};

// Attributes
public:
BOOL m_bSelect; //记录按钮样式的样本盘是否被按下
vector<SamplePos*> m_vInnerSmpPos;
vector<SamplePos*> m_vMidSmpPos;
vector<SamplePos*> m_vOutSmpPos;

private:
vector<RM> m_vRM; //反应杯坐标
vector<RMArc> m_vRMArc; //反应杯弧坐标 - 包拓内弧和外弧

CRect m_rectCtrl;
UINT m_nStyle; //反应杯类型:控件样式,按钮样式
double m_dRelCalc; //用于计算相对长度

double m_dRadius; //整个圆盘半径
double m_dSmallCircleRadius; //小圆半径
double m_dInnerRelRadius; //内圈相对半径
double m_dMidRelRadius; //中圈相对半径
double m_dOutRelRadius; //外圈相对半径
double m_dRelRMGupInR; //内弧半径
double m_dRelRMGupOutR; //外弧半径

CString m_strWTTFilePath; //WaitToTest.ini文件路径,用来初始化圆盘
。。。。。。。。。。。。。。。
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CSamplePlate();
void ReturnHeap(vector<SamplePos*>& vOper);

// Generated message map functions
protected:
//{{AFX_MSG(CSamplePlate)
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
-------------------------------------------------------------------------
void CSamplePlate::PreSubclassWindow()
{
m_strWTTFilePath = GetFilePath("WaitToTest.ini");

GetClientRect(&m_rectCtrl);
m_dRadius = m_rectCtrl.Width()/2;
m_dRelCalc = m_dRadius / FRAMER;

//每个小圆的相对半径
// m_dSmallCircleRadius = SMALLCIRCELRADIUS * m_dRadius / FRAMER;
m_dSmallCircleRadius = SMALLCIRCELRADIUS * m_dRadius / 106;

//初始化内圈、中圈、外圈各半径(精度要求高:double)
m_dInnerRelRadius = INNERRADIUS * m_dRelCalc; //内圈相对半径
m_dMidRelRadius = MIDRADIUS * m_dRelCalc; //中圈相对半径
m_dOutRelRadius = OUTRADIUS*m_dRelCalc; //外圈相对半径

m_dRelRMGupInR = RMGUPINR*m_dRelCalc; //内弧相对半径
m_dRelRMGupOutR = RMGUPOUTR*m_dRelCalc; //外弧相对半径

vector<SMPTYPE> vST;
GetPosType(vST);
sort(vST.begin(), vST.end()); //对vST数组内元素按位置索引升序排序
GetSamplePos(INNERCIRCLE, vST);
GetSamplePos(MIDCIRCLE, vST);
GetSamplePos(OUTCIRCLE, vST);
GetRMCoordinate(); //得到反应杯坐标

CWnd::PreSubclassWindow();
}
void CSamplePlate::OnPaint()
{
CPaintDC dc(this); // device context for painting

//若是控件样式的样本盘,则画白色背景
if (m_nStyle == SAMPLEPLATEST_ITEM)
dc.FillSolidRect(m_rectCtrl, RGB(255, 255, 255));

//若是按钮样式的样本盘,画按钮周边
if (m_nStyle == SAMPLEPLATEST_BTN)
{
dc.FillSolidRect(m_rectCtrl, RGB(236, 233, 216));//如果不重新刷新背景,CDlgMainMenu 按钮样式圆盘显示混乱
DrawOuterLine(&dc);
}
//画内、中、外三圈反应杯
DrawSmpPos(&dc, INNERCIRCLE, m_vInnerSmpPos);
DrawSmpPos(&dc, MIDCIRCLE, m_vMidSmpPos);
DrawSmpPos(&dc, OUTCIRCLE, m_vOutSmpPos);
‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’
}
追问
我想知道为什么在dialog1中可以实现显示 而在DATASHOW函数中不可以
微测检测5.10
2023-05-10 广告
您好!建议咨 深圳市微测检测有限公司,已建立起十余个专业实验室,企业通过微测检测就可以获得一站式的测试与认 证解决方案;(EMC、RF、MFi、BQB、QI、USB、安全、锂电池、快充、汽车电子EMC、汽车手机互 联、语音通话质量),认证遇... 点击进入详情页
本回答由微测检测5.10提供
qq564954180
2012-03-23
知道答主
回答量:13
采纳率:0%
帮助的人:4.9万
展开全部
看下CStatic的属性里面的Notify项是不是False,要改成True才能接受消息,vs2008默认的是False
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式