error C2352: CTestView::SetLight : illegal call of non-static member function
时间: 2023-12-21 15:06:39 浏览: 133
这个错误通常发生在尝试在非静态成员函数中访问非静态成员变量时。如果您想在非静态成员函数中访问非静态成员变量,必须先创建该类的对象并使用该对象来调用该函数。
例如:
```cpp
class CTestView {
public:
void SetLight(int nLight) { m_nLight = nLight; }
private:
int m_nLight;
};
int main() {
CTestView view;
view.SetLight(1);
return 0;
}
```
如果您需要在静态成员函数中访问非静态成员变量,则必须先创建该类的对象并使用该对象来访问该变量。
例如:
```cpp
class CTestView {
public:
static void SetLight(int nLight) {
CTestView view;
view.m_nLight = nLight;
}
private:
int m_nLight;
};
int main() {
CTestView::SetLight(1);
return 0;
}
```
请注意,这里我们创建了一个新的CTestView对象来访问m_nLight变量。
相关问题
在CTestView::OnDraw函数中设置映射模式,画出坐标系
在 MFC 中,可以通过设置 CDC 对象的映射模式来进行坐标系的绘制。在 CTestView::OnDraw 函数中,可以按照以下步骤进行:
1. 获取 CDC 对象:
```
CDC* pDC = GetDC();
```
2. 设置映射模式为 MM_LOENGLISH:
```
pDC->SetMapMode(MM_LOENGLISH);
```
其中,MM_LOENGLISH 表示逻辑坐标的单位为 0.01 毫米。
3. 绘制坐标轴:
```
pDC->MoveTo(0, 0);
pDC->LineTo(1000, 0);
pDC->MoveTo(0, 0);
pDC->LineTo(0, 1000);
```
这段代码用于绘制 x 轴和 y 轴。
4. 绘制坐标轴上的刻度:
```
for (int i = 1; i < 1000; i += 10) {
pDC->MoveTo(i, 0);
pDC->LineTo(i, -100);
}
for (int i = 1; i < 1000; i += 10) {
pDC->MoveTo(0, i);
pDC->LineTo(-100, i);
}
```
这段代码用于在 x 轴和 y 轴上绘制刻度,每隔 10 个单位绘制一次。
5. 释放 CDC 对象:
```
ReleaseDC(pDC);
```
完整的代码如下:
```
void CTestView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
pDC = GetDC();
// 设置映射模式为 MM_LOENGLISH
pDC->SetMapMode(MM_LOENGLISH);
// 绘制坐标轴
pDC->MoveTo(0, 0);
pDC->LineTo(1000, 0);
pDC->MoveTo(0, 0);
pDC->LineTo(0, 1000);
// 绘制刻度
for (int i = 1; i < 1000; i += 10) {
pDC->MoveTo(i, 0);
pDC->LineTo(i, -100);
}
for (int i = 1; i < 1000; i += 10) {
pDC->MoveTo(0, i);
pDC->LineTo(-100, i);
}
// 释放 CDC 对象
ReleaseDC(pDC);
}
```
void CTestView::DrawPolygon(CDC *pDC,CLine *line)//绘制立方体线框模型 { for(int nFace=0;nFace<6;nFace++) { CP2 t; for(int nVertex=0;nVertex<F[nFace].vN;nVertex++)//顶点循环 { ObliqueProject(P[F[nFace].vI[nVertex]]);//斜等测投影 if(0==nVertex) { line->MoveTo(pDC,ScreenP.x,ScreenP.y); t=ScreenP; } else line->LineTo(pDC,ScreenP.x,ScreenP.y); } line->LineTo(pDC,t.x,t.y);//闭合多边形 } }改为三棱锥
void CTestView::DrawPyramid(CDC *pDC, CLine *line)//绘制三棱锥线框模型
{
for(int nFace = 0; nFace < 4; nFace++)
{
CP2 t;
for(int nVertex = 0; nVertex < P[nFace].vN; nVertex++)
{
ObliqueProject(P[nFace].vI[nVertex]);//斜等测投影
if(0 == nVertex)
{
line->MoveTo(pDC, ScreenP.x, ScreenP.y);
t = ScreenP;
}
else
{
line->LineTo(pDC, ScreenP.x, ScreenP.y);
}
}
line->LineTo(pDC, t.x, t.y);//闭合多边形
}
for(int nVertex = 0; nVertex < P[4].vN; nVertex++)//底面的顶点循环
{
ObliqueProject(P[4].vI[nVertex]);//斜等测投影
if(0 == nVertex)
{
line->MoveTo(pDC, ScreenP.x, ScreenP.y);
}
else
{
line->LineTo(pDC, ScreenP.x, ScreenP.y);
}
}
}
阅读全文