--- /dev/null
+/////////////////////////////////////////////////\r
+// Mainfrm.cpp\r
+\r
+#include "stdafx.h"\r
+#include "mainfrm.h"\r
+#include <richedit.h>\r
+#include "resource.h"\r
+\r
+\r
+//For Visual C++ 6 and without a modern SDK\r
+#ifndef DWORD_PTR\r
+#define DWORD_PTR DWORD\r
+#endif\r
+\r
+\r
+// definitions for the CMainFrame class\r
+CMainFrame::CMainFrame()\r
+{\r
+ m_strPathName = _T("");\r
+ SetView(m_RichView);\r
+\r
+ // Set the registry key name, and load the initial window position\r
+ // Use a registry key name like "CompanyName\\Application"\r
+ LoadRegistrySettings(_T("Win32++\\Notepad Sample"));\r
+\r
+ // Load the settings from the registry with 5 MRU entries\r
+ LoadRegistryMRUSettings(5);\r
+}\r
+\r
+CMainFrame::~CMainFrame()\r
+{\r
+}\r
+\r
+void CMainFrame::OnInitialUpdate()\r
+{\r
+ DragAcceptFiles(TRUE);\r
+ SetWindowTitle();\r
+ m_RichView.SetFocus();\r
+}\r
+\r
+LRESULT CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam)\r
+{\r
+ NMHDR* pNMH;\r
+ pNMH = (LPNMHDR) lParam;\r
+ switch (pNMH->code)\r
+ {\r
+ case EN_DROPFILES:\r
+ {\r
+ ENDROPFILES* ENDrop = (ENDROPFILES*)lParam;\r
+ HDROP hDropInfo = (HDROP) ENDrop->hDrop;\r
+ OnDropFiles(hDropInfo);\r
+ }\r
+ return TRUE;\r
+ }\r
+\r
+ return CFrame::OnNotify(wParam, lParam);\r
+}\r
+\r
+BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)\r
+{\r
+ UNREFERENCED_PARAMETER(lParam);\r
+\r
+ switch (LOWORD(wParam))\r
+ {\r
+ case IDM_FILE_NEW:\r
+ OnFileNew();\r
+ return TRUE;\r
+ case IDM_FILE_OPEN:\r
+ OnFileOpen();\r
+ return TRUE;\r
+ case IDM_FILE_SAVE:\r
+ OnFileSave();\r
+ return TRUE;\r
+ case IDM_FILE_SAVEAS:\r
+ OnFileSaveAs();\r
+ return TRUE;\r
+ case IDM_FILE_PRINT:\r
+ OnFilePrint();\r
+ return TRUE;\r
+ case IDM_EDIT_COPY:\r
+ OnEditCopy();\r
+ return TRUE;\r
+ case IDM_EDIT_PASTE:\r
+ OnEditPaste();\r
+ return TRUE;\r
+ case IDM_EDIT_CUT:\r
+ OnEditCut();\r
+ return TRUE;\r
+ case IDM_EDIT_DELETE:\r
+ OnEditDelete();\r
+ return TRUE;\r
+ case IDM_EDIT_REDO:\r
+ OnEditRedo();\r
+ return TRUE;\r
+ case IDM_EDIT_UNDO:\r
+ OnEditUndo();\r
+ return TRUE;\r
+ case IDM_FILE_EXIT:\r
+ ::PostMessage(m_hWnd, WM_CLOSE, 0, 0);\r
+ return TRUE;\r
+ case IDW_VIEW_STATUSBAR:\r
+ OnViewStatusBar();\r
+ return TRUE;\r
+ case IDW_VIEW_TOOLBAR:\r
+ OnViewToolBar();\r
+ return TRUE;\r
+ case IDM_HELP_ABOUT:\r
+ OnHelp();\r
+ return TRUE;\r
+ case IDW_FILE_MRU_FILE1:\r
+ case IDW_FILE_MRU_FILE2:\r
+ case IDW_FILE_MRU_FILE3:\r
+ case IDW_FILE_MRU_FILE4:\r
+ case IDW_FILE_MRU_FILE5:\r
+ {\r
+ UINT nMRUIndex = LOWORD(wParam) - IDW_FILE_MRU_FILE1;\r
+ CString strMRUText = GetMRUEntry(nMRUIndex);\r
+\r
+ if (ReadFile(strMRUText))\r
+ m_strPathName = strMRUText;\r
+ else\r
+ RemoveMRUEntry(strMRUText);\r
+\r
+ SetWindowTitle();\r
+ return TRUE;\r
+ }\r
+\r
+ } // switch cmd\r
+\r
+ return FALSE;\r
+} // CMainFrame::OnCommand(...)\r
+\r
+\r
+void CMainFrame::OnFileNew()\r
+{\r
+ m_RichView.SetWindowText(_T(""));\r
+ m_strPathName = _T("");\r
+ SetWindowTitle();\r
+ m_RichView.SetFontDefaults();\r
+ m_RichView.SendMessage(EM_SETMODIFY, FALSE, 0);\r
+}\r
+\r
+void CMainFrame::OnFilePrint()\r
+{\r
+ PRINTDLG pd;\r
+\r
+ // Initialize PRINTDLG\r
+ ZeroMemory(&pd, sizeof(pd));\r
+ pd.lStructSize = sizeof(pd);\r
+ pd.hwndOwner = m_hWnd;\r
+ pd.hDevMode = NULL; // Don't forget to free or store hDevMode\r
+ pd.hDevNames = NULL; // Don't forget to free or store hDevNames\r
+ pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;\r
+ pd.nCopies = 1;\r
+ pd.nFromPage = 0xFFFF;\r
+ pd.nToPage = 0xFFFF;\r
+ pd.nMinPage = 1;\r
+ pd.nMaxPage = 0xFFFF;\r
+ pd.hwndOwner = m_hWnd;\r
+\r
+ if (PrintDlg(&pd)==TRUE)\r
+ {\r
+ HDC hPrinterDC = pd.hDC;\r
+\r
+ // This code basically taken from MS KB article Q129860\r
+\r
+ FORMATRANGE fr;\r
+ int nHorizRes = ::GetDeviceCaps(hPrinterDC, HORZRES);\r
+ int nVertRes = ::GetDeviceCaps(hPrinterDC, VERTRES);\r
+ int nLogPixelsX = ::GetDeviceCaps(hPrinterDC, LOGPIXELSX);\r
+ int nLogPixelsY = ::GetDeviceCaps(hPrinterDC, LOGPIXELSY);\r
+ LONG lTextLength; // Length of document.\r
+ LONG lTextPrinted; // Amount of document printed.\r
+\r
+ // Ensure the printer DC is in MM_TEXT mode.\r
+ ::SetMapMode ( hPrinterDC, MM_TEXT );\r
+\r
+ // Rendering to the same DC we are measuring.\r
+ ZeroMemory(&fr, sizeof(fr));\r
+ fr.hdc = hPrinterDC;\r
+ fr.hdcTarget = hPrinterDC;\r
+\r
+ // Set up the page.\r
+ int margin = 200; // 1440 TWIPS = 1 inch.\r
+ fr.rcPage.left = fr.rcPage.top = margin;\r
+ fr.rcPage.right = (nHorizRes/nLogPixelsX) * 1440 - margin;\r
+ fr.rcPage.bottom = (nVertRes/nLogPixelsY) * 1440 - margin;\r
+\r
+ // Set up margins all around.\r
+ fr.rc.left = fr.rcPage.left ;//+ 1440;\r
+ fr.rc.top = fr.rcPage.top ;//+ 1440;\r
+ fr.rc.right = fr.rcPage.right ;//- 1440;\r
+ fr.rc.bottom = fr.rcPage.bottom ;//- 1440;\r
+\r
+ // Default the range of text to print as the entire document.\r
+ fr.chrg.cpMin = 0;\r
+ fr.chrg.cpMax = -1;\r
+ m_RichView.SendMessage(EM_FORMATRANGE, true, (LPARAM)&fr);\r
+\r
+ // Set up the print job (standard printing stuff here).\r
+ DOCINFO di;\r
+ ZeroMemory(&di, sizeof(di));\r
+ di.cbSize = sizeof(DOCINFO);\r
+ di.lpszDocName = m_strPathName;\r
+\r
+ // Do not print to file.\r
+ di.lpszOutput = NULL;\r
+\r
+ // Start the document.\r
+ ::StartDoc(hPrinterDC, &di);\r
+ GETTEXTLENGTHEX tl;\r
+ tl.flags = GTL_NUMCHARS;\r
+\r
+ // Find out real size of document in characters.\r
+ lTextLength = (LONG)m_RichView.SendMessage(EM_GETTEXTLENGTHEX, (WPARAM)&tl, 0L);\r
+\r
+ do\r
+ {\r
+ // Start the page.\r
+ ::StartPage(hPrinterDC);\r
+\r
+ // Print as much text as can fit on a page. The return value is\r
+ // the index of the first character on the next page. Using TRUE\r
+ // for the wParam parameter causes the text to be printed.\r
+ lTextPrinted = (LONG)::SendMessage(m_RichView.GetHwnd(), EM_FORMATRANGE, true, (LPARAM)&fr);\r
+\r
+ m_RichView.SendMessage(EM_DISPLAYBAND, 0, (LPARAM)&fr.rc);\r
+\r
+ // Print last page.\r
+ ::EndPage(hPrinterDC);\r
+\r
+ // If there is more text to print, adjust the range of characters\r
+ // to start printing at the first character of the next page.\r
+ if (lTextPrinted < lTextLength)\r
+ {\r
+ fr.chrg.cpMin = (LONG)lTextPrinted;\r
+ fr.chrg.cpMax = -1;\r
+ }\r
+ }\r
+ while (lTextPrinted < lTextLength);\r
+\r
+ // Tell the control to release cached information.\r
+ m_RichView.SendMessage(EM_FORMATRANGE, false, 0L);\r
+\r
+ ::EndDoc (hPrinterDC);\r
+\r
+ // Delete DC when done.\r
+ ::DeleteDC(hPrinterDC);\r
+ }\r
+}\r
+\r
+void CMainFrame::OnEditCut()\r
+{\r
+ m_RichView.SendMessage(WM_CUT, 0, 0);\r
+}\r
+void CMainFrame::OnEditCopy()\r
+{\r
+ m_RichView.SendMessage(WM_COPY, 0, 0);\r
+}\r
+void CMainFrame::OnEditPaste()\r
+{\r
+ m_RichView.SendMessage(EM_PASTESPECIAL, CF_TEXT, 0);\r
+}\r
+void CMainFrame::OnEditDelete()\r
+{\r
+ m_RichView.SendMessage(WM_CLEAR, 0, 0);\r
+}\r
+void CMainFrame::OnEditRedo()\r
+{\r
+ m_RichView.SendMessage(EM_REDO, 0, 0);\r
+}\r
+void CMainFrame::OnEditUndo()\r
+{\r
+ m_RichView.SendMessage(EM_UNDO, 0, 0);\r
+}\r
+\r
+void CMainFrame::OnClose()\r
+{\r
+ //Check for unsaved text\r
+ BOOL bChanged = (BOOL)m_RichView.SendMessage(EM_GETMODIFY, 0, 0);\r
+ if (bChanged)\r
+ if (::MessageBox(NULL, _T("Save changes to this document"), _T("TextEdit"), MB_YESNO | MB_ICONWARNING) == IDYES)\r
+ OnFileSave();\r
+\r
+ CFrame::OnClose();\r
+}\r
+\r
+void CMainFrame::OnDropFiles(HDROP hDropInfo)\r
+{\r
+ TCHAR szFileName[_MAX_PATH];\r
+ ::DragQueryFile((HDROP)hDropInfo, 0, (LPTSTR)szFileName, _MAX_PATH);\r
+\r
+ ReadFile(szFileName);\r
+}\r
+\r
+BOOL CMainFrame::ReadFile(LPCTSTR szFileName)\r
+{\r
+ // Open the file for reading\r
+ CFile File;\r
+ if (!File.Open(szFileName, OPEN_EXISTING))\r
+ {\r
+ CString str = _T("Failed to load: ");\r
+ str += szFileName;\r
+ ::MessageBox(NULL, str, _T("Warning"), MB_ICONWARNING);\r
+ return FALSE;\r
+ }\r
+\r
+ //Set default font and color\r
+ m_RichView.SetFontDefaults();\r
+\r
+ EDITSTREAM es;\r
+ es.dwCookie = (DWORD_PTR) File.GetHandle();\r
+ es.pfnCallback = (EDITSTREAMCALLBACK) MyStreamInCallback;\r
+ m_RichView.SendMessage(EM_STREAMIN, SF_TEXT, (LPARAM)&es);\r
+\r
+ //Clear the modified text flag\r
+ m_RichView.SendMessage(EM_SETMODIFY, FALSE, 0);\r
+\r
+ return TRUE;\r
+}\r
+\r
+BOOL CMainFrame::WriteFile(LPCTSTR szFileName)\r
+{\r
+ // Open the file for writing\r
+ CFile File;\r
+ if (!File.Open(szFileName, CREATE_ALWAYS))\r
+ {\r
+ CString str = _T("Failed to write: ");\r
+ str += szFileName;\r
+ ::MessageBox(NULL, str, _T("Warning"), MB_ICONWARNING);\r
+ return FALSE;\r
+ }\r
+\r
+ EDITSTREAM es;\r
+\r
+ es.dwCookie = (DWORD_PTR) File.GetHandle();\r
+ es.dwError = 0;\r
+ es.pfnCallback = (EDITSTREAMCALLBACK) MyStreamOutCallback;\r
+\r
+ m_RichView.SendMessage(EM_STREAMOUT, SF_TEXT, (LPARAM)&es);\r
+\r
+ //Clear the modified text flag\r
+ m_RichView.SendMessage(EM_SETMODIFY, FALSE, 0);\r
+\r
+ return TRUE;\r
+}\r
+\r
+void CMainFrame::OnFileOpen()\r
+{\r
+ // szFilters is a text string that includes two file name filters:\r
+ // "*.my" for "MyType Files" and "*.*' for "All Files."\r
+ CString Filters( _T("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0"), 46);\r
+ CFile File;\r
+ CString str = File.OpenFileDialog(0, OFN_FILEMUSTEXIST, Filters, this);\r
+\r
+ if (!str.IsEmpty())\r
+ {\r
+ ReadFile(str);\r
+ SetFileName(str);\r
+ AddMRUEntry(str);\r
+ SetWindowTitle();\r
+ }\r
+}\r
+\r
+void CMainFrame::OnFileSave()\r
+{\r
+ if (m_strPathName == _T(""))\r
+ OnFileSaveAs();\r
+ else\r
+ WriteFile(m_strPathName);\r
+}\r
+\r
+void CMainFrame::OnFileSaveAs()\r
+{\r
+ // szFilters is a text string that includes two file name filters:\r
+ // "*.my" for "MyType Files" and "*.*' for "All Files."\r
+ CString Filters(_T("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0"), 46);\r
+ CFile File;\r
+ CString str = File.SaveFileDialog(0, OFN_OVERWRITEPROMPT, Filters, _T("txt"), this);\r
+ \r
+ if (!str.IsEmpty())\r
+ {\r
+ WriteFile(str);\r
+ SetFileName(str);\r
+ AddMRUEntry(str);\r
+ SetWindowTitle();\r
+ }\r
+}\r
+\r
+void CMainFrame::SetFileName(LPCTSTR szFilePathName)\r
+{\r
+ //Truncate and save file name\r
+ int i = lstrlen(szFilePathName)+1;\r
+ while ((--i > 0) && (szFilePathName[i-1] != _T('\\')));\r
+\r
+ m_strPathName = szFilePathName+i;\r
+}\r
+\r
+void CMainFrame::SetWindowTitle()\r
+{\r
+ CString Title;\r
+\r
+ if (m_strPathName == _T("")) Title = _T("TextEdit - Untitled");\r
+\r
+ else Title = _T("TextEdit - ") + m_strPathName;\r
+ SetWindowText(Title);\r
+}\r
+\r
+void CMainFrame::SetupToolBar()\r
+{\r
+ // Define the resource IDs for the toolbar\r
+ AddToolBarButton( IDM_FILE_NEW );\r
+ AddToolBarButton( IDM_FILE_OPEN );\r
+ AddToolBarButton( IDM_FILE_SAVE );\r
+ AddToolBarButton( 0 ); // Separator\r
+ AddToolBarButton( IDM_EDIT_CUT );\r
+ AddToolBarButton( IDM_EDIT_COPY );\r
+ AddToolBarButton( IDM_EDIT_PASTE );\r
+ AddToolBarButton( 0 ); // Separator\r
+ AddToolBarButton( IDM_FILE_PRINT );\r
+ AddToolBarButton( 0 ); // Separator\r
+ AddToolBarButton( IDM_HELP_ABOUT );\r
+\r
+}\r
+\r
+LRESULT CMainFrame::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+// switch (uMsg)\r
+// {\r
+//\r
+// }\r
+\r
+ return WndProcDefault(uMsg, wParam, lParam);\r
+}\r
+\r
+DWORD CALLBACK CMainFrame::MyStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)\r
+{\r
+ // Required for StreamIn\r
+ if (!cb)\r
+ return (1);\r
+\r
+ *pcb = 0;\r
+ if (!::ReadFile((HANDLE)(DWORD_PTR) dwCookie, pbBuff, cb, (LPDWORD)pcb, NULL))\r
+ ::MessageBox(NULL, _T("ReadFile Failed"), _T(""), MB_OK);\r
+\r
+ return 0;\r
+}\r
+\r
+DWORD CALLBACK CMainFrame::MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)\r
+{\r
+ // Required for StreamOut\r
+ if(!cb)\r
+ return (1);\r
+\r
+ *pcb = 0;\r
+ if (!::WriteFile((HANDLE)(DWORD_PTR)dwCookie, pbBuff, cb, (LPDWORD)pcb, NULL))\r
+ ::MessageBox(NULL, _T("WriteFile Failed"), _T(""), MB_OK);\r
+ return 0;\r
+}\r
+\r