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

📄 mainwindow.cpp

📁 CAD转换工具 CAD转换工具 CAD转换工具 CAD转换工具
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// MainWindow.cpp: implementation of the CMainWindow class.
//
//////////////////////////////////////////////////////////////////////

#include "MainWindow.h"
#include <memory.h>
#include "resource.h"
#include <stdio.h>
#include <math.h>

CMainWindow *MainWnd = NULL;
int CADProgress(BYTE);

//
//  Functions for the mouse position definition
//
void Ort(LPFPOINT point)
{
  float len = (float)sqrt(point->x*point->x + point->y*point->y + point->z*point->z);
  point->x = point->x / len;
  point->y = point->y / len;
  point->z = point->z / len;
}

void MoveToPosition(LPFPOINT point, const FPOINT pos, const int direction)
{  
  point->x = point->x + direction * pos.x;
  point->y = point->y + direction * pos.y;
  point->z = point->z + direction * pos.z;
}

//////////////////////////////////////////////////////////////////////
// Static members
//////////////////////////////////////////////////////////////////////
#ifndef CS_STATIC_DLL
    HINSTANCE CADDLL;
	CADLAYER CMainWindow::CADLayer;
	CADLAYERCOUNT CMainWindow::CADLayerCount;
	CADLAYERVISIBLE CMainWindow::CADLayerVisible;
	CADVISIBLE CMainWindow::CADVisible;	
	CLOSECAD CMainWindow::CloseCAD;
	CREATECAD CMainWindow::CreateCAD;
	CREATECADEX CMainWindow::CreateCADEx;
	CADLAYOUT CMainWindow::CADLayout;
	CADLAYOUTBOX CMainWindow::CADLayoutBox;
	CADLAYOUTNAME CMainWindow::CADLayoutName;
	CADLAYOUTSCOUNT CMainWindow::CADLayoutsCount;
	CADLAYOUTVISIBLE CMainWindow::CADLayoutVisible;
	CURRENTLAYOUTCAD CMainWindow::CurrentLayoutCAD;
	DEFAULTLAYOUTINDEX CMainWindow::DefaultLayoutIndex;
	DRAWCADEX CMainWindow::DrawCADEx;
	DRAWCADTODIB CMainWindow::DrawCADtoDIB;
	DRAWCADTOJPEG CMainWindow::DrawCADtoJpeg;
	GETBOXCAD CMainWindow::GetBoxCAD;
	GETCADBORDERTYPE CMainWindow::GetCADBorderType;
	GETCADBORDERSIZE CMainWindow::GetCADBorderSize;
	GETCADCOORDS CMainWindow::GetCADCoords;
	GETEXTENTSCAD CMainWindow::GetExtentsCAD;
	GETIS3DCAD CMainWindow::GetIs3dCAD;
	GETLASTERRORCAD CMainWindow::GetLastErrorCAD;
	GETNEARESTENTITY CMainWindow::GetNearestEntity;
	GETPOINTCAD CMainWindow::GetPointCAD;	
	SETCADBORDERTYPE CMainWindow::SetCADBorderType;
	SETCADBORDERSIZE CMainWindow::SetCADBorderSize;
	RESETDRAWINGBOXCAD CMainWindow::ResetDrawingBoxCAD;
	SETDEFAULTCOLOR CMainWindow::SetDefaultColor;
	SETDRAWINGBOXCAD CMainWindow::SetDrawingBoxCAD;
	SETNULLLINEWIDTHCAD CMainWindow::SetNullLineWidthCAD;
	SETPROCESSMESSAGESCAD CMainWindow::SetProcessMessagesCAD;
	SETPROGRESSPROC CMainWindow::SetProgressProc;
	SETROTATECAD CMainWindow::SetRotateCAD;	
	SETSHOWLINEWEIGHTCAD CMainWindow::SetShowLineWeightCAD;	
	STOPLOADING CMainWindow::StopLoading;
#endif

bool CMainWindow::IsAppChangingList;
HWND CMainWindow::hwndLayersDlg;
HWND CMainWindow::hwndPropertiesDlg;
HWND CMainWindow::hwndProgressDlg;
HWND CMainWindow::hwndPictureDlg;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMainWindow::CMainWindow(LPSTR szClassName, WNDPROC WndProc, HINSTANCE hInst,
                 HICON hIcon, HCURSOR hCursor, LPSTR lpszMenuName,
                 HBRUSH color, UINT style):
CWindow(szClassName, WndProc, hInst, hIcon, hCursor, lpszMenuName, color, style)
{	
	hInstance = hInst;
	hwndStatusBar = hwndToolBar = hwndComboBox = hwndLayersDlg = NULL;
	curWait = LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT));	
	int r = GetLastError();
	curHand = LoadCursor(hInstance, "HAND");
	curTarget = LoadCursor(hInstance, "TARGET");
	curDefault = hCursor;
	SetCursor(curDefault);
	ScaleRect.x = -1;
	fKoef = 1;
    colorBgrnd = RGB(255,255,255);
	oldPoint.x = 0;
	oldPoint.y = 0;
	offset.x = 0;
	offset.y = TOOLBAR_SIZE;
	nScale = 0;
	drag = false;
	bIsPocessing = false;
	DrwMode = 0;	
    brushBackground = WndClass.hbrBackground;	
	CADImage = 0;	
	optionsCAD.NullLineWidth = 0;
	optionsCAD.IsDrawingBox = false;
	optionsCAD.IsShowLineWeight = true;
	optionsCAD.IsNearestPointMode = false;
	iBorderType = 1;
	dBorderSize = 12.5;
    // Initialisation hyperlink controls for "About dialog" 
	WNDCLASSEX  wndclass;	      
	wndclass.cbSize        = sizeof (wndclass);
    wndclass.style         = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc   = ControlProc;
    wndclass.cbClsExtra    = 0;
    wndclass.cbWndExtra    = 0;
    wndclass.hInstance     = hInstance;
	wndclass.hIcon         = NULL;
    wndclass.hCursor       = LoadCursor(hInstance, "Hand");
    wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
    wndclass.lpszMenuName  = NULL;
    wndclass.lpszClassName = "HyperLink";
	wndclass.hIconSm       = NULL;
    RegisterClassEx (&wndclass);
	MainWnd = this;
#ifndef CS_STATIC_DLL 
	CADDLL = LoadLibrary("CADImage.dll");
	if (CADDLL!= NULL)
	{
		CADLayer = (CADLAYER) GetProcAddress(CADDLL, "CADLayer");
	    CADLayerCount = (CADLAYERCOUNT) GetProcAddress(CADDLL, "CADLayerCount");
	    CADLayerVisible = (CADLAYERVISIBLE) GetProcAddress(CADDLL, "CADLayerVisible");
	    CADVisible = (CADVISIBLE) GetProcAddress(CADDLL, "CADVisible");
		CreateCAD = (CREATECAD) GetProcAddress(CADDLL, "CreateCAD");
		CreateCADEx = (CREATECADEX) GetProcAddress(CADDLL, "CreateCADEx");
		CloseCAD  = (CLOSECAD)  GetProcAddress(CADDLL, "CloseCAD");
		CADLayout = (CADLAYOUT) GetProcAddress(CADDLL, "CADLayout");
		CADLayoutBox = (CADLAYOUTBOX) GetProcAddress(CADDLL, "CADLayoutBox");
		CADLayoutName = (CADLAYOUTNAME) GetProcAddress(CADDLL, "CADLayoutName");
		CADLayoutsCount = (CADLAYOUTSCOUNT) GetProcAddress(CADDLL, "CADLayoutsCount");
		CADLayoutVisible = (CADLAYOUTVISIBLE) GetProcAddress(CADDLL, "CADLayoutVisible");
		CurrentLayoutCAD = (CURRENTLAYOUTCAD) GetProcAddress(CADDLL, "CurrentLayoutCAD");
		DefaultLayoutIndex = (DEFAULTLAYOUTINDEX) GetProcAddress(CADDLL, "DefaultLayoutIndex");
		DrawCADEx = (DRAWCADEX) GetProcAddress(CADDLL, "DrawCADEx");
		DrawCADtoJpeg = (DRAWCADTOJPEG) GetProcAddress(CADDLL, "DrawCADtoJpeg");
		DrawCADtoDIB = (DRAWCADTODIB) GetProcAddress(CADDLL, "DrawCADtoDIB");
		GetBoxCAD = (GETBOXCAD) GetProcAddress(CADDLL, "GetBoxCAD");
		GetCADBorderType = (GETCADBORDERTYPE) GetProcAddress(CADDLL, "GetCADBorderType");
		GetCADBorderSize = (GETCADBORDERSIZE) GetProcAddress(CADDLL, "GetCADBorderSize");
		GetCADCoords = (GETCADCOORDS) GetProcAddress(CADDLL, "GetCADCoords");
        GetExtentsCAD = (GETEXTENTSCAD) GetProcAddress(CADDLL, "GetExtentsCAD");
		GetIs3dCAD = (GETIS3DCAD) GetProcAddress(CADDLL, "GetIs3dCAD");
		GetLastErrorCAD = (GETLASTERRORCAD) GetProcAddress(CADDLL, "GetLastErrorCAD");
		GetNearestEntity = (GETNEARESTENTITY) GetProcAddress(CADDLL, "GetNearestEntity");
		GetPointCAD = (GETPOINTCAD) GetProcAddress(CADDLL, "GetPointCAD");		
		ResetDrawingBoxCAD = (RESETDRAWINGBOXCAD) GetProcAddress(CADDLL, "ResetDrawingBoxCAD");                                    
		SetCADBorderType = (SETCADBORDERTYPE) GetProcAddress(CADDLL, "SetCADBorderType");
		SetCADBorderSize = (SETCADBORDERSIZE) GetProcAddress(CADDLL, "SetCADBorderSize");
		SetDefaultColor = (SETDEFAULTCOLOR) GetProcAddress(CADDLL, "SetDefaultColor");
		SetDrawingBoxCAD = (SETDRAWINGBOXCAD) GetProcAddress(CADDLL, "SetDrawingBoxCAD");
		SetNullLineWidthCAD = (SETNULLLINEWIDTHCAD) GetProcAddress(CADDLL, "SetNullLineWidthCAD");
		SetProcessMessagesCAD = (SETPROCESSMESSAGESCAD)  GetProcAddress(CADDLL, "SetProcessMessagesCAD");
		SetProgressProc = (SETPROGRESSPROC) GetProcAddress(CADDLL, "SetProgressProc");
		SetRotateCAD = (SETROTATECAD) GetProcAddress(CADDLL, "SetRotateCAD");
		SetShowLineWeightCAD = (SETSHOWLINEWEIGHTCAD)  GetProcAddress(CADDLL, "SetShowLineWeightCAD");
		StopLoading = (STOPLOADING)  GetProcAddress(CADDLL, "StopLoading");
		SetProgressProc((PROGRESSPROC)CADProgress);
	}
	else
	{
		CADLayer = NULL;
	    CADLayerCount = NULL;
	    CADLayerVisible = NULL;
	    CADVisible = NULL;				
		CloseCAD = NULL;
		CreateCAD = NULL;
		CreateCADEx = NULL;
		CADLayout = NULL;
		CADLayoutBox = NULL;
		CADLayoutName = NULL;
		CADLayoutsCount = NULL;
		CADLayoutVisible = NULL;
		CurrentLayoutCAD = NULL;
		DefaultLayoutIndex = NULL;
		DrawCADEx = NULL;
		DrawCADtoJpeg = NULL;
		DrawCADtoDIB = NULL;
		GetBoxCAD = NULL;
		GetCADBorderType = NULL;
		GetCADBorderSize = NULL;
		GetCADCoords = NULL;
		GetIs3dCAD = NULL;
		GetLastErrorCAD = NULL;
		GetNearestEntity = NULL;
		GetPointCAD = NULL;
		GetExtentsCAD = NULL;
		ResetDrawingBoxCAD = NULL;
		SetCADBorderType = NULL;
		SetCADBorderSize = NULL;
		SetDrawingBoxCAD = NULL;
		SetDefaultColor = NULL;
		SetNullLineWidthCAD = NULL;
        SetProcessMessagesCAD = NULL;
		SetRotateCAD = NULL;
		SetShowLineWeightCAD = NULL;
		StopLoading = NULL;
		MessageBox(0, "CADImage.dll not loaded!", "Error", 0);
	}    
#endif	
}

int CADProgress(BYTE PercentDone)
{
	char mes[ERR_MSG_LEN];
	char *done = "% done";
	char ProgressMsg[ERR_MSG_LEN] = "Load file... ";
	itoa(PercentDone, mes, 10);
	strcat(ProgressMsg, mes);
	strcat(ProgressMsg, done);
	MainWnd->SetTextToStatusBar(ProgressMsg);
	SendMessage(MainWnd->hwndProgressDlg, IDM_PROGRESS, (WPARAM)PercentDone, 0);
	return 0;
}

CMainWindow::~CMainWindow()
{
#ifndef CS_STATIC_DLL
	if (CADDLL)
		FreeLibrary(CADDLL);
#endif	
}

void CMainWindow::CloseImage()	
{
	CloseCAD(CADImage);
}

HGLOBAL CMainWindow::LoadFile(char * FileName)
{
	HFILE hFile = NULL;
	OFSTRUCT ofs;
	char buff[0x4000];
	DWORD szFile, BytesRead, TotalRead = 0;
	HGLOBAL Result = NULL;
	char *memlock;
	
	hFile = OpenFile(FileName, &ofs, OF_READ);
	if (hFile != NULL)
	{
		szFile = GetFileSize((HANDLE)hFile, &szFile);
		Result = GlobalAlloc(GMEM_MOVEABLE, szFile);
		if (Result != NULL)
		{
			memlock = (char *)GlobalLock(Result);
			do
			{
				ReadFile((HANDLE)hFile, (void *)buff, sizeof(buff), &BytesRead, NULL);
				CopyMemory((void *)memlock, (void *)buff, BytesRead);
				memlock+=BytesRead;
				TotalRead+=BytesRead;
			}
			while (TotalRead < szFile);
			GlobalUnlock(Result);
		}
		CloseHandle((HANDLE)hFile);
	}
	return Result;
}

void CMainWindow::Load(CADOPTIONS CADOpts)
{
	if (bIsPocessing)
	{
		MessageBox(hWnd, "The program is in progress. Please wait.", "Warning", MB_ICONINFORMATION);
		return;
	}
	char cErrorCode[ERR_MSG_LEN];
	//char CADProgressID[ERR_MSG_LEN];
	int nErrorCode;

#ifndef CS_STATIC_DLL
	if (!CADDLL) return;
#endif
	char file_name [255] = "";
	if (!this->GetFile (this->hWnd, file_name, 		
		"CAD files (dwg, dxf, rtl, spl, prn, gl2, hpgl2, hpgl, hp2, hp1, hp, plo, hpg, hg, hgl, plt, cgm, svg, svgz,)\0*.dwg;*.dxf;*.rtl;*.spl;*.prn;*.gl2;*.hpgl2;*.hpgl;*.hp2;*.hp1;*.hp;*.plo;*.hpg;*.hg;*.hgl;*.plt;*.cgm;*.svg;*.svgz;\0AutoCAD files (dwg, dxf)\0*.dwg;*.dxf;\0HPGL/2 files (rtl, spl, prn, gl2, hpgl2, hpgl, hp2, hp1, hp, plo, hpg, hg, hgl, plt)\0*.rtl;*.spl;*.prn;*.gl2;*.hpgl2;*.hpgl;*.hp2;*.hp1;*.hp;*.plo;*.hpg;*.hg;*.hgl;*.plt;\0Computer Graphics Metafile (cgm)\0*.cgm;\0Scalable Vector Graphics (svg, svgz)\0*.svg; *.svgz;\0All files (*.*)\0*.*\0", true))
		return;	
	if (CADImage)
		CloseCAD(CADImage);
	CADImage = 0;
    bRotated3D = false;
	bIsRotated = false;	
#ifndef CS_STATIC_DLL
	if (CADDLL)
#endif
	{			
		SetCursor(curWait);
		SetTextToStatusBar("Please wait...");
		for (int i=1; i<QUANTITY_OF_PARTS; ++i)
		  SetTextToStatusBar("", i);
        bIsPocessing = true;
		//itoa(CAD_PROGRESS, CADProgressID, 10);
		//CADImage = CreateCADEx(hWnd, file_name, CADProgressID);
		this->ShowProgressDlg(true);
		if (!CADOpts.IsLoadFromMemory)
			CADImage = CreateCAD(hWnd, file_name);
		else
		{
			HGLOBAL hMem;
			char FileExt[13];
			hMem = LoadFile(file_name);
			if (hMem != NULL) 
			{
				i = strlen(file_name);
				do {i--;}while (file_name[i] != '.');
				strcpy(FileExt, "memory");
				int j=6;
				do 
				{
					FileExt[j] = file_name[i];
					j++;
					i++;
				}while ((size_t)i < strlen(file_name));
				FileExt[j] = 0;
				CADImage = CreateCADEx(hWnd, (LPCSTR)hMem, FileExt);
				GlobalFree(hMem);
			}
		}
		this->ShowProgressDlg(false);
        bIsPocessing = false;
		nErrorCode = GetLastErrorCAD(cErrorCode, ERR_MSG_LEN);
		if (nErrorCode == 0)
		{
			SetCursor(curDefault);
			SetTextToStatusBar(file_name);
			FillLayersList();
			DoCreateComboBox(hInstance);					
			SetBorder();
			SetScale(100);
		}
		else
		{
			switch(nErrorCode)
			{			
			case 1006:
				MessageBox(hWnd, cErrorCode, "Error", MB_ICONERROR);
				SetTextToStatusBar("No file loaded");		
			default:
				break;
			}
		}
		SetOptionsCAD(CADOpts);
		RePaint();
	}
}

void CMainWindow::RecalculateExtents()
{
	oldPoint.x = 0;
	oldPoint.y = 0;
	offset.x = 0;
	offset.y = TOOLBAR_SIZE;
	GetExtentsCAD(CADImage, &frectExtentsCAD);
	//fAbsHeight = frectExtentsCAD.Points.Top - frectExtentsCAD.Points.Bottom;
	//fAbsWidth  = frectExtentsCAD.Points.Right - frectExtentsCAD.Points.Left;
	GetBoxCAD(CADImage, &fAbsWidth, &fAbsHeight);		
	fKoef = fAbsHeight / fAbsWidth;
	ScaleRect.x = -1;
}

void CMainWindow::Draw()
{
    if (bIsPocessing) 
		return;
	
	PAINTSTRUCT Paint;
	HDC hDC;		

	hDC = BeginPaint(hWnd, &Paint);	
	OldNearestPoint.x = -10;
	OldNearestPoint.y = -10;
	SetBgrndColor(colorBgrnd);

	if ((CADImage) 
#ifndef CS_STATIC_DLL
		&& 
		(DrawCADEx)
#endif
		)
	{		
        if (fAbsHeight > 0)// when loading the CAD file
		{		
			sgFloat scale = (sgFloat) nScale / 100.0;
			memset(&CADDraw, 0, sizeof(CADDRAW));
			GetClientRect(hWnd, &CADDraw.R);
			CADDraw.R.left = int(CADDraw.R.left  * scale) + offset.x;
			CADDraw.R.right = int(CADDraw.R.right * scale) + offset.x;
			CADDraw.R.top = int(CADDraw.R.top * scale) + offset.y;			
			CADDraw.R.bottom = int(CADDraw.R.top  + (CADDraw.R.right - CADDraw.R.left) * fKoef);						
			ScaleRect.x = fAbsWidth / (CADDraw.R.right - CADDraw.R.left);
			ScaleRect.y = fAbsHeight / (CADDraw.R.bottom - CADDraw.R.top);
			CADDraw.Size = sizeof(CADDRAW);			
			CADDraw.DrawMode = DrwMode;
			CADDraw.DC = hDC;
			
			DrawCADEx(CADImage, &CADDraw);			
		}		
	}
	EndPaint(hWnd, &Paint);	
}

void CMainWindow::LButtonDown(POINTS Point)
{
	if (CADImage) 
	{
		drag = true;
		oldPoint = Point;
		SetCursor(curHand);		
		SetCapture(hWnd);		
		RePaint();
	}
}

void CMainWindow::LButtonUp(POINTS Point)
{
	drag = false;
	SetCursor(curDefault);	
	ReleaseCapture();
}

void CMainWindow::MouseMove(POINTS Point)
{
	if (drag)
	{
		SetCursor(curHand);
		offset.x = offset.x + Point.x - oldPoint.x;
		offset.y = offset.y + Point.y - oldPoint.y; 
		oldPoint = Point;
		RePaint();
	}
	else if (CADImage) 
	{  
		SetCursor(curTarget);
		DoMousePosition(Point);		
	}
}


void CMainWindow::SetScale(int scale)
{
	HMENU hMenu;
	if ((nScale != scale) && (CADImage))
	{
		hMenu = GetMenu(hWnd);
		if (nScale)
			CheckMenuItem(hMenu, ID_SCALE + nScale, MF_BYCOMMAND | MF_UNCHECKED);
		nScale = scale;
		CheckMenuItem(hMenu, ID_SCALE + scale, MF_BYCOMMAND | MF_CHECKED);
		RePaint();
	}
}

void CMainWindow::SaveAs()
{
	CADDRAW CADDraw;	
    float AbsWidht, AbsHeight, scale;
	double Koef;		

	if ((!CADImage) 
#ifndef CS_STATIC_DLL
		|| (!CADDLL)
#endif
		) 
		return;		 
	char FileName [255] = "";
	
	if (!this->GetFile (this->hWnd, FileName, "JPEG image\0*.jpg", false))
		return;	
	memset(&CADDraw, 0, sizeof(CADDRAW));	
	CADDraw.Size = sizeof(CADDraw);
	scale = (float) nScale / 100;
	GetBoxCAD(CADImage, &AbsWidht, &AbsHeight);	
	GetClientRect(hWnd, &CADDraw.R);
    if (AbsHeight != -1)
	{    

⌨️ 快捷键说明

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