📄 mainwindow.cpp
字号:
// 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 + -