📄 notepad2.c
字号:
/******************************************************************************
*
*
* Notepad2
*
* Notepad2.c
* Main application window functionality
*
* See Readme.txt for more information about this source code.
* Please send me your comments to this work.
*
* See License.txt for details about distribution and modification.
*
* (c) Florian Balmer 1996-2008
* florian.balmer@gmail.com
* http://www.flos-freeware.ch
*
*
******************************************************************************/
#include <windows.h>
#include <commctrl.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <richedit.h>
#include <shellapi.h>
#include <commdlg.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "scintilla.h"
#include "scilexer.h"
#include "sciwrap.h"
#include "edit.h"
#include "styles.h"
#include "helpers.h"
#include "dialogs.h"
#include "notepad2.h"
#include "resource.h"
/******************************************************************************
*
* Local and global Variables for Notepad2.c
*
*/
HWND hwndStatus;
HWND hwndToolbar;
HWND hwndReBar;
HWND hwndEdit;
HWND hwndMain;
HWND hwndFindReplace = NULL;
HWND hwndNextCBChain = NULL;
HWND hDlgFindReplace = NULL;
#define NUMTOOLBITMAPS 23
#define NUMINITIALTOOLS 24
TBBUTTON tbbMainWnd[] = { {0,IDT_FILE_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{1,IDT_FILE_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{2,IDT_FILE_BROWSE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{3,IDT_FILE_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{0,0,0,TBSTYLE_SEP,0,0},
{4,IDT_EDIT_UNDO,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{5,IDT_EDIT_REDO,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{0,0,0,TBSTYLE_SEP,0,0},
{6,IDT_EDIT_CUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{7,IDT_EDIT_COPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{8,IDT_EDIT_PASTE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{0,0,0,TBSTYLE_SEP,0,0},
{9,IDT_EDIT_FIND,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{10,IDT_EDIT_REPLACE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{0,0,0,TBSTYLE_SEP,0,0},
{11,IDT_VIEW_WORDWRAP,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{0,0,0,TBSTYLE_SEP,0,0},
{12,IDT_VIEW_ZOOMIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{13,IDT_VIEW_ZOOMOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{0,0,0,TBSTYLE_SEP,0,0},
{14,IDT_VIEW_SCHEME,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{15,IDT_VIEW_SCHEMECONFIG,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{0,0,0,TBSTYLE_SEP,0,0},
{16,IDT_FILE_EXIT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{17,IDT_FILE_SAVEAS,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{18,IDT_FILE_SAVECOPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{19,IDT_EDIT_CLEAR,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{20,IDT_FILE_PRINT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{21,IDT_FILE_OPENFAV,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{22,IDT_FILE_ADDTOFAV,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0} };
char szIniFile[MAX_PATH] = "";
BOOL bSaveSettings;
BOOL bSaveRecentFiles;
BOOL bSaveFindReplace;
char tchOpenWithDir[MAX_PATH];
char tchOpenWithDirBuf[MAX_PATH];
char tchFavoritesDir[MAX_PATH];
char tchFavoritesDirBuf[MAX_PATH];
char tchDefaultDir[MAX_PATH];
char tchDefaultExtension[64];
char tchFileDlgFilters[5*1024];
char tchToolbarButtons[512];
char tchToolbarBitmap[MAX_PATH];
char tchToolbarBitmapHot[MAX_PATH];
char tchToolbarBitmapDisabled[MAX_PATH];
int iPathNameFormat;
BOOL fWordWrap;
int iWordWrapIndent;
int iWordWrapSymbols;
BOOL bShowWordWrapSymbols;
BOOL bMatchBraces;
BOOL bAutoIndent;
BOOL bAutoCloseTags;
BOOL bShowIndentGuides;
BOOL bHiliteCurrentLine;
BOOL bTabsAsSpaces;
int iTabWidth;
int iIndentWidth;
BOOL bMarkLongLines;
int iLongLinesLimit;
int iLongLineMode;
BOOL bShowSelectionMargin;
BOOL bShowLineNumbers;
BOOL bViewWhiteSpace;
BOOL bViewEOLs;
int iDefaultEncoding;
BOOL bSkipUnicodeDetection;
int iDefaultEOLMode;
BOOL bFixLineEndings;
int iPrintHeader;
int iPrintFooter;
int iPrintColor;
int iPrintZoom;
RECT pagesetupMargin;
BOOL bSaveBeforeRunningTools;
BOOL bEnableFileWatching;
int iFileCheckInverval;
int iEscFunction;
BOOL bAlwaysOnTop;
BOOL bMinimizeToTray;
BOOL bTransparentMode;
BOOL bTransparentModeAvailable;
BOOL bShowToolbar;
BOOL bShowStatusbar;
typedef struct _wi
{
int x;
int y;
int cx;
int cy;
int max;
} WININFO;
WININFO wi;
BOOL bStickyWinPos;
BOOL bIsAppThemed;
int cyReBar;
int cyReBarFrame;
int cxFileMRUDlg;
int cyFileMRUDlg;
int cxOpenWithDlg;
int cyOpenWithDlg;
int cxFavoritesDlg;
int cyFavoritesDlg;
LPSTR lpFileArg = NULL;
LPMRULIST pFileMRU;
LPMRULIST mruFind;
LPMRULIST mruReplace;
char szCurFile[MAX_PATH+40];
BOOL bModified;
BOOL bReadOnly = FALSE;
int iCodePage;
int iInitialCP;
int iEOLMode;
int iDefaultCodePage;
int iDefaultCharSet;
int iInitialLine;
int iInitialColumn;
int iInitialLexer;
BOOL bLastCopyFromMe = FALSE;
UINT uidsAppTitle = IDS_APPTITLE;
HANDLE hChangeHandle = NULL;
BOOL bRunningWatch = FALSE;
WIN32_FIND_DATA fdCurFile;
UINT msgTaskbarCreated = 0;
HMODULE hModUxTheme = NULL;
EDITFINDREPLACE efrData = { "", "", "", "", 0, 0, 0, 0, 0, 0, NULL };
UINT cpLastFind = 0;
int iEncodings[5] = {
NCP_DEFAULT,
NCP_UNICODE|NCP_UNICODE_BOM,
NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_UNICODE_BOM,
NCP_UTF8,
NCP_UTF8|NCP_UTF8_SIGN
};
int iLineEndings[3] = {
SC_EOL_CRLF,
SC_EOL_LF,
SC_EOL_CR
};
struct {
int flags;
int location;
} WrapSymbols[4] = { { 1, 1 },
{ 2, 2 },
{ 3, 3 },
{ 3, 0 } };
WCHAR wchPrefixSelection[256] = L"";
WCHAR wchAppendSelection[256] = L"";
WCHAR wchPrefixLines[256] = L"";
WCHAR wchAppendLines[256] = L"";
LPMALLOC g_lpMalloc;
HINSTANCE g_hInstance;
//=============================================================================
//
// Flags
//
int flagNoReuseWindow = 0;
int flagSingleFileInstance = 0;
int flagStartAsTrayIcon = 0;
int flagNoFadeHidden = 0;
int flagSimpleIndentGuides = 0;
int flagPosParam = 0;
int flagDefaultPos = 0;
int flagNewFromClipboard = 0;
int flagPasteBoard = 0;
int flagJumpTo = 0;
int flagLexerSpecified = 0;
int flagDisplayHelp = 0;
//=============================================================================
//
// WinMain()
//
//
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,
LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
HWND hwnd;
HACCEL hAccel;
INITCOMMONCONTROLSEX icex;
//HMODULE hSciLexer;
extern char szIniFile[MAX_PATH];
// Set global variable g_hInstance
g_hInstance = hInstance;
// check if running at least on Windows 2000
if (!IsWindows2korLater()) {
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM|
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
ERROR_OLD_WIN_VERSION,
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), // Default language
(LPSTR)&lpMsgBuf,
0,
NULL);
MessageBox(NULL,(LPCSTR)lpMsgBuf,"Notepad2",MB_OK|MB_ICONEXCLAMATION);
LocalFree(lpMsgBuf);
return(0);
}
// Command Line, Ini File and Flags
ParseCommandLine(lpCmdLine);
FindIniFile();
LoadFlags();
// Command Line Help Dialog
if (flagDisplayHelp)
{
DisplayCmdLineHelp();
return(0);
}
// Try to activate another window
if (ActivatePrevInst())
return(0);
// Init OLE and Common Controls
OleInitialize(NULL);
SHGetMalloc(&g_lpMalloc);
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_WIN95_CLASSES|ICC_COOL_CLASSES|ICC_BAR_CLASSES|ICC_USEREX_CLASSES;
InitCommonControlsEx(&icex);
SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);
msgTaskbarCreated = RegisterWindowMessage("TaskbarCreated");
hModUxTheme = LoadLibrary("uxtheme.dll");
SciWrap_RegisterClasses(hInstance);
// Load Settings
LoadSettings();
if (!InitApplication(hInstance))
return FALSE;
if (!(hwnd = InitInstance(hInstance,lpCmdLine,nCmdShow)))
return FALSE;
hAccel = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_MAINWND));
while (GetMessageW(&msg,NULL,0,0))
{
if (!IsWindow(hDlgFindReplace) || !IsDialogMessage(hDlgFindReplace,&msg))
{
if (!TranslateAccelerator(hwnd,hAccel,&msg))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
}
}
// Save Settings is done elsewhere
SciWrap_ReleaseResources();
if (hModUxTheme)
FreeLibrary(hModUxTheme);
g_lpMalloc->lpVtbl->Release(g_lpMalloc);
OleUninitialize();
return(msg.wParam);
hPrevInst;
}
//=============================================================================
//
// InitApplication()
//
//
BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDR_MAINWND));
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINWND);
wc.lpszClassName = (!flagPasteBoard) ? WC_NOTEPAD2 : WC_NOTEPAD2PASTEBOARD;
return RegisterClass(&wc);
}
//=============================================================================
//
// InitInstance()
//
//
HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow)
{
RECT rc = { wi.x, wi.y, wi.x+wi.cx, wi.y+wi.cy };
RECT rc2;
MONITORINFO mi;
HMONITOR hMonitor = MonitorFromRect(&rc,MONITOR_DEFAULTTONEAREST);
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor,&mi);
if (flagDefaultPos) {
wi.x = wi.y = wi.cx = wi.cy = CW_USEDEFAULT;
wi.max = 0;
}
else if (wi.x == CW_USEDEFAULT || wi.y == CW_USEDEFAULT ||
wi.cx == CW_USEDEFAULT || wi.cy == CW_USEDEFAULT) {
// default window position
SystemParametersInfo(SPI_GETWORKAREA,0,&rc,0);
wi.y = rc.top + 16;
wi.cy = rc.bottom - rc.top - 32;
wi.cx = min(rc.right - rc.left - 32,wi.cy);
wi.x = rc.right - wi.cx - 16;
}
else {
// fit window into working area of current monitor
wi.x += (mi.rcWork.left - mi.rcMonitor.left);
wi.y += (mi.rcWork.top - mi.rcMonitor.top);
if (wi.x < mi.rcWork.left)
wi.x = mi.rcWork.left;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -