




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
利用OpenGL添加AutoCAD中的平移与缩放功能1、添加openGL库,同过在dialog中添加picture控件来悬挂openGL视窗,悬挂方式如下:cpp view plain copyBOOL CDemoSectionDlg:InitPic()/初始化openGL视窗 CWnd *wnd = GetDlgItem(IDC_RENDER);/IDC_RENDER为picture控件ID hrenderDC=:GetDC(wnd-m_hWnd); /hrenderDC为类成员变量HDC hrenderDC; /设备上下文 if(SetWindowPixelFormat(hrenderDC)=FALSE) return 0; if(CreateViewGLContext(hrenderDC)=FALSE) return 0; CRect rc; wnd-GetClientRect(&rc);/rc为控件的大小。 glViewport(0, 0, (GLsizei)(rc.Width(), (GLsizei)(rc.Height(); glMatrixMode(GL_PROJECTION); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); return TRUE; BOOL CDemoSectionDlg:CreateViewGLContext(HDC hDC) /创建view GL Context hrenderRC = wglCreateContext(hDC); /hrenderRC为类成员变量HGLRC hrenderRC; /渲染上下文 if(hrenderRC=NULL) return FALSE; if(wglMakeCurrent(hDC,hrenderRC)=FALSE) return FALSE; return TRUE; BOOL CDemoSectionDlg:SetWindowPixelFormat(HDC hDC) /设定像素格式 PIXELFORMATDESCRIPTOR pixelDesc; pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); pixelDesc.nVersion = 1; pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_TYPE_RGBA; pixelDesc.iPixelType = PFD_TYPE_RGBA; pixelDesc.cColorBits = 32; pixelDesc.cRedBits = 0; pixelDesc.cRedShift = 0; pixelDesc.cGreenBits = 0; pixelDesc.cGreenShift = 0; pixelDesc.cBlueBits = 0; pixelDesc.cBlueShift = 0; pixelDesc.cAlphaBits = 0; pixelDesc.cAlphaShift = 0; pixelDesc.cAccumBits = 0; pixelDesc.cAccumRedBits = 0; pixelDesc.cAccumGreenBits = 0; pixelDesc.cAccumBlueBits = 0; pixelDesc.cAccumAlphaBits = 0; pixelDesc.cDepthBits = 0; pixelDesc.cStencilBits = 1; pixelDesc.cAuxBuffers = 0; pixelDesc.iLayerType = PFD_MAIN_PLANE; pixelDesc.bReserved = 0; pixelDesc.dwLayerMask = 0; pixelDesc.dwVisibleMask = 0; pixelDesc.dwDamageMask = 0; PixelFormat = ChoosePixelFormat(hDC,&pixelDesc); if(PixelFormat=0) / Choose default PixelFormat = 1; if(DescribePixelFormat(hDC,PixelFormat, sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)=0) return FALSE; if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)=FALSE) return FALSE; return TRUE; 2、在视窗上画图,函数如下:cpp view plain copyvoid CDemoSectionDlg:RenderScene(double x,double y) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glScalef(ScralSize,ScralSize,0.0); xTimes = 1.4; yTimes = 0.9; xLength = 2*B01+2*B02+2*B03+B04;/H01,H02,H03,B01,B02等需要通过edit控件获取,表示各部分尺寸 yLength = H01+H02+H03; xRange = xTimes/xLength;/xLength通过相应尺寸计算出x向最大尺寸,xTimes为openGL绘图在x方向的放大倍数 yRange = yTimes/yLength;/yLength通过相应尺寸计算出y向最大尺寸,yTimes为openGL绘图在y方向的放大倍数 glTranslatef(x*1.0f,y*1.0f,0.0f); glTranslatef(-xTimes/2,yTimes/2,0); glColor3f(1.0f,1.0f,1.0f);/设置当前色为白色 glBegin(GL_LINE_LOOP); glVertex2f(0.0*xRange,0.0); glVertex2f(0.0*xRange,-H01*yRange); glVertex2f(B01*xRange,-(H01+H02)*yRange); glVertex2f(B01*xRange,-(H01+H02+H03)*yRange); glVertex2f(B01+B02+B03+B04+B03+B02)*xRange,-(H01+H02+H03)*yRange); glVertex2f(B01+B02+B03+B04+B03+B02)*xRange,-(H01+H02)*yRange); glVertex2f(B01+B02+B03+B04+B03+B02+B01)*xRange,-H01*yRange); glVertex2f(B01+B02+B03+B04+B03+B02+B01)*xRange,0.0*yRange); glEnd(); glBegin(GL_LINE_LOOP); glVertex2f(B01+B02)*xRange,-(H31+H11)*yRange); glVertex2f(B01+B02)*xRange,-(H01+H02+H03-H32-H12)*yRange); glVertex2f(B01+B02+B11)*xRange,-(H01+H02+H03-H32)*yRange); glVertex2f(B01+B02+B03-B12)*xRange,-(H01+H02+H03-H32)*yRange); glVertex2f(B01+B02+B03)*xRange,-(H01+H02+H03-H32-H22)*yRange); glVertex2f(B01+B02+B03)*xRange,-(H31+H21)*yRange); glVertex2f(B01+B02+B03-B22)*xRange,-H31*yRange); glVertex2f(B01+B02+B21)*xRange,-H31*yRange); glEnd(); glBegin(GL_LINE_LOOP); glVertex2f(B01+B02+B03+B04)*xRange,-(H31+H11)*yRange); glVertex2f(B01+B02+B03+B04)*xRange,-(H01+H02+H03-H32-H12)*yRange); glVertex2f(B01+B02+B03+B04+B11)*xRange,-(H01+H02+H03-H32)*yRange); glVertex2f(B01+B02+B03+B03+B04-B12)*xRange,-(H01+H02+H03-H32)*yRange); glVertex2f(B01+B02+B03+B03+B04)*xRange,-(H01+H02+H03-H32-H22)*yRange); glVertex2f(B01+B02+B03+B03+B04)*xRange,-(H31+H21)*yRange); glVertex2f(B01+B02+B03+B03+B04-B22)*xRange,-H31*yRange); glVertex2f(B01+B02+B03+B04+B21)*xRange,-H31*yRange); glEnd(); /竖向左标注/ glColor3f(1.0f,1.0f,0.0f);/设置当前色为黄色 DrawLine(CPoint(-HLineDist,0),CPoint(-HLineDist,-H01),0,1,1); DrawLine(CPoint(-HLineDist,-H01),CPoint(-HLineDist,-(H01+H02),0,1,1); DrawLine(CPoint(-HLineDist,-(H01+H02),CPoint(-HLineDist,-(H01+H02+H03),0,1,1); /横向下标注/ DrawLine(CPoint(0,-(H01+H02+H03+BLineDist),CPoint(B01,-(H01+H02+H03+BLineDist),0,1,1); DrawLine(CPoint(B01,-(H01+H02+H03+BLineDist),CPoint(B01+B02),-(H01+H02+H03+BLineDist),0,1,1); DrawLine(CPoint(B01+B02),-(H01+H02+H03+BLineDist),CPoint(B01+B02+B03),-(H01+H02+H03+BLineDist),0,1,1); DrawLine(CPoint(B01+B02+B03),-(H01+H02+H03+BLineDist),CPoint(B01+B02+B03+B04),-(H01+H02+H03+BLineDist),0,1,1); DrawLine(CPoint(B01+B02+B03+B04),-(H01+H02+H03+BLineDist),CPoint(B01+B02+B03+B04+B03),-(H01+H02+H03+BLineDist),0,1,1); DrawLine(CPoint(B01+B02+B03+B04+B03),-(H01+H02+H03+BLineDist),CPoint(B01+B02+B03+B04+B03+B02),-(H01+H02+H03+BLineDist),0,1,1); DrawLine(CPoint(B01+B02+B03+B04+B03+B02),-(H01+H02+H03+BLineDist),CPoint(B01+B02+B03+B04+B03+B02+B01),-(H01+H02+H03+BLineDist),0,1,1); /glRasterPos2f(0.5f, 0.0f); SelectFont(15, GB2312_CHARSET, Times New Roman); DrawCNString(HO1,-HTxtDist,-(H01/2+7); DrawCNString(HO2,-HTxtDist,-(H01+H02/2+7); DrawCNString(HO3,-HTxtDist,-(H01+H02+H03/2+7); DrawCNString(BO1,(B01/2-40),-BTxtDist); DrawCNString(BO2,(B01+B02/2-40),-BTxtDist); DrawCNString(BO3,(B01+B02+B03/2-40),-BTxtDist); DrawCNString(BO4,(B01+B02+B03+B04/2-40),-BTxtDist); DrawCNString(BO3,(B01+B02+B03+B04+B03/2-40),-BTxtDist); DrawCNString(BO2,(B01+B02+2*B03+B04+B02/2-40),-BTxtDist); DrawCNString(BO1,(B01+2*B02+2*B03+B04+B01/2-40),-BTxtDist); int B21 = 60,H11=25; DrawLine(CPoint(B01+B02+B03/2,0),CPoint(B01+B02+B03/2,-H11),0,1,1); DrawCNString(H11,B01+B02+B21,-(H11/2+7); SwapBuffers(hrenderDC); void CDemoSectionDlg:DrawCNString(const char* str,int x,int y) glColor3f(0.0f, 0.0f, 1.0f); int len, i; wchar_t* wstring; HDC hDC = wglGetCurrentDC(); GLuint list = glGenLists(1); glRasterPos2f(x*xRange,y*yRange); / 计算字符的个数 / 如果是双字节字符的(比如中文字符),两个字节才算一个字符 / 否则一个字节算一个字符 len = 0; for(i=0; stri!=0; +i) if( IsDBCSLeadByte(stri) ) +i; +len; / 将混合字符转化为宽字符 wstring = (wchar_t*)malloc(len+1) * sizeof(wchar_t); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len); wstringlen = L0; / 逐个输出字符 for(i=0; ilen; +i) wglUseFontBitmapsW(hDC, wstringi, 1, list); glCallList(list); / 回收所有临时资源 free(wstring); glDeleteLists(list, 1); glColor3f(1.0f, 1.0f, 0.0f); void CDemoSectionDlg:SelectFont(int size, int charset, const char* face) HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0, charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face); HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont); DeleteObject(hOldFont); void CDemoSectionDlg:DrawLine(CPoint nS,CPoint nE, BOOL IsAt,BOOL IsArrow,BOOL WithBorder) /该函数可以通过nS与nE定义带箭头标线的长度与位置来做标注,带有箭头,代码较多是因为添加了横向与竖向自动识别, /IsAt标识暂时没用,表示相对当前激活点划线还是相对坐标原点划线。 /IsArrow标识是否带箭头 /WithBorder标识是否带边界线 if(IsAt) glBegin(GL_LINES); glVertex2f(nS.x)*xRange,(nS.y)*yRange); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glEnd(); if(WithBorder&nE.x=0) glBegin(GL_LINES); glVertex2f(nS.x-25)*xRange,(nS.y)*yRange); glVertex2f(nS.x+25)*xRange,(nS.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x+nE.x-25)*xRange,(nS.y+nE.y)*yRange); glVertex2f(nS.x+nE.x+25)*xRange,(nS.y+nE.y)*yRange); glEnd(); if(WithBorder&nE.y=0) glBegin(GL_LINES); glVertex2f(nS.x)*xRange,(nS.y-25)*yRange); glVertex2f(nS.x)*xRange,(nS.y+25)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y-25)*yRange); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y+25)*yRange); glEnd(); if(IsArrow&(nE.x=0) /glVertex2f(nS.x)*xRange,(nS.y)*yRange); if(nE.y0) glBegin(GL_LINES); glVertex2f(nS.x+nE.x-6)*xRange,(nS.y+nE.y+18)*yRange); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glVertex2f(nS.x+nE.x+6)*xRange,(nS.y+nE.y+18)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x-6)*xRange,(nS.y-18)*yRange); glVertex2f(nS.x)*xRange,(nS.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x)*xRange,(nS.y)*yRange); glVertex2f(nS.x+6)*xRange,(nS.y-18)*yRange); glEnd(); else glBegin(GL_LINES); glVertex2f(nS.x+nE.x-6)*xRange,(nS.y+nE.y-18)*yRange); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glVertex2f(nS.x+nE.x+6)*xRange,(nS.y+nE.y-18)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x-6)*xRange,(nS.y+18)*yRange); glVertex2f(nS.x)*xRge,(nS.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x)*xRange,(nS.y)*yRange); glVertex2f(nS.x+6)*xRange,(nS.y+18)*yRange); glEnd(); if(IsArrow&(nE.y=0) /glVertex2f(nS.x)*xRange,(nS.y)*yRange); if(nE.x0) glBegin(GL_LINES); glVertex2f(nS.x+nE.x+18)*xRange,(nS.y+nE.y+6)*yRange); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glVertex2f(nS.x+nE.x+18)*xRange,(nS.y+nE.y-6)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x-18)*xRange,(nS.y+6)*yRange); glVertex2f(nS.x)*xRange,(nS.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x)*xRange,(nS.y)*yRange); glVertex2f(nS.x-18)*xRange,(nS.y-6)*yRange); glEnd(); else glBegin(GL_LINES); glVertex2f(nS.x+nE.x-18)*xRange,(nS.y+nE.y+6)*yRange); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glVertex2f(nS.x+nE.x-18)*xRange,(nS.y+nE.y-6)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x+18)*xRange,(nS.y+6)*yRange); glVertex2f(nS.x)*xRange,(nS.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nS.x)*xRange,(nS.y)*yRange); glVertex2f(nS.x+18)*xRange,(nS.y-6)*yRange); glEnd(); else /glVertex2f(nS.x)*xRange,(nS.y)*yRange); /glVertex2f(nS.x+nE.x)*xRange,(nS.y+nE.y)*yRange); glBegin(GL_LINES); glVertex2f(nS.x*xRange,nS.y*yRange); glVertex2f(nE.x*xRange,nE.y*yRange); glEnd(); if(WithBorder&(nE.x-nS.x=0) glBegin(GL_LINES); glVertex2f(nS.x-25)*xRange,(nS.y)*yRange); glVertex2f(nS.x+25)*xRange,(nS.y)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nE.x-25)*xRange,(nE.y)*yRange); glVertex2f(nE.x+25)*xRange,(nE.y)*yRange); glEnd(); if(WithBorder&(nE.y-nS.y=0) glBegin(GL_LINES); glVertex2f(nS.x)*xRange,(nS.y-25)*yRange); glVertex2f(nS.x)*xRange,(nS.y+25)*yRange); glEnd(); glBegin(GL_LINES); glVertex2f(nE.x)*xRange,(nE.y-25)*yRange); glVertex2f(nE.x)*xRange,(nE.y+25)*yRange); glEnd(); if(IsArrow&(nE.x-nS.x=0) /glVertex2f(nS.x)*xRange,(nS.y)*yRange); if(nE.y-nS.y0) glBegin(GL_LINES); glVertex2f(nE.x-6)*xRange,(nE.y+18)*yRange); glVertex2f(nE.x)*xRange,(nE.y)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加工玉米采购合同范本
- 园林用地建房合同范本
- 折弯加工合同范本
- 养殖保价合同范本
- 模拟赞助合同范本
- 家居建材购货合同(标准版)
- 养殖保险合同范文样本4篇
- 入驻单位安全培训方案课件
- 2024年内蒙古警察职业学院军训动员大会校长发言稿9000字
- 健身房知识类培训内容课件
- 2025浙江省知识产权研究与服务中心编外招聘12人考试备考试题及答案解析
- 2025年度东营市专业技术人员继续教育公需科目试卷及答案
- 用浪浪山正确打开开学第一课~课件
- 2025年幼儿园膳食工作计划
- 贵州省黔东南苗族侗族自治州2024-2025学年七年级下学期7月期末考试地理试卷含答案
- 2025年中国电信校招试题及答案
- 【课件】重生之我是学霸 2025-2026学年高二上英语开学第一课
- 锦绣中国课件教学
- 2025年内蒙古中考历史真题解读及答案讲解课件
- 自然保护区巡护监测员技能测试题库及答案
- 2025年中铁特货物流股份有限公司招聘笔试参考题库附带答案详解
评论
0/150
提交评论