解决方案 »
- 老问题:关于VS IDE源代码文件字符编码问题
- 最简单的Windows SDK CreateWindow()为空
- 在Group Box控件上添加的DataGrid和DataCombo控件,为什么运行时无法显示,该怎么办?
- WTL Docking Palette刷新问题,请用过的人指点下。
- 编译缺省工程时,报错“Could not generate command line for the 32-bit C/C++ Compiler for 80x86 tool.”
- 有谁知道我的电脑的容量分配图怎么个画法?
- 有问题,请大侠们帮一下忙!
- ◎◎超奇怪硬盘问题,有谁知道?◎◎
- help me,please!!!
- 请教高手,我又来送分拉
- 按钮的问题
- IE 下载管理器 IDownloadManager::Download 如何枚举和调用下载工具??
1,在xx.h文件里DECLARE_MESSAGE_MAP下面(其实哪儿都行我感觉)声明其函数:afx_msg void OnBnXX(),随便你写就行
2.在xx.cpp文件里
BEGIN_MESSAGE_MAP(CCanRunMainDlg, CBCGPDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
(就这地方写吧)ON_COMMAND(ID_XX(你的buttonID), &CCanRunMainDlg::OnBnXX)
END_MESSAGE_MAP()
3,然后呢写其实现函数就行了啊
xx.cpp文件里
void CMainFrame::OnBnxx()
{
//你要实现的代码
}应该没错吧?呵呵
{
//你要实现的代码
}
就这一步不会写,上面的已经全都实现了。你的意思是直接把话曲面的代码放进来就行?
{
// TODO: Add your specialized code here and/or call the base class
if(!(m_wndSplitter.CreateStatic(this, 1, 2) ) || !(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyDrawView), CSize(220,0), pContext) ) || !(m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(0,0), pContext) ) ) { return FALSE; } return TRUE;
}
初始化里是这个啊,这是拆分窗口用的啊,,,,我的第二个窗口类名是“CRightView”,我个人觉得应该在 “CRightView”和“void CMyDrawView::OnClickButton()”里写一些代码
CRightView::CRightView()
{
m_bIsInit = FALSE;
}CRightView::~CRightView()
{
}
BEGIN_MESSAGE_MAP(CRightView, CView)
//{{AFX_MSG_MAP(CRightView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()void CRightView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
///////////////////////////////////////////////////////////////////////
//获得视区的宽与高,用于设置OpenGL的视口
if(!m_bIsInit)
{
CRect rcClient;
GetClientRect(&rcClient);
GLsizei w = rcClient.Width(); //视区宽度
GLsizei h = rcClient.Height(); //视区高度 ///////////////////////////////////////////////////////////////////////
//初始化各种设置
wglMakeCurrent(pDC->m_hDC,m_hGLRC); //将绘图上下文绑定到设备上下文上
glClearColor(0.5,0.5,0.5,0.0); //设置背景色
glClearDepth(1.0f); //初始化深度
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //清空缓冲区
glEnable(GL_DEPTH_TEST); //开启深度测试
glShadeModel(GL_SMOOTH); //平滑阴影模式 ///////////////////////////////////////////////////////////////////////
//设置透视模式
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION); //选择投影矩阵
glLoadIdentity(); //重置投影矩阵
gluPerspective(60.0,(GLfloat)w/h,0.1,100.0); //设置投影方式及投影参数
glMatrixMode(GL_MODELVIEW); //选择模视矩阵
glLoadIdentity(); //重置模视矩阵 ///////////////////////////////////////////////////////////////////////
//设置光照(定义一个位于左上方的白色定位光源)
GLfloat lmodel_ambient[] = {1.0f,1.0f,1.0f,1.0f}; //定义环境光
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient); //设置环境光 GLfloat light0_ambient[] = {1.0,1.0,1.0,1.0}; //定义光源环境光
GLfloat light0_diffuse[] = {1.0,1.0,1.0,1.0}; //定义光源散射光
GLfloat light0_specular[] = {1.0,1.0,1.0,1.0}; //定义光源反射光
GLfloat light0_position[] = {15.0,15.0,15.0,10.0}; //定义光源位置
glLightfv(GL_LIGHT0,GL_AMBIENT,light0_ambient); //设置光源环境光
glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse); //设置光源散射光
glLightfv(GL_LIGHT0,GL_SPECULAR,light0_specular); //设置光源反射光
glLightfv(GL_LIGHT0,GL_POSITION,light0_position); //设置光源位置
glEnable(GL_LIGHT0); //启用光源 glEnable(GL_LIGHTING); //启用光照效果 ///////////////////////////绘制金字塔(正四棱锥)////////////////////////
///////////////////////////////////////////////////////////////////////
//定义黄铜材质
GLfloat brass_ambient[] = {0.329412f,0.223529f,0.027451f,1.0f}; //定义材质环境光
GLfloat brass_diffuse[] = {0.780392f,0.568627f,0.113725f,1.0f}; //定义材质散射光
GLfloat brass_specular[] = {0.992157f,0.941176f,0.807843f,1.0f}; //定义材质反射光
GLfloat brass_sinines[] = {100.0f}; //定义材质镜面反射强度
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,brass_ambient); //设置材质环境光
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,brass_diffuse); //设置材质散射光
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,brass_specular); //设置材质反射光
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,brass_sinines); //设置材质镜面反射强度 ///////////////////////////////////////////////////////////////////////
//设置坐标系统
glTranslatef(0.0f,-0.1f,-2.0f); //将坐标系统下移0.1,后移2.0
glRotatef(45,1.0,0.0,0.0); //将坐标系统绕x轴逆时针旋转45度
glRotatef(30,0.0,-1.0,0.0); //将坐标系统绕y轴顺时针旋转30度 ///////////////////////////////////////////////////////////////////////
//绘制金字塔
GLfloat pyramid[][3] = {{0.0,1.0,0.0},{0.5,0.0,0.5}, //定义顶点坐标
{-0.5,0.0,0.5},{-0.5,0.0,-0.5},{0.5,0.0,-0.5}}; glBegin(GL_TRIANGLE_FAN); //使用扇形三角形模式
glNormal3f(0.0,0.447214f,0.894427f); //前平面法向量
glVertex3fv(pyramid[0]); //前平面
glVertex3fv(pyramid[1]);
glVertex3fv(pyramid[2]);
glNormal3f(-0.894427f,0.447214f,0.0); //左平面法向量
glVertex3fv(pyramid[3]); //左平面
glNormal3f(0.0,0.447214f,-0.894427f); //后平面法向量
glVertex3fv(pyramid[4]); //后平面
glNormal3f(0.894427f,0.447214f,0.0); //右平面法向量
glVertex3fv(pyramid[1]); //右平面
glEnd(); //结束绘制 glFlush(); //强制输出
SwapBuffers(pDC->m_hDC); //交换缓冲区 wglMakeCurrent(pDC->m_hDC,NULL); //置绘图上下文为非当前状态,释放设备上下文 m_bIsInit = TRUE;
}
int style = ((CMyDrawApp*)AfxGetApp())->nStyle; switch(style)
{
case 1:
m_MyOpenDraw.OpenDraw1(0);//这里OpenDraw1(0)括号里的参数0是我自己乱加的,不加就报错,加CDC *pDC也报错,我随便写了个0就调试通过了,不知道怎么回事。
break;
case 2:
break;
}
}
上面这是右面窗口的显示代码。点击按钮要实现的视图代码如下:void CMyOpenDraw::OpenDraw1(CDC *pDC)
{
#define ustride 3 //u的跨度
#define uorder 6 //u的阶数
#define vstride (ustride * uorder) //v的跨度
#define vorder 5 //v的阶数
GLdouble points[vorder][uorder][ustride] = //定义顶点坐标(x,y,z)
{
{{-2.00f,0.4f,-1.00f},{-1.20f,0.3f,-1.00f},{-0.40f,0.4f,-1.00f},
{0.40f,-0.3f,-1.00f},{1.20f,0.0f,-1.00f},{2.00f,0.5f,-1.00f}}, {{-2.00f,0.1f,-0.60f},{-1.20f,0.0f,-0.60f},{-0.40f,0.5f,-0.60f},
{0.40f,0.0f,-0.60f},{1.20f,0.0f,-0.60f},{2.00f,0.0f,-0.60f}}, {{-2.00f,0.3f,-0.20f},{-1.20f,0.3f,-0.20f},{-0.40f,0.0f,-0.20f},
{0.40f,0.0f,-0.20f},{1.20f,0.0f,-0.20f},{2.00f,0.5f,-0.20f}}, {{-2.00f,0.1f,0.50f},{-1.20f,0.2f,0.20f},{-0.40f,0.0f,0.50f},
{0.40f,0.0f,0.20f},{1.20f,0.6f,0.60f},{2.00f,0.0f,0.40f}}, {{-2.00f,-0.5f,1.00f},{-1.20f,0.6f,1.00f},{-0.40f,0.0f,1.00f},
{0.40f,0.0f,1.00f},{1.20f,0.1f,1.00f},{2.00f,0.5f,1.00f}}
}; glMap2d( //定义顶点坐标求值器
GL_MAP2_VERTEX_3,
0,1,ustride,uorder,
0,1,vstride,vorder,
&points[0][0][0]
);
glEnable(GL_MAP2_VERTEX_3); //激活顶点坐标求值器 ///////////////////////////////////////////////////////////////////////
//绘制曲面
glPushMatrix(); //将当前模视矩阵压栈,防止当前变换影响原有的变换模式
glLoadIdentity(); //重置模视矩阵
glTranslatef(0.0f,-0.1f,-2.2f); //将坐标系统下移0.1,后移2.2
glRotatef(45,1.0,0.0,0.0); //将坐标系统绕x轴逆时针旋转45度
glMapGrid2f(20,0.0,1.0,20,0.0,1.0); //定义二维均布网格
glEvalMesh2(GL_FILL,0,20,0,20); //生成二维多边形网格 glDisable(GL_TEXTURE_2D); //禁用纹理映射
glPopMatrix(); //将模视矩阵出栈 glFlush(); //强制输出
SwapBuffers(pDC->m_hDC); //交换缓冲区 wglMakeCurrent(pDC->m_hDC,NULL); //置绘图上下文为非当前状态,释放设备上下文
}
在App类中定义
CMyDrawView * m_pMyDrawView
CRightView * m_pRightView
在分别在这两个类的初始化函数里指定
((CMyOpenGLApp*)AfxGetApp())->m_pMyDrawView=this;
((CMyOpenGLApp*)AfxGetApp())->m_pRightView=this;
这样就可以传递信息了。
比如画曲面,就传递参数1给ondraw函数,画立方体就传递参数2,等等。
ondraw函数里面,加个switch语句就可以判断了。