// source.cpp
#include<Windows.h>
#pragma comment(lib,"commondlg.lib")
#include"commondlg.h"
#include"resource.h"
#define IDEDIT 1
LPCWCHAR szAppName = L"Notepad";
BOOL CALLBACK hwndAboutDlgProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
UINT AskSaveTips(HWND _hwndOwner, LPCWCHAR lpszText, LPCWCHAR lpszCaption){ MessageBeep(NULL);
return MessageBox(_hwndOwner, lpszText, lpszCaption,MB_YESNOCANCEL | MB_ICONINFORMATION); }
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, INT iCmdShow)
{
MSG msg;
HWND hwnd;
HACCEL hAccel;
WNDCLASS wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = CreateSolidBrush(RGB(255,255,255));
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndclass);
hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
GetSystemMetrics(SM_CXSCREEN) / 4, GetSystemMetrics(SM_CYSCREEN) / 4,
GetSystemMetrics(SM_CXSCREEN) / 2, GetSystemMetrics(SM_CYSCREEN) / 2,
GetDesktopWindow(), 0, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(hwnd,hAccel,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HINSTANCE hInstance;
static HMENU hMenu;
static HWND hwndAbout, hwndEdit;
static BOOL bNeedSave = FALSE;
static std::wstring szText(L"untitled - Notepad");
static FileDlgObj FileObj(hwnd, _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0"), _T("txt"), 1);
static WCHAR szFilePath[MAX_PATH], szFileTitle[MAX_PATH];
static FindReplaceObj FindObj(hwnd);
static INT FindReplaceWindowMessage;
SYSTEMTIME systime;
WCHAR szBuffer[MAX_PATH * 2];
static ChooseFontObj FontObj(hwnd);
switch (message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
hwndEdit = CreateWindow(TEXT("Edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | \
WS_HSCROLL | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | \
ES_NOHIDESEL, 0, 0, 0, 0, hwnd, HMENU(1), hInstance, NULL);
bNeedSave = FALSE;
SetWindowText(hwnd, szText.c_str());
FindReplaceWindowMessage = RegisterWindowMessage(FINDMSGSTRING);
hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));
SetMenu(hwnd, hMenu);
break;
case WM_SIZE:
MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam),TRUE);
break;
case WM_COMMAND:
if (HIWORD(wParam) == EN_UPDATE)
bNeedSave = TRUE;
switch (LOWORD(wParam)) // Menu identifier
{
case ID_FILE_NEW:
if (bNeedSave)
{
szText = (szFilePath[0] == '\0') ? std::wstring(_T("Do you want to save change to(untitled)?")) :
szFilePath + std::wstring(_T(" - ")) + szAppName;
switch (AskSaveTips(hwnd, szText.c_str(), szAppName))
{
case IDYES:
if (szFilePath[0] == '\0')
{
if (FileObj.GetSaveFileInfo(szFilePath, szFileTitle) == TRUE)
{
if (!FileWrite(hwndEdit, szFilePath))
MessageBox(hwnd, _T("File Save Error!"), szAppName, MB_ICONEXCLAMATION);
szFilePath[0] = '\0';
szFileTitle[0] = '\0';
SetWindowText(hwnd, _T("untitled - Notepad"));
SetWindowText(hwndEdit, _T('\0'));
}
bNeedSave = FALSE;
}
break;
case IDNO:
szFilePath[0] = '\0';
szFileTitle[0] = '\0';
SetWindowText(hwnd, _T("untitled - Notepad"));
SetWindowText(hwndEdit, _T('\0'));
bNeedSave = FALSE;
break;
case IDCANCEL:
; // No things!
break;
}
}
else
{
szFilePath[0] = '\0';
szFileTitle[0] = '\0';
SetWindowText(hwnd, _T("untitled - Notepad"));
SetWindowText(hwndEdit, _T('\0'));
}
break;
case ID_FILE_OPEN:
if (bNeedSave)
{
szText = (szFilePath[0] == '\0') ? std::wstring(_T("Do you want to save change to(untitled)?")) :
_T("Do you want to save change to\n") + std::wstring(szFilePath) + _T("?");
switch (AskSaveTips(hwnd, szText.c_str(), szAppName))
{
case IDYES:
SendMessage(hwnd, WM_COMMAND, ID_FILE_SAVE, NULL); /**/
break;
case IDNO:
szFilePath[0] = '\0';
szFileTitle[0] = '\0';
SetWindowText(hwnd, _T("untitled - Notepad"));
SetWindowText(hwndEdit, _T('\0'));
bNeedSave = FALSE;
if (FileObj.GetOpenFileInfo(szFilePath, szFileTitle) == TRUE)
{
if (!FileReadin(hwndEdit, szFilePath))
{
MessageBox(hwnd, _T("File Open error!"), szAppName, MB_ICONEXCLAMATION);
szFilePath[0] = '\0';
szFileTitle[0] = '\0';
SetWindowText(hwnd, _T("untitled - Notepad"));
}
else
{
szText = (szFilePath[0] != '\0') ? std::wstring(szFilePath) + _T(" - ") + szAppName :
std::wstring(_T("untitled")) + _T(" - ") + szAppName;
SetWindowText(hwnd, szText.c_str());
}
}
break;
case IDCANCEL:
; // No things!
break;
}
}
if (bNeedSave == FALSE)
{
if (FileObj.GetOpenFileInfo(szFilePath, szFileTitle) == TRUE)
{
SetWindowText(hwndEdit, _T("\0"));
if (!FileReadin(hwndEdit, szFilePath))
{
MessageBox(hwnd, _T("File Open error!"), szAppName, MB_ICONEXCLAMATION);
szFilePath[0] = '\0';
szFileTitle[0] = '\0';
SetWindowText(hwnd, _T("untitled - Notepad"));
}
else
{
szText = (szFilePath[0] != '\0') ? std::wstring(szFilePath) + _T(" - ") + szAppName :
std::wstring(_T("untitled")) + _T(" - ") + szAppName;
SetWindowText(hwnd, szText.c_str());
}
}
}
break;
case ID_FILE_SAVE:
if (szFilePath[0] == '\0')
SendMessage(hwnd, WM_COMMAND, ID_FILE_SAVE_AS, 0);
else if (!FileWrite(hwndEdit,szFilePath))
MessageBox(hwnd, _T("File Save Error!"), szAppName, MB_ICONEXCLAMATION);
bNeedSave = FALSE;
break;
case ID_FILE_SAVE_AS:
if (FileObj.GetSaveFileInfo(szFilePath, szFileTitle) == TRUE)
{
if (!FileWrite(hwndEdit, szFilePath))
MessageBox(hwnd, _T("File Save Error!"), szAppName, MB_ICONEXCLAMATION);
}
bNeedSave = FALSE;
break;
case ID_FILE_PRINT:
MessageBeep(0);
MessageBox(hwnd, TEXT("No printer!"), szAppName, MB_ICONINFORMATION);
break;
case ID_FILE_EXIT:
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
case ID_EDIT_UNDO:
SendMessage(hwndEdit, WM_UNDO, 0, 0);
break;
case ID_EDIT_CUT:
SendMessage(hwndEdit, WM_CUT, 0, 0);
break;
case ID_EDIT_COPY:
SendMessage(hwndEdit, WM_COPY, 0, 0);
break;
case ID_EDIT_PASTE:
SendMessage(hwndEdit, WM_PASTE, 0, 0);
break;
case ID_EDIT_DELETE:
SendMessage(hwndEdit,WM_CLEAR , 0, 0);
break;
case ID_EDIT_FIND:
FindObj.FindTextOpen(hwndEdit);
FindObj.FindResult();
break;
case ID_EDIT_FIND_NEXT:
FindObj.FindTextOpen(hwndEdit);
FindObj.FindResult();
break;
case ID_EDIT_REPLACE:
FindObj.ReplaceTextOpen(hwndEdit);
FindObj.ReplaceResult();
break;
case ID_EDIT_SELECT_ALL:
SendMessage(hwndEdit, EM_SETSEL, 0, LPARAM(GetWindowTextLength(hwndEdit)));
break;
case ID_EDIT_TIME_DATE: // Problems!
GetLocalTime(&systime);
wsprintf(szBuffer, TEXT("%d年/%d月/%d日/%d时/%分"), systime.wYear, systime.wMonth, systime.wDay, systime.wHour, systime.wMinute);
// insert string to edit
break;
case ID_FORMAT_WORDWRAP:
if (GetMenuState(hMenu, ID_FORMAT_WORDWRAP, MF_BYCOMMAND) == MF_CHECKED)
{
CheckMenuItem(hMenu, ID_FORMAT_WORDWRAP, MF_UNCHECKED);
SetWindowLong(hwndEdit, GWL_STYLE, (LONG)WS_CHILD | WS_VISIBLE | WS_BORDER | \
WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | \
ES_NOHIDESEL);
MoveWindow(hwnd, GetSystemMetrics(SM_CXSCREEN) / 4, GetSystemMetrics(SM_CYSCREEN) / 4,
GetSystemMetrics(SM_CXSCREEN) / 2 + 2, GetSystemMetrics(SM_CYSCREEN) / 2 + 2, TRUE);
}
else
{
CheckMenuItem(hMenu, ID_FORMAT_WORDWRAP, MF_CHECKED);
SetWindowLong(hwndEdit, GWL_STYLE, (LONG)WS_CHILD | WS_VISIBLE | WS_BORDER | \
WS_HSCROLL | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | \
ES_NOHIDESEL);
MoveWindow(hwnd, GetSystemMetrics(SM_CXSCREEN) / 4, GetSystemMetrics(SM_CYSCREEN) / 4,
GetSystemMetrics(SM_CXSCREEN) / 2 + 2, GetSystemMetrics(SM_CYSCREEN) / 2, TRUE);
}
break;
case ID_FORMAT_FONT:
if(FontObj.SelectFontDlgOpen())
FontObj.SetFont(hwndEdit);
break;
case ID_HELP_HELP:
MessageBeep(0);
MessageBox(hwnd, TEXT("This is help not yet implement!"), szAppName, MB_ICONINFORMATION);
break;
case ID_HELP_ABOUT:
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),hwnd, hwndAboutDlgProc);
break;
}
break;
case WM_CLOSE:
if (bNeedSave)
{
szText = (szFilePath[0] == '\0') ? std::wstring(_T("Do you want to save change to(untitled)?")) :
szFilePath + std::wstring(_T(" - ")) + szAppName;
switch (AskSaveTips(hwnd, szText.c_str(), szAppName))
{
case IDYES:
if (szFilePath[0] == '\0')
{
if (FileObj.GetSaveFileInfo(szFilePath, szFileTitle) == TRUE)
{
if (!FileWrite(hwndEdit, szFilePath))
MessageBox(hwnd, _T("File Save Error!"), szAppName, MB_ICONEXCLAMATION);
szFilePath[0] = '\0';
szFileTitle[0] = '\0';
SetWindowText(hwnd, _T("untitled - Notepad"));
SetWindowText(hwndEdit, _T('\0'));
}
else return LRESULT(FALSE);
bNeedSave = FALSE;
}
else if (!FileWrite(hwndEdit, szFilePath))
{
MessageBox(hwnd, _T("File Save Error!"), szAppName, MB_ICONEXCLAMATION);
return LRESULT(0);
}
break;
case IDCANCEL:
return LRESULT(0);
case IDNO:
break;
}
}
break;
case WM_KEYDOWN:
if (!(wParam == VK_ESCAPE))
break;
case WM_DESTROY:
PostQuitMessage(0); // Return to WinMain of the inside of the MSG structure
break;
default:
if (message == FindReplaceWindowMessage)
FindObj.ProcessingMessage(&FindObj,(LPFINDREPLACE)lParam);
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
BOOL CALLBACK hwndAboutDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || SC_CLOSE)
EndDialog(hwnd, TRUE);
break;
}return FALSE;
}
// resource.rc
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/
#undef APSTUDIO_READONLY_SYMBOLS
/
// Chinese (Simplified, PRC) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // Chinese (Simplified, PRC) resources
/
/
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
/
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON "F:\\Windows API Study notes\\资源文件\\Icon\\5.ico"
/
//
// Dialog
//
IDD_DIALOG1 DIALOGEX 0, 0, 189, 103
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Anout"
FONT 12, "@Fixedsys", 400, 0, 0x86
BEGIN
CTEXT "Notepad",IDC_STATIC,45,19,78,13
LTEXT "Author:Tom\nE-Mail:Friendly_Monkey@outlook.com",IDC_STATIC,29,38,144,18
LTEXT "***********(Copyright)Tom,2017***********",IDC_STATIC,7,87,179,9
ICON IDI_ICON1,IDC_STATIC,14,16,20,20
PUSHBUTTON "Okay",IDOK,64,59,53,15
END
/
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 182
TOPMARGIN, 7
BOTTOMMARGIN, 96
END
END
#endif // APSTUDIO_INVOKED
/
//
// Menu
//
IDR_MENU1 MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New\tCtrl+N", ID_FILE_NEW
MENUITEM "&Open\tCtrl+O", ID_FILE_OPEN
MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE
MENUITEM "&Save As...", ID_FILE_SAVE_AS
MENUITEM SEPARATOR
MENUITEM "&Print", ID_FILE_PRINT
MENUITEM SEPARATOR
MENUITEM "E&xit", ID_FILE_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO
MENUITEM "&Cut\tCtrl+X", ID_EDIT_CUT
MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY
MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE
MENUITEM "&Delete\tDel", ID_EDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "&Find...\tCtrl+F", ID_EDIT_FIND
MENUITEM "&Find Next\tF3", ID_EDIT_FIND_NEXT
MENUITEM "&Replace...", ID_EDIT_REPLACE
MENUITEM SEPARATOR
MENUITEM "&Select All\tCtrl+A", ID_EDIT_SELECT_ALL
MENUITEM "Time/Date\tF5", ID_EDIT_TIME_DATE
END
POPUP "F&ormat"
BEGIN
MENUITEM "&Word Wrap", ID_FORMAT_WORDWRAP, CHECKED
MENUITEM "&Font...", ID_FORMAT_FONT
END
POPUP "&Help"
BEGIN
MENUITEM "&Help", ID_HELP_HELP
MENUITEM "&About...", ID_HELP_ABOUT
END
END
/
//
// Accelerator
//
IDR_ACCELERATOR1 ACCELERATORS
BEGIN
"^C", ID_EDIT_COPY, ASCII, NOINVERT
"^X", ID_EDIT_CUT, ASCII, NOINVERT
"^F", ID_EDIT_FIND, ASCII, NOINVERT
VK_F3, ID_EDIT_FIND_NEXT, VIRTKEY, NOINVERT
"^V", ID_EDIT_PASTE, ASCII, NOINVERT
"^A", ID_EDIT_SELECT_ALL, ASCII, NOINVERT
VK_F5, ID_EDIT_TIME_DATE, VIRTKEY, NOINVERT
"^Z", ID_EDIT_UNDO, ASCII, NOINVERT
"^N", ID_FILE_NEW, ASCII, NOINVERT
"^O", ID_FILE_OPEN, ASCII, NOINVERT
"^S", ID_FILE_SAVE, ASCII, NOINVERT
END
#endif // English (United States) resources
/
#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
/
#endif // not APSTUDIO_INVOKED
// resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Resource.rc
//
#define IDR_ACCELERATOR1 101
#define IDI_ICON1 102
#define IDD_DIALOG1 103
#define IDR_MENU1 104
#define ID_FILE_NEW 40002
#define ID_FILE_OPENCTRL 40003
#define ID_FILE_SAVE 40004
#define ID_FILE_SAVEAS 40005
#define ID_FILE_PRINT 40006
#define ID_FILE_EXIT 40007
#define ID_EDIT 40008
#define ID_EDIT_UNDO 40009
#define ID_EDIT_CUT 40010
#define ID_EDIT_COPY 40011
#define ID_EDIT_PASTE 40012
#define ID_EDIT_DELETE 40013
#define ID_EDIT_FIND 40014
#define ID_EDIT_FINDNEXT 40015
#define ID_EDIT_REPLACE 40016
#define ID_EDIT_SELECTALL 40017
#define ID_EDIT_TIME 40018
#define ID_EDIT_TIMEDATE 40019
#define ID_EDIT_SELECT_ALL 40020
#define ID_EDIT_TIME_DATE 40021
#define ID_FORMAT 40022
#define ID_FORMAT_WORDWRAP 40023
#define ID_FORMAT_FONT 40024
#define ID_BACKGROUND 40025
#define ID_BACKGROUND_DEFAULT 40026
#define ID_BACKGROUND_WHITE 40027
#define ID_BACKGROUND_BLACK 40028
#define ID_HELP 40029
#define ID_HELP_HELP 40030
#define ID_HELP_ABOUT 40031
#define ID_FILE_OPEN 40035
#define ID_FILE_SAVE_AS 40036
#define ID_EDIT_FIND_NEXT 40046
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 106
#define _APS_NEXT_COMMAND_VALUE 40047
#define _APS_NEXT_CONTROL_VALUE 1002
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
// commondlg.lib download address: http://files.cnblogs.com/files/zhumingyou/Commondlg链接库.rar