⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpcalsizedlg.cpp

📁 这是一个特殊的非球面光学透镜设计程序,可以进行VC++编程!
💻 CPP
字号:
// CPcalSizeDlg.cpp : implementation file
//

#include "stdafx.h"
#include "afxwin.h"
#include "Lens_Design.h"
#include "CPcalSizeDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCPcalSizeDlg dialog


CCPcalSizeDlg::CCPcalSizeDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCPcalSizeDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCPcalSizeDlg)
	m_CalSizeDx = 30.0;
	m_CalSizeDy = 20.0;
	m_CalSizeX = 512.0;
	m_CalSizeY = 384.0;
	m_NiheNx = 8;
	m_NiheNy = 6;
	m_Dr = 50.0;
	//}}AFX_DATA_INIT
}


void CCPcalSizeDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCPcalSizeDlg)
	DDX_Text(pDX, IDC_CalSizeDx, m_CalSizeDx);
	DDV_MinMaxDouble(pDX, m_CalSizeDx, 10., 40.);
	DDX_Text(pDX, IDC_CalSizeDy, m_CalSizeDy);
	DDV_MinMaxDouble(pDX, m_CalSizeDy, 5., 20.);
	DDX_Text(pDX, IDC_CalSizeX, m_CalSizeX);
	DDV_MinMaxDouble(pDX, m_CalSizeX, 100., 800.);
	DDX_Text(pDX, IDC_CalSizeY, m_CalSizeY);
	DDV_MinMaxDouble(pDX, m_CalSizeY, 100., 600.);
	DDX_Text(pDX, IDC_NiheNX, m_NiheNx);
	DDV_MinMaxInt(pDX, m_NiheNx, 0, 15);
	DDX_Text(pDX, IDC_NiheNY, m_NiheNy);
	DDV_MinMaxInt(pDX, m_NiheNy, 0, 15);
	DDX_Text(pDX, IDC_DR, m_Dr);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCPcalSizeDlg, CDialog)
	//{{AFX_MSG_MAP(CCPcalSizeDlg)
	ON_BN_CLICKED(IDC_TODRAW, OnTodraw)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCPcalSizeDlg message handlers
#include <math.h> 
void CCPcalSizeDlg::OnTodraw() 
{
	// TODO: Add your control notification handler code here
	int Col0,Row0;
	int DCol,DRow;
	int Col1,Col2,Row1,Row2;
	int m_Draw;
	double Ratex,Ratey;
    double Axs[600],Yai[600];
	int l,h,k,m,k1;
	int MM[15];
	double Kx0,Ky0,Kx,Ky,alpha,baita,dr;
	Col0=300,Row0=200,DCol=290,DRow=190,Ratex=0.75;Ratey=9.0/16.0;
	// TODO: Add your control notification handler code here
	int  ret=AfxMessageBox("Are you sure to Update data",MB_YESNO   );
	if(ret!=IDYES)
	{
		return;
	}
	UpdateData();
	CPaintDC dc(this); // device context for painting
	CWnd* pWnd = GetDlgItem(IDC_DRAWWINDOW);
	CDC* pCDC=pWnd->GetDC();
	pWnd->Invalidate();
	pWnd->UpdateWindow();
	m_Draw=1;
    CPen  newPen1(PS_DASHDOT,0,RGB(128,0,0));
      	  pCDC->SelectObject(&newPen1);
   // pCDC->MoveTo(0,0),pCDC->LineTo(600,400);
    pCDC->MoveTo(Col0,Row0),pCDC->LineTo(Col0-DCol,Row0);
   	pCDC->MoveTo(Col0,Row0),pCDC->LineTo(Col0,Row0-DRow);
   	pCDC->MoveTo(Col0,Row0),pCDC->LineTo(Col0+DCol,Row0);
   	pCDC->MoveTo(Col0,Row0),pCDC->LineTo(Col0,Row0+DRow);
   	CPen  newPen2(PS_SOLID,0,RGB(0,255,0));
      	  pCDC->SelectObject(&newPen2);
	Col1=int(m_CalSizeX*Ratex/2),Row1=int(m_CalSizeY*Ratey/2);
	Col2=int(m_CalSizeDx*Ratex),Row2=int(m_CalSizeDy*Ratey);
	pCDC->MoveTo(Col0-Col1,Row0-Row1);
	pCDC->LineTo(Col0-Col1,Row0+Row1);
	pCDC->LineTo(Col0+Col1,Row0+Row1);
	pCDC->LineTo(Col0+Col1,Row0-Row1);
	pCDC->LineTo(Col0-Col1,Row0-Row1);
	pCDC->MoveTo(Col0-Col1-Col2,Row0-Row1-Row2);
	pCDC->LineTo(Col0-Col1-Col2,Row0+Row1+Row2);
	pCDC->LineTo(Col0+Col1+Col2,Row0+Row1+Row2);
	pCDC->LineTo(Col0+Col1+Col2,Row0-Row1-Row2);
	pCDC->LineTo(Col0-Col1-Col2,Row0-Row1-Row2);
	CPen  newPen3(PS_SOLID,0,RGB(0,0,255));
      	  pCDC->SelectObject(&newPen3);
	pCDC->TextOut(Col0-Col1+Col2/2-60,Row0-Row1+Row2/2-60,"计算面");
	pCDC->MoveTo(Col0-Col1+Col2/2-30,Row0-Row1+Row2/2-45);
	pCDC->LineTo(Col0-Col1-Col2/2,Row0-Row1-Row2/2);
	pCDC->TextOut(Col0-Col1+Col2/2+60,Row0-Row1+Row2/2-60,"有效面");
	pCDC->MoveTo(Col0-Col1+Col2/2+90,Row0-Row1+Row2/2-45);
	pCDC->LineTo(Col0-Col1+Col2+110,Row0-Row1+Row2);
	CPen  newPen(PS_SOLID,0,RGB(128,0,0));
    //CBrush newBrush(RGB(255,0,255));//Brush with dignal pattern
	//pCDC->SelectObject(&newBrush);
	pCDC->SelectObject(&newPen);
	pCDC->SelectStockObject(NULL_BRUSH);
	//pCDC->Ellipse(100,100,300,300);
	MM[0]=6,MM[1]=6,MM[2]=6,MM[3]=7,MM[4]=6,MM[5]=5,MM[6]=5,MM[7]=5;
    MM[14]=6,MM[13]=6,MM[12]=6,MM[11]=7,MM[10]=6,MM[9]=5,MM[8]=5;
	m=0;
	Kx0=Col1*2.0;
	Ky0=Row1*2.0;

	dr=m_Dr*Ratex;
	Kx=Kx0,Ky=Ky0;
	for(l=0;l<2;l++)
	{	if(l==0)
		{Kx=Kx0/2.0,Ky=Ky0/2.0;}
		else
		{Kx=-Kx0/2.0,Ky=-Ky0/2.0;}
		for(h=0;h<14;h++)
		{	if(h<4)
			{
				alpha=Kx/sqrt((h*Ky/3)*(h*Ky/3)+Kx*Kx);
				baita=(h*Ky/3)/sqrt((h*Ky/3)*(h*Ky/3)+Kx*Kx);
			}
			if(h>=4 && h<=7)
			{
				alpha=((7-h)*Kx/4)/sqrt(((7-h)*Kx/4)*((7-h)*Kx/4)+Ky*Ky);
				baita=Ky/sqrt(((7-h)*Kx/4)*((7-h)*Kx/4)+Ky*Ky);
			}
			if(h>7 && h<11)
			{
				alpha=-((h-7)*Kx/4)/sqrt(((h-7)*Kx/4)*((h-7)*Kx/4)+Ky*Ky);
				baita=Ky/sqrt(((h-7)*Kx/4)*((h-7)*Kx/4)+Ky*Ky);
			}
			if(h>=11)
			{
				alpha=-Kx/sqrt(((14-h)*Ky/3)*((14-h)*Ky/3)+Kx*Kx);
				baita=((14-h)*Ky/3)/sqrt(((14-h)*Ky/3)*((14-h)*Ky/3)+Kx*Kx);
			}
			for(k=0;k<=MM[h];k++)
			{   m=m+1;
				if(k==MM[h])
				{
					if(h<4)
					{
						Axs[m]=Kx;
						Yai[m]=Kx*baita/alpha;
					    pCDC->MoveTo(Col0,Row0);
						pCDC->LineTo(int(Col0+Axs[m]),int(Row0+Yai[m]));
					
					}
					if(h>=4 && h<11)
					{
						Axs[m]=Ky*alpha/baita;
						Yai[m]=Ky;
			   		    pCDC->MoveTo(Col0,Row0);
						pCDC->LineTo(int(Col0+Axs[m]),int(Row0+Yai[m]));
			
					}
					if(h>=11)
					{
						Axs[m]=-Kx;
						Yai[m]=-Kx*baita/alpha;
			   		    pCDC->MoveTo(Col0,Row0);
						pCDC->LineTo(int(Col0+Axs[m]),int(Row0+Yai[m]));
			
					}
	    		}
				else
				{
					Axs[m]=k*dr*alpha;
					Yai[m]=k*dr*baita;
				}
			pCDC->Ellipse(int(Col0+Axs[m]-2.0),int(Row0+Yai[m]-2.0),int(Col0+Axs[m]+2.0),int(Row0+Yai[m]+2.0));
				k1=0;		        		
				
			}
		}
	}
    CPen  newPen4(PS_SOLID,0,RGB(0,0,128));
    pCDC->SelectObject(&newPen4);
	pCDC->SelectStockObject(NULL_BRUSH);
	for(l=0;l<7;l++)
	{
		pCDC->Ellipse(int(Col0-dr*l),int(Row0-dr*l),int(Col0+dr*l),int(Row0+dr*l));
	}
}

BOOL CCPcalSizeDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -