diff --git a/StraightLine/.vscode/launch.json b/StraightLine/.vscode/launch.json
new file mode 100644
index 0000000..850ce87
--- /dev/null
+++ b/StraightLine/.vscode/launch.json
@@ -0,0 +1,16 @@
+{
+ "configurations": [
+ {
+ "name": "Visual Studio: Start Debugging",
+ "type": "cppvsdbg",
+ "request": "launch",
+ "program": "${workspaceFolder}\\x64\\Debug\\${workspaceFolderBasename}.exe",
+ "stopAtEntry": false,
+ "cwd": "${workspaceFolder}",
+ "console": "integratedTerminal",
+ "preLaunchTask": "Visual Studio: Build Solution",
+ "internalConsoleOptions": "neverOpen"
+ }
+ ],
+ "version": "0.2.0"
+}
\ No newline at end of file
diff --git a/StraightLine/.vscode/settings.json b/StraightLine/.vscode/settings.json
new file mode 100644
index 0000000..d47ab15
--- /dev/null
+++ b/StraightLine/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "git.openRepositoryInParentFolders": "never"
+}
\ No newline at end of file
diff --git a/StraightLine/.vscode/tasks.json b/StraightLine/.vscode/tasks.json
new file mode 100644
index 0000000..6e0a647
--- /dev/null
+++ b/StraightLine/.vscode/tasks.json
@@ -0,0 +1,23 @@
+{
+ "tasks": [
+ {
+ "type": "shell",
+ "label": "Visual Studio: Build Solution",
+ "command": "msbuild",
+ "args": [
+ "${workspaceFolder}\\${workspaceFolderBasename}.sln",
+ "/p:Configuration=Debug",
+ "/p:Platform=x64"
+ ],
+ "options": {
+ "cwd": "${workspaceFolder}"
+ },
+ "problemMatcher": [
+ "$msCompile"
+ ],
+ "group": "build",
+ "detail": "Task generated by Debugger."
+ }
+ ],
+ "version": "2.0.0"
+}
\ No newline at end of file
diff --git a/StraightLine/StraightLine.sln b/StraightLine/StraightLine.sln
new file mode 100644
index 0000000..582b4ed
--- /dev/null
+++ b/StraightLine/StraightLine.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.11.35303.130
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StraightLine", "StraightLine\StraightLine.vcxproj", "{FDAC309B-67DC-4CD1-A242-9E04425745D1}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {FDAC309B-67DC-4CD1-A242-9E04425745D1}.Debug|x64.ActiveCfg = Debug|x64
+ {FDAC309B-67DC-4CD1-A242-9E04425745D1}.Debug|x64.Build.0 = Debug|x64
+ {FDAC309B-67DC-4CD1-A242-9E04425745D1}.Debug|x86.ActiveCfg = Debug|Win32
+ {FDAC309B-67DC-4CD1-A242-9E04425745D1}.Debug|x86.Build.0 = Debug|Win32
+ {FDAC309B-67DC-4CD1-A242-9E04425745D1}.Release|x64.ActiveCfg = Release|x64
+ {FDAC309B-67DC-4CD1-A242-9E04425745D1}.Release|x64.Build.0 = Release|x64
+ {FDAC309B-67DC-4CD1-A242-9E04425745D1}.Release|x86.ActiveCfg = Release|Win32
+ {FDAC309B-67DC-4CD1-A242-9E04425745D1}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {6641C81C-B090-4E08-B982-7F2D4543AC69}
+ EndGlobalSection
+EndGlobal
diff --git a/StraightLine/StraightLine/MainFrm.cpp b/StraightLine/StraightLine/MainFrm.cpp
new file mode 100644
index 0000000..ae0f288
--- /dev/null
+++ b/StraightLine/StraightLine/MainFrm.cpp
@@ -0,0 +1,96 @@
+
+// MainFrm.cpp : implementation of the CMainFrame class
+//
+
+#include "pch.h"
+#include "framework.h"
+#include "StraightLine.h"
+
+#include "MainFrm.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+// CMainFrame
+
+IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
+
+BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
+ ON_WM_CREATE()
+END_MESSAGE_MAP()
+
+static UINT indicators[] =
+{
+ ID_SEPARATOR, // status line indicator
+ ID_INDICATOR_CAPS,
+ ID_INDICATOR_NUM,
+ ID_INDICATOR_SCRL,
+};
+
+// CMainFrame construction/destruction
+
+CMainFrame::CMainFrame() noexcept
+{
+ // TODO: add member initialization code here
+}
+
+CMainFrame::~CMainFrame()
+{
+}
+
+int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+ if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
+ return -1;
+
+ if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
+ !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
+ {
+ TRACE0("Failed to create toolbar\n");
+ return -1; // fail to create
+ }
+
+ if (!m_wndStatusBar.Create(this))
+ {
+ TRACE0("Failed to create status bar\n");
+ return -1; // fail to create
+ }
+ m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
+
+ // TODO: Delete these three lines if you don't want the toolbar to be dockable
+ m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
+ EnableDocking(CBRS_ALIGN_ANY);
+ DockControlBar(&m_wndToolBar);
+
+
+ return 0;
+}
+
+BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
+{
+ if( !CFrameWnd::PreCreateWindow(cs) )
+ return FALSE;
+ // TODO: Modify the Window class or styles here by modifying
+ // the CREATESTRUCT cs
+
+ return TRUE;
+}
+
+// CMainFrame diagnostics
+
+#ifdef _DEBUG
+void CMainFrame::AssertValid() const
+{
+ CFrameWnd::AssertValid();
+}
+
+void CMainFrame::Dump(CDumpContext& dc) const
+{
+ CFrameWnd::Dump(dc);
+}
+#endif //_DEBUG
+
+
+// CMainFrame message handlers
+
diff --git a/StraightLine/StraightLine/MainFrm.h b/StraightLine/StraightLine/MainFrm.h
new file mode 100644
index 0000000..976d34b
--- /dev/null
+++ b/StraightLine/StraightLine/MainFrm.h
@@ -0,0 +1,43 @@
+
+// MainFrm.h : interface of the CMainFrame class
+//
+
+#pragma once
+
+class CMainFrame : public CFrameWnd
+{
+
+protected: // create from serialization only
+ CMainFrame() noexcept;
+ DECLARE_DYNCREATE(CMainFrame)
+
+// Attributes
+public:
+
+// Operations
+public:
+
+// Overrides
+public:
+ virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
+
+// Implementation
+public:
+ virtual ~CMainFrame();
+#ifdef _DEBUG
+ virtual void AssertValid() const;
+ virtual void Dump(CDumpContext& dc) const;
+#endif
+
+protected: // control bar embedded members
+ CToolBar m_wndToolBar;
+ CStatusBar m_wndStatusBar;
+
+// Generated message map functions
+protected:
+ afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+ DECLARE_MESSAGE_MAP()
+
+};
+
+
diff --git a/StraightLine/StraightLine/Resource.h b/StraightLine/StraightLine/Resource.h
new file mode 100644
index 0000000..5b27446
--- /dev/null
+++ b/StraightLine/StraightLine/Resource.h
@@ -0,0 +1,19 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by StraightLine.rc
+//
+#define IDD_ABOUTBOX 100
+#define IDP_OLE_INIT_FAILED 100
+#define IDR_MAINFRAME 128
+#define IDR_StraightLineTYPE 130
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 310
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 310
+#define _APS_NEXT_COMMAND_VALUE 32771
+#endif
+#endif
diff --git a/StraightLine/StraightLine/StraightLine.aps b/StraightLine/StraightLine/StraightLine.aps
new file mode 100644
index 0000000..c0c5c01
Binary files /dev/null and b/StraightLine/StraightLine/StraightLine.aps differ
diff --git a/StraightLine/StraightLine/StraightLine.cpp b/StraightLine/StraightLine/StraightLine.cpp
new file mode 100644
index 0000000..5de8b50
--- /dev/null
+++ b/StraightLine/StraightLine/StraightLine.cpp
@@ -0,0 +1,184 @@
+
+// StraightLine.cpp : Defines the class behaviors for the application.
+//
+
+#include "pch.h"
+#include "framework.h"
+#include "afxwinappex.h"
+#include "afxdialogex.h"
+#include "StraightLine.h"
+#include "MainFrm.h"
+
+#include "StraightLineDoc.h"
+#include "StraightLineView.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+
+// CStraightLineApp
+
+BEGIN_MESSAGE_MAP(CStraightLineApp, CWinApp)
+ ON_COMMAND(ID_APP_ABOUT, &CStraightLineApp::OnAppAbout)
+ // Standard file based document commands
+ ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
+ ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
+ // Standard print setup command
+ ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinApp::OnFilePrintSetup)
+END_MESSAGE_MAP()
+
+
+// CStraightLineApp construction
+
+CStraightLineApp::CStraightLineApp() noexcept
+{
+
+ // support Restart Manager
+ m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS;
+#ifdef _MANAGED
+ // If the application is built using Common Language Runtime support (/clr):
+ // 1) This additional setting is needed for Restart Manager support to work properly.
+ // 2) In your project, you must add a reference to System.Windows.Forms in order to build.
+ System::Windows::Forms::Application::SetUnhandledExceptionMode(System::Windows::Forms::UnhandledExceptionMode::ThrowException);
+#endif
+
+ // TODO: replace application ID string below with unique ID string; recommended
+ // format for string is CompanyName.ProductName.SubProduct.VersionInformation
+ SetAppID(_T("StraightLine.AppID.NoVersion"));
+
+ // TODO: add construction code here,
+ // Place all significant initialization in InitInstance
+}
+
+// The one and only CStraightLineApp object
+
+CStraightLineApp theApp;
+
+
+// CStraightLineApp initialization
+
+BOOL CStraightLineApp::InitInstance()
+{
+ // InitCommonControlsEx() is required on Windows XP if an application
+ // manifest specifies use of ComCtl32.dll version 6 or later to enable
+ // visual styles. Otherwise, any window creation will fail.
+ INITCOMMONCONTROLSEX InitCtrls;
+ InitCtrls.dwSize = sizeof(InitCtrls);
+ // Set this to include all the common control classes you want to use
+ // in your application.
+ InitCtrls.dwICC = ICC_WIN95_CLASSES;
+ InitCommonControlsEx(&InitCtrls);
+
+ CWinApp::InitInstance();
+
+
+ // Initialize OLE libraries
+ if (!AfxOleInit())
+ {
+ AfxMessageBox(IDP_OLE_INIT_FAILED);
+ return FALSE;
+ }
+
+ AfxEnableControlContainer();
+
+ EnableTaskbarInteraction(FALSE);
+
+ // AfxInitRichEdit2() is required to use RichEdit control
+ // AfxInitRichEdit2();
+
+ // Standard initialization
+ // If you are not using these features and wish to reduce the size
+ // of your final executable, you should remove from the following
+ // the specific initialization routines you do not need
+ // Change the registry key under which our settings are stored
+ // TODO: You should modify this string to be something appropriate
+ // such as the name of your company or organization
+ SetRegistryKey(_T("Local AppWizard-Generated Applications"));
+ LoadStdProfileSettings(4); // Load standard INI file options (including MRU)
+
+
+ // Register the application's document templates. Document templates
+ // serve as the connection between documents, frame windows and views
+ CSingleDocTemplate* pDocTemplate;
+ pDocTemplate = new CSingleDocTemplate(
+ IDR_MAINFRAME,
+ RUNTIME_CLASS(CStraightLineDoc),
+ RUNTIME_CLASS(CMainFrame), // main SDI frame window
+ RUNTIME_CLASS(CStraightLineView));
+ if (!pDocTemplate)
+ return FALSE;
+ AddDocTemplate(pDocTemplate);
+
+
+ // Parse command line for standard shell commands, DDE, file open
+ CCommandLineInfo cmdInfo;
+ ParseCommandLine(cmdInfo);
+
+
+
+ // Dispatch commands specified on the command line. Will return FALSE if
+ // app was launched with /RegServer, /Register, /Unregserver or /Unregister.
+ if (!ProcessShellCommand(cmdInfo))
+ return FALSE;
+
+ // The one and only window has been initialized, so show and update it
+ m_pMainWnd->ShowWindow(SW_SHOW);
+ m_pMainWnd->UpdateWindow();
+ return TRUE;
+}
+
+int CStraightLineApp::ExitInstance()
+{
+ //TODO: handle additional resources you may have added
+ AfxOleTerm(FALSE);
+
+ return CWinApp::ExitInstance();
+}
+
+// CStraightLineApp message handlers
+
+
+// CAboutDlg dialog used for App About
+
+class CAboutDlg : public CDialogEx
+{
+public:
+ CAboutDlg() noexcept;
+
+// Dialog Data
+#ifdef AFX_DESIGN_TIME
+ enum { IDD = IDD_ABOUTBOX };
+#endif
+
+protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
+
+// Implementation
+protected:
+ DECLARE_MESSAGE_MAP()
+};
+
+CAboutDlg::CAboutDlg() noexcept : CDialogEx(IDD_ABOUTBOX)
+{
+}
+
+void CAboutDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialogEx::DoDataExchange(pDX);
+}
+
+BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
+END_MESSAGE_MAP()
+
+// App command to run the dialog
+void CStraightLineApp::OnAppAbout()
+{
+ CAboutDlg aboutDlg;
+ aboutDlg.DoModal();
+}
+
+// CStraightLineApp message handlers
+
+
+
diff --git a/StraightLine/StraightLine/StraightLine.h b/StraightLine/StraightLine/StraightLine.h
new file mode 100644
index 0000000..c6746b1
--- /dev/null
+++ b/StraightLine/StraightLine/StraightLine.h
@@ -0,0 +1,33 @@
+
+// StraightLine.h : main header file for the StraightLine application
+//
+#pragma once
+
+#ifndef __AFXWIN_H__
+ #error "include 'pch.h' before including this file for PCH"
+#endif
+
+#include "resource.h" // main symbols
+
+
+// CStraightLineApp:
+// See StraightLine.cpp for the implementation of this class
+//
+
+class CStraightLineApp : public CWinApp
+{
+public:
+ CStraightLineApp() noexcept;
+
+
+// Overrides
+public:
+ virtual BOOL InitInstance();
+ virtual int ExitInstance();
+
+// Implementation
+ afx_msg void OnAppAbout();
+ DECLARE_MESSAGE_MAP()
+};
+
+extern CStraightLineApp theApp;
diff --git a/StraightLine/StraightLine/StraightLine.rc b/StraightLine/StraightLine/StraightLine.rc
new file mode 100644
index 0000000..202e13d
Binary files /dev/null and b/StraightLine/StraightLine/StraightLine.rc differ
diff --git a/StraightLine/StraightLine/StraightLine.vcxproj b/StraightLine/StraightLine/StraightLine.vcxproj
new file mode 100644
index 0000000..9b14de6
--- /dev/null
+++ b/StraightLine/StraightLine/StraightLine.vcxproj
@@ -0,0 +1,221 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 17.0
+ {FDAC309B-67DC-4CD1-A242-9E04425745D1}
+ MFCProj
+ StraightLine
+ 10.0
+
+
+
+ Application
+ true
+ v143
+ Unicode
+ Dynamic
+
+
+ Application
+ false
+ v143
+ true
+ Unicode
+ Dynamic
+
+
+ Application
+ true
+ v143
+ Unicode
+ Dynamic
+
+
+ Application
+ false
+ v143
+ true
+ Unicode
+ Dynamic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+ false
+
+
+
+ Use
+ Level3
+ true
+ _WINDOWS;_DEBUG;%(PreprocessorDefinitions)
+ pch.h
+
+
+ Windows
+
+
+ false
+ true
+ _DEBUG;%(PreprocessorDefinitions)
+
+
+ 0x0409
+ _DEBUG;%(PreprocessorDefinitions)
+ $(IntDir);%(AdditionalIncludeDirectories)
+
+
+
+
+ Use
+ Level3
+ true
+ WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)
+ pch.h
+
+
+ Windows
+
+
+ false
+ true
+ _DEBUG;%(PreprocessorDefinitions)
+
+
+ 0x0409
+ _DEBUG;%(PreprocessorDefinitions)
+ $(IntDir);%(AdditionalIncludeDirectories)
+
+
+
+
+ Use
+ Level3
+ true
+ true
+ true
+ WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)
+ pch.h
+
+
+ Windows
+ true
+ true
+
+
+ false
+ true
+ NDEBUG;%(PreprocessorDefinitions)
+
+
+ 0x0409
+ NDEBUG;%(PreprocessorDefinitions)
+ $(IntDir);%(AdditionalIncludeDirectories)
+
+
+
+
+ Use
+ Level3
+ true
+ true
+ true
+ _WINDOWS;NDEBUG;%(PreprocessorDefinitions)
+ pch.h
+
+
+ Windows
+ true
+ true
+
+
+ false
+ true
+ NDEBUG;%(PreprocessorDefinitions)
+
+
+ 0x0409
+ NDEBUG;%(PreprocessorDefinitions)
+ $(IntDir);%(AdditionalIncludeDirectories)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+ Create
+ Create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/StraightLine/StraightLine/StraightLine.vcxproj.filters b/StraightLine/StraightLine/StraightLine.vcxproj.filters
new file mode 100644
index 0000000..dfcf503
--- /dev/null
+++ b/StraightLine/StraightLine/StraightLine.vcxproj.filters
@@ -0,0 +1,81 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Resource Files
+
+
+
+
+ Resource Files
+
+
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+
\ No newline at end of file
diff --git a/StraightLine/StraightLine/StraightLine.vcxproj.user b/StraightLine/StraightLine/StraightLine.vcxproj.user
new file mode 100644
index 0000000..541a263
--- /dev/null
+++ b/StraightLine/StraightLine/StraightLine.vcxproj.user
@@ -0,0 +1,6 @@
+
+
+
+ StraightLine.rc
+
+
\ No newline at end of file
diff --git a/StraightLine/StraightLine/StraightLineDoc.cpp b/StraightLine/StraightLine/StraightLineDoc.cpp
new file mode 100644
index 0000000..7914321
--- /dev/null
+++ b/StraightLine/StraightLine/StraightLineDoc.cpp
@@ -0,0 +1,138 @@
+
+// StraightLineDoc.cpp : implementation of the CStraightLineDoc class
+//
+
+#include "pch.h"
+#include "framework.h"
+// SHARED_HANDLERS can be defined in an ATL project implementing preview, thumbnail
+// and search filter handlers and allows sharing of document code with that project.
+#ifndef SHARED_HANDLERS
+#include "StraightLine.h"
+#endif
+
+#include "StraightLineDoc.h"
+
+#include
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+// CStraightLineDoc
+
+IMPLEMENT_DYNCREATE(CStraightLineDoc, CDocument)
+
+BEGIN_MESSAGE_MAP(CStraightLineDoc, CDocument)
+END_MESSAGE_MAP()
+
+
+// CStraightLineDoc construction/destruction
+
+CStraightLineDoc::CStraightLineDoc() noexcept
+{
+ // TODO: add one-time construction code here
+
+}
+
+CStraightLineDoc::~CStraightLineDoc()
+{
+}
+
+BOOL CStraightLineDoc::OnNewDocument()
+{
+ if (!CDocument::OnNewDocument())
+ return FALSE;
+
+ // TODO: add reinitialization code here
+ // (SDI documents will reuse this document)
+
+ return TRUE;
+}
+
+
+
+
+// CStraightLineDoc serialization
+
+void CStraightLineDoc::Serialize(CArchive& ar)
+{
+ if (ar.IsStoring())
+ {
+ // TODO: add storing code here
+ }
+ else
+ {
+ // TODO: add loading code here
+ }
+}
+
+#ifdef SHARED_HANDLERS
+
+// Support for thumbnails
+void CStraightLineDoc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)
+{
+ // Modify this code to draw the document's data
+ dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));
+
+ CString strText = _T("TODO: implement thumbnail drawing here");
+ LOGFONT lf;
+
+ CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
+ pDefaultGUIFont->GetLogFont(&lf);
+ lf.lfHeight = 36;
+
+ CFont fontDraw;
+ fontDraw.CreateFontIndirect(&lf);
+
+ CFont* pOldFont = dc.SelectObject(&fontDraw);
+ dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);
+ dc.SelectObject(pOldFont);
+}
+
+// Support for Search Handlers
+void CStraightLineDoc::InitializeSearchContent()
+{
+ CString strSearchContent;
+ // Set search contents from document's data.
+ // The content parts should be separated by ";"
+
+ // For example: strSearchContent = _T("point;rectangle;circle;ole object;");
+ SetSearchContent(strSearchContent);
+}
+
+void CStraightLineDoc::SetSearchContent(const CString& value)
+{
+ if (value.IsEmpty())
+ {
+ RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);
+ }
+ else
+ {
+ CMFCFilterChunkValueImpl *pChunk = nullptr;
+ ATLTRY(pChunk = new CMFCFilterChunkValueImpl);
+ if (pChunk != nullptr)
+ {
+ pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);
+ SetChunkValue(pChunk);
+ }
+ }
+}
+
+#endif // SHARED_HANDLERS
+
+// CStraightLineDoc diagnostics
+
+#ifdef _DEBUG
+void CStraightLineDoc::AssertValid() const
+{
+ CDocument::AssertValid();
+}
+
+void CStraightLineDoc::Dump(CDumpContext& dc) const
+{
+ CDocument::Dump(dc);
+}
+#endif //_DEBUG
+
+
+// CStraightLineDoc commands
diff --git a/StraightLine/StraightLine/StraightLineDoc.h b/StraightLine/StraightLine/StraightLineDoc.h
new file mode 100644
index 0000000..6a9edcb
--- /dev/null
+++ b/StraightLine/StraightLine/StraightLineDoc.h
@@ -0,0 +1,48 @@
+
+// StraightLineDoc.h : interface of the CStraightLineDoc class
+//
+
+
+#pragma once
+
+
+class CStraightLineDoc : public CDocument
+{
+protected: // create from serialization only
+ CStraightLineDoc() noexcept;
+ DECLARE_DYNCREATE(CStraightLineDoc)
+
+// Attributes
+public:
+
+// Operations
+public:
+
+// Overrides
+public:
+ virtual BOOL OnNewDocument();
+ virtual void Serialize(CArchive& ar);
+#ifdef SHARED_HANDLERS
+ virtual void InitializeSearchContent();
+ virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
+#endif // SHARED_HANDLERS
+
+// Implementation
+public:
+ virtual ~CStraightLineDoc();
+#ifdef _DEBUG
+ virtual void AssertValid() const;
+ virtual void Dump(CDumpContext& dc) const;
+#endif
+
+protected:
+
+// Generated message map functions
+protected:
+ DECLARE_MESSAGE_MAP()
+
+#ifdef SHARED_HANDLERS
+ // Helper function that sets search content for a Search Handler
+ void SetSearchContent(const CString& value);
+#endif // SHARED_HANDLERS
+};
diff --git a/StraightLine/StraightLine/StraightLineView.cpp b/StraightLine/StraightLine/StraightLineView.cpp
new file mode 100644
index 0000000..588ce9b
--- /dev/null
+++ b/StraightLine/StraightLine/StraightLineView.cpp
@@ -0,0 +1,299 @@
+
+// StraightLineView.cpp : implementation of the CStraightLineView class
+//
+
+#include "pch.h"
+#include "framework.h"
+// SHARED_HANDLERS can be defined in an ATL project implementing preview, thumbnail
+// and search filter handlers and allows sharing of document code with that project.
+#ifndef SHARED_HANDLERS
+#include "StraightLine.h"
+#endif
+
+#include "StraightLineDoc.h"
+#include "StraightLineView.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+// CStraightLineView
+
+IMPLEMENT_DYNCREATE(CStraightLineView, CView)
+
+BEGIN_MESSAGE_MAP(CStraightLineView, CView)
+// Standard printing commands
+ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
+ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
+ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
+ON_WM_LBUTTONDOWN()
+ON_WM_MOUSEMOVE()
+ON_WM_LBUTTONUP()
+END_MESSAGE_MAP()
+
+// CStraightLineView construction/destruction
+
+CStraightLineView::CStraightLineView() noexcept {
+ // TODO: add construction code here
+ m_bDraw = FALSE;
+}
+
+CStraightLineView::~CStraightLineView() {
+}
+
+BOOL CStraightLineView::PreCreateWindow(CREATESTRUCT &cs) {
+ // TODO: Modify the Window class or styles here by modifying
+ // the CREATESTRUCT cs
+
+ return CView::PreCreateWindow(cs);
+}
+
+// CStraightLineView drawing
+
+void CStraightLineView::OnDraw(CDC *pDC) {
+ CStraightLineDoc *pDoc = GetDocument();
+ ASSERT_VALID(pDoc);
+ if (!pDoc)
+ return;
+
+ // 获取客户端矩形区域
+ GetClientRect(&m_rect);
+
+ // 创建内存设备上下文和兼容位图
+ CDC memDC;
+ memDC.CreateCompatibleDC(pDC);
+ CBitmap NewBitmap, *pOldBitmap;
+ NewBitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
+ pOldBitmap = memDC.SelectObject(&NewBitmap);
+
+ // 设置内存设备上下文的映射模式和视口
+ memDC.SetMapMode(MM_ANISOTROPIC);
+ memDC.SetWindowExt(m_rect.Width(), m_rect.Height());
+ memDC.SetViewportExt(m_rect.Width(), -m_rect.Height());
+ memDC.SetViewportOrg(m_rect.Width() / 2, m_rect.Height() / 2);
+ m_rect.OffsetRect(-m_rect.Width() / 2, -m_rect.Height() / 2);
+
+ // 填充背景颜色并绘制坐标轴
+ memDC.FillSolidRect(&m_rect, RGB(255, 255, 255));
+ memDC.MoveTo(-m_rect.Width() / 2, 0);
+ memDC.LineTo(m_rect.Width() / 2, 0);
+ memDC.LineTo(m_rect.Width() / 2 - 10, -5);
+ memDC.MoveTo(m_rect.Width() / 2, 0);
+ memDC.LineTo(m_rect.Width() / 2 - 10, 5);
+ memDC.MoveTo(0, -m_rect.Height() / 2);
+ memDC.LineTo(0, m_rect.Height() / 2);
+ memDC.LineTo(-5, m_rect.Height() / 2 - 10);
+ memDC.MoveTo(0, m_rect.Height() / 2);
+ memDC.LineTo(5, m_rect.Height() / 2 - 10);
+
+ // 绘制坐标轴标签
+ memDC.TextOutW(10, 25, _T("O"));
+ memDC.TextOutW(m_rect.Width() / 2 - 10, 25, _T("x"));
+ memDC.TextOutW(10, m_rect.Height() / 2, _T("y"));
+
+ // 调用Bresenham算法绘制直线
+ BresenhamLine(&memDC);
+
+ // 再次获取客户端矩形区域并设置设备上下文的映射模式和视口
+ pDC->SetMapMode(MM_ANISOTROPIC);
+ pDC->SetWindowExt(m_rect.Width(), m_rect.Height());
+ pDC->SetViewportExt(m_rect.Width(), -m_rect.Height());
+ pDC->SetViewportOrg(m_rect.Width() / 2, m_rect.Height() / 2);
+
+ // 将内存设备上下文中的位图拷贝到设备上下文中
+ pDC->BitBlt(-m_rect.Width() / 2, -m_rect.Height() / 2, m_rect.Width(), m_rect.Height(), &memDC, -m_rect.Width() / 2, -m_rect.Height() / 2, SRCCOPY);
+
+ // 恢复旧位图并删除对象
+ memDC.SelectObject(pOldBitmap);
+ NewBitmap.DeleteObject();
+ memDC.DeleteDC();
+}
+
+// CStraightLineView printing
+
+BOOL CStraightLineView::OnPreparePrinting(CPrintInfo *pInfo) {
+ // default preparation
+ return DoPreparePrinting(pInfo);
+}
+
+void CStraightLineView::OnBeginPrinting(CDC * /*pDC*/, CPrintInfo * /*pInfo*/) {
+ // TODO: add extra initialization before printing
+}
+
+void CStraightLineView::OnEndPrinting(CDC * /*pDC*/, CPrintInfo * /*pInfo*/) {
+ // TODO: add cleanup after printing
+}
+
+// CStraightLineView diagnostics
+
+#ifdef _DEBUG
+void CStraightLineView::AssertValid() const {
+ CView::AssertValid();
+}
+
+void CStraightLineView::Dump(CDumpContext &dc) const {
+ CView::Dump(dc);
+}
+
+CStraightLineDoc *CStraightLineView::GetDocument() const // non-debug version is inline
+{
+ ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CStraightLineDoc)));
+ return (CStraightLineDoc *)m_pDocument;
+}
+#endif //_DEBUG
+
+// CStraightLineView message handlers
+
+void CStraightLineView::BresenhamLine(CDC *pDC) {
+ // 定义起始颜色和结束颜色
+ COLORREF startColor = RGB(0, 82, 217);
+ COLORREF endColor = RGB(236, 189, 101);
+
+ // 获取起点和终点坐标
+ CPoint ptOrigin = m_ptOrigin, ptEnd = m_ptEnd, ptTemp;
+ LONG dx = ptEnd.x - ptOrigin.x, dy = ptEnd.y - ptOrigin.y;
+ int totalSteps = max(abs(dx), abs(dy));
+
+ // 定义颜色插值函数
+ auto interpolateColor = [](COLORREF start, COLORREF end, double factor) -> COLORREF {
+ BYTE r = static_cast(GetRValue(start) + factor * (GetRValue(end) - GetRValue(start)));
+ BYTE g = static_cast(GetGValue(start) + factor * (GetGValue(end) - GetGValue(start)));
+ BYTE b = static_cast(GetBValue(start) + factor * (GetBValue(end) - GetBValue(start)));
+ return RGB(r, g, b);
+ };
+
+ // 处理垂直线的情况
+ if (ptOrigin.x == ptEnd.x) {
+ if (ptOrigin.y > ptEnd.y) {
+ ptTemp = ptOrigin;
+ ptOrigin = ptEnd;
+ ptEnd = ptTemp;
+ }
+ for (int y = ptOrigin.y; y <= ptEnd.y; y++) {
+ double factor = (double)(y - ptOrigin.y) / totalSteps;
+ COLORREF color = interpolateColor(startColor, endColor, factor);
+ pDC->SetPixel(ptOrigin.x, y, color);
+ }
+ }
+ else {
+ // 计算斜率
+ DOUBLE k = (DOUBLE)dy / dx;
+ DOUBLE d;
+
+ // 处理斜率在[0, 1]之间的情况
+ if (k >= 0 && k <= 1) {
+ d = 0.5 - k;
+ if (ptOrigin.x > ptEnd.x) {
+ ptTemp = ptOrigin;
+ ptOrigin = ptEnd;
+ ptEnd = ptTemp;
+ }
+ for (ptTemp = ptOrigin; ptTemp.x <= ptEnd.x; ptTemp.x++) {
+ double factor = (double)(ptTemp.x - ptOrigin.x) / totalSteps;
+ COLORREF color = interpolateColor(startColor, endColor, factor);
+ pDC->SetPixel(ptTemp.x, ptTemp.y, color);
+ if (d < 0) {
+ d += 1 - k;
+ ptTemp.y++;
+ }
+ else {
+ d -= k;
+ }
+ }
+ }
+ // 处理斜率大于1的情况
+ else if (k > 1) {
+ d = 0.5 - 1 / k;
+ if (ptOrigin.y > ptEnd.y) {
+ ptTemp = ptOrigin;
+ ptOrigin = ptEnd;
+ ptEnd = ptTemp;
+ }
+ for (ptTemp = ptOrigin; ptTemp.y <= ptEnd.y; ptTemp.y++) {
+ double factor = (double)(ptTemp.y - ptOrigin.y) / totalSteps;
+ COLORREF color = interpolateColor(startColor, endColor, factor);
+ pDC->SetPixel(ptTemp.x, ptTemp.y, color);
+ if (d < 0) {
+ d += 1 - 1 / k;
+ ptTemp.x++;
+ }
+ else {
+ d -= 1 / k;
+ }
+ }
+ }
+ // 处理斜率在[-1, 0]之间的情况
+ else if (k < 0 && k >= -1) {
+ d = 0.5 + k;
+ if (ptOrigin.x > ptEnd.x) {
+ ptTemp = ptOrigin;
+ ptOrigin = ptEnd;
+ ptEnd = ptTemp;
+ }
+ for (ptTemp = ptOrigin; ptTemp.x <= ptEnd.x; ptTemp.x++) {
+ double factor = (double)(ptTemp.x - ptOrigin.x) / totalSteps;
+ COLORREF color = interpolateColor(startColor, endColor, factor);
+ pDC->SetPixel(ptTemp.x, ptTemp.y, color);
+ if (d < 0) {
+ d += 1 + k;
+ ptTemp.y--;
+ }
+ else {
+ d += k;
+ }
+ }
+ }
+ // 处理斜率小于-1的情况
+ else {
+ d = 0.5 + 1 / k;
+ if (ptOrigin.y < ptEnd.y) {
+ ptTemp = ptOrigin;
+ ptOrigin = ptEnd;
+ ptEnd = ptTemp;
+ }
+ for (ptTemp = ptOrigin; ptTemp.y >= ptEnd.y; ptTemp.y--) {
+ double factor = (double)(ptOrigin.y - ptTemp.y) / totalSteps;
+ COLORREF color = interpolateColor(startColor, endColor, factor);
+ pDC->SetPixel(ptTemp.x, ptTemp.y, color);
+ if (d < 0) {
+ d += 1 + 1 / k;
+ ptTemp.x++;
+ }
+ else {
+ d += 1 / k;
+ }
+ }
+ }
+ }
+}
+
+void CStraightLineView::OnLButtonDown(UINT nFlags, CPoint point) {
+ // 记录起点坐标并转换为视图坐标系
+ m_ptOrigin = CPoint(point.x - m_rect.Width() / 2, m_rect.Height() / 2 - point.y);
+ // 设置绘制标志为真
+ m_bDraw = TRUE;
+
+ CView::OnLButtonDown(nFlags, point);
+}
+
+void CStraightLineView::OnMouseMove(UINT nFlags, CPoint point) {
+ // 如果正在绘制,更新终点坐标并转换为视图坐标系
+ if (m_bDraw) {
+ m_ptEnd = CPoint(point.x - m_rect.Width() / 2, m_rect.Height() / 2 - point.y);
+ // 使视图无效以触发重绘
+ Invalidate(FALSE);
+ }
+
+ CView::OnMouseMove(nFlags, point);
+}
+
+void CStraightLineView::OnLButtonUp(UINT nFlags, CPoint point) {
+ // 设置绘制标志为假
+ m_bDraw = FALSE;
+ // 更新终点坐标并转换为视图坐标系
+ m_ptEnd = CPoint(point.x - m_rect.Width() / 2, m_rect.Height() / 2 - point.y);
+ // 使视图无效以触发重绘
+ Invalidate(FALSE);
+
+ CView::OnLButtonUp(nFlags, point);
+}
diff --git a/StraightLine/StraightLine/StraightLineView.h b/StraightLine/StraightLine/StraightLineView.h
new file mode 100644
index 0000000..4794322
--- /dev/null
+++ b/StraightLine/StraightLine/StraightLineView.h
@@ -0,0 +1,54 @@
+
+// StraightLineView.h : interface of the CStraightLineView class
+//
+
+#pragma once
+
+class CStraightLineView : public CView {
+protected: // create from serialization only
+ CStraightLineView() noexcept;
+ DECLARE_DYNCREATE(CStraightLineView)
+
+ // Attributes
+public:
+ CStraightLineDoc *GetDocument() const;
+
+ // Operations
+public:
+ // Overrides
+public:
+ virtual void OnDraw(CDC *pDC); // overridden to draw this view
+ virtual BOOL PreCreateWindow(CREATESTRUCT &cs);
+
+protected:
+ virtual BOOL OnPreparePrinting(CPrintInfo *pInfo);
+ virtual void OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo);
+ virtual void OnEndPrinting(CDC *pDC, CPrintInfo *pInfo);
+
+ // Implementation
+public:
+ virtual ~CStraightLineView();
+#ifdef _DEBUG
+ virtual void AssertValid() const;
+ virtual void Dump(CDumpContext &dc) const;
+#endif
+
+protected:
+ // Generated message map functions
+protected:
+ DECLARE_MESSAGE_MAP()
+private:
+ void BresenhamLine(CDC *pDC);
+ CRect m_rect;
+ CPoint m_ptOrigin, m_ptEnd;
+ BOOL m_bDraw;
+
+public:
+ afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
+ afx_msg void OnMouseMove(UINT nFlags, CPoint point);
+ afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
+};
+
+#ifndef _DEBUG // debug version in StraightLineView.cpp
+inline CStraightLineDoc *CStraightLineView::GetDocument() const { return reinterpret_cast(m_pDocument); }
+#endif
diff --git a/StraightLine/StraightLine/framework.h b/StraightLine/StraightLine/framework.h
new file mode 100644
index 0000000..36afc12
--- /dev/null
+++ b/StraightLine/StraightLine/framework.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#ifndef VC_EXTRALEAN
+#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
+#endif
+
+#include "targetver.h"
+
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
+
+// turns off MFC's hiding of some common and often safely ignored warning messages
+#define _AFX_ALL_WARNINGS
+
+#include // MFC core and standard components
+#include // MFC extensions
+
+
+#include // MFC Automation classes
+
+
+
+#ifndef _AFX_NO_OLE_SUPPORT
+#include // MFC support for Internet Explorer 4 Common Controls
+#endif
+#ifndef _AFX_NO_AFXCMN_SUPPORT
+#include // MFC support for Windows Common Controls
+#endif // _AFX_NO_AFXCMN_SUPPORT
+
+#include // MFC support for ribbons and control bars
+
+
+
+
+
+
+
+
+
+#ifdef _UNICODE
+#if defined _M_IX86
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#elif defined _M_X64
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#else
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#endif
+#endif
+
+
diff --git a/StraightLine/StraightLine/pch.cpp b/StraightLine/StraightLine/pch.cpp
new file mode 100644
index 0000000..64b7eef
--- /dev/null
+++ b/StraightLine/StraightLine/pch.cpp
@@ -0,0 +1,5 @@
+// pch.cpp: source file corresponding to the pre-compiled header
+
+#include "pch.h"
+
+// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
diff --git a/StraightLine/StraightLine/pch.h b/StraightLine/StraightLine/pch.h
new file mode 100644
index 0000000..885d5d6
--- /dev/null
+++ b/StraightLine/StraightLine/pch.h
@@ -0,0 +1,13 @@
+// pch.h: This is a precompiled header file.
+// Files listed below are compiled only once, improving build performance for future builds.
+// This also affects IntelliSense performance, including code completion and many code browsing features.
+// However, files listed here are ALL re-compiled if any one of them is updated between builds.
+// Do not add files here that you will be updating frequently as this negates the performance advantage.
+
+#ifndef PCH_H
+#define PCH_H
+
+// add headers that you want to pre-compile here
+#include "framework.h"
+
+#endif //PCH_H
diff --git a/StraightLine/StraightLine/res/StraightLine.ico b/StraightLine/StraightLine/res/StraightLine.ico
new file mode 100644
index 0000000..d56fbcd
Binary files /dev/null and b/StraightLine/StraightLine/res/StraightLine.ico differ
diff --git a/StraightLine/StraightLine/res/StraightLine.rc2 b/StraightLine/StraightLine/res/StraightLine.rc2
new file mode 100644
index 0000000..b7e2a3e
Binary files /dev/null and b/StraightLine/StraightLine/res/StraightLine.rc2 differ
diff --git a/StraightLine/StraightLine/res/StraightLineDoc.ico b/StraightLine/StraightLine/res/StraightLineDoc.ico
new file mode 100644
index 0000000..96365d4
Binary files /dev/null and b/StraightLine/StraightLine/res/StraightLineDoc.ico differ
diff --git a/StraightLine/StraightLine/res/Toolbar.bmp b/StraightLine/StraightLine/res/Toolbar.bmp
new file mode 100644
index 0000000..d501723
Binary files /dev/null and b/StraightLine/StraightLine/res/Toolbar.bmp differ
diff --git a/StraightLine/StraightLine/targetver.h b/StraightLine/StraightLine/targetver.h
new file mode 100644
index 0000000..87c0086
--- /dev/null
+++ b/StraightLine/StraightLine/targetver.h
@@ -0,0 +1,8 @@
+#pragma once
+
+// Including SDKDDKVer.h defines the highest available Windows platform.
+
+// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
+// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
+
+#include