notepad2.c
来自「C语言编程中算法数据结构中的树行代码」· C语言 代码 · 共 2,135 行 · 第 1/5 页
C
2,135 行
cy -= cyReBar + cyReBarFrame; // border
}
if (bShowStatusbar)
{
SendMessage(hwndStatus,WM_SIZE,0,0);
GetWindowRect(hwndStatus,&rc);
cy -= (rc.bottom - rc.top);
}
SetWindowPos(hwndEdit,NULL,x,y,cx,cy,SWP_NOZORDER | SWP_NOACTIVATE);
// Statusbar width
aWidth[0] = max(120,min(cx/3,StatusCalcPaneWidth(hwndStatus,"Ln 9'999'999 : 9'999'999 Col 9'999'999 : 999 Sel 9'999'999")));
aWidth[1] = aWidth[0] + StatusCalcPaneWidth(hwndStatus,"9'999'999 Bytes");
aWidth[2] = aWidth[1] + StatusCalcPaneWidth(hwndStatus,"Unicode BE BOM");
aWidth[3] = aWidth[2] + StatusCalcPaneWidth(hwndStatus,"CR+LF");
aWidth[4] = aWidth[3] + StatusCalcPaneWidth(hwndStatus,"OVR");
aWidth[5] = -1;
SendMessage(hwndStatus,SB_SETPARTS,COUNTOF(aWidth),(LPARAM)aWidth);
//UpdateStatusbar();
}
//=============================================================================
//
// MsgInitMenu() - Handles WM_INITMENU
//
//
void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam)
{
int i,i2;
HMENU hmenu = (HMENU)wParam;
i = lstrlen(szCurFile);
EnableCmd(hmenu,IDM_FILE_REVERT,i);
EnableCmd(hmenu,IDM_FILE_LAUNCH,i);
EnableCmd(hmenu,IDM_FILE_PROPERTIES,i);
EnableCmd(hmenu,IDM_FILE_CREATELINK,i);
EnableCmd(hmenu,IDM_FILE_ADDTOFAV,i);
EnableCmd(hmenu,IDM_FILE_READONLY,i);
CheckCmd(hmenu,IDM_FILE_READONLY,bReadOnly);
//EnableCmd(hmenu,IDM_ENCODING_UNICODEREV,!bReadOnly);
//EnableCmd(hmenu,IDM_ENCODING_UNICODE,!bReadOnly);
//EnableCmd(hmenu,IDM_ENCODING_UTF8SIGN,!bReadOnly);
//EnableCmd(hmenu,IDM_ENCODING_UTF8,!bReadOnly);
//EnableCmd(hmenu,IDM_ENCODING_ANSI,!bReadOnly);
//EnableCmd(hmenu,IDM_LINEENDINGS_CRLF,!bReadOnly);
//EnableCmd(hmenu,IDM_LINEENDINGS_LF,!bReadOnly);
//EnableCmd(hmenu,IDM_LINEENDINGS_CR,!bReadOnly);
if (iCodePage & NCP_UNICODE_REVERSE)
i = IDM_ENCODING_UNICODEREV;
else if (iCodePage & NCP_UNICODE)
i = IDM_ENCODING_UNICODE;
else if (iCodePage & NCP_UTF8_SIGN)
i = IDM_ENCODING_UTF8SIGN;
else if (iCodePage & NCP_UTF8)
i = IDM_ENCODING_UTF8;
else
i = IDM_ENCODING_ANSI;
CheckMenuRadioItem(hmenu,IDM_ENCODING_ANSI,IDM_ENCODING_UTF8SIGN,i,MF_BYCOMMAND);
if (iEOLMode == SC_EOL_CRLF)
i = IDM_LINEENDINGS_CRLF;
else if (iEOLMode == SC_EOL_LF)
i = IDM_LINEENDINGS_LF;
else
i = IDM_LINEENDINGS_CR;
CheckMenuRadioItem(hmenu,IDM_LINEENDINGS_CRLF,IDM_LINEENDINGS_CR,i,MF_BYCOMMAND);
EnableCmd(hmenu,IDM_FILE_RECENT,(MRU_Enum(pFileMRU,0,NULL,0) > 0));
EnableCmd(hmenu,IDM_EDIT_UNDO,SendMessage(hwndEdit,SCI_CANUNDO,0,0) /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_REDO,SendMessage(hwndEdit,SCI_CANREDO,0,0) /*&& !bReadOnly*/);
i = SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0) - SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
i2 = SendMessage(hwndEdit,SCI_CANPASTE,0,0);
EnableCmd(hmenu,IDM_EDIT_CUT,i /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_COPY,i /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_COPYALL,SendMessage(hwndEdit,SCI_GETLENGTH,0,0) /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_PASTE,i2 /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_SWAP,i || i2 /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_CLEAR,i /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_CLEARALL,SendMessage(hwndEdit,SCI_GETLENGTH,0,0) /*&& !bReadOnly*/);
OpenClipboard(hwnd);
EnableCmd(hmenu,IDM_EDIT_CLEARCLIPBOARD,CountClipboardFormats());
CloseClipboard();
//EnableCmd(hmenu,IDM_EDIT_MOVELINEUP,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_MOVELINEDOWN,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_DUPLICATELINE,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_CUTLINE,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_COPYLINE,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_DELETELINE,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_INDENT,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_UNINDENT,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_STRIP1STCHAR,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_TRIMLINES,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_REMOVEBLANKLINES,!bReadOnly);
EnableCmd(hmenu,IDM_EDIT_COLUMNWRAP,i /*&& IsWindowsNT()*/);
EnableCmd(hmenu,IDM_EDIT_SPLITLINES,i /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_JOINLINES,i /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_CONVERTUPPERCASE,i /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_CONVERTLOWERCASE,i /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_INVERTCASE,i /*&& !bReadOnly*/ /*&& IsWindowsNT()*/);
EnableCmd(hmenu,IDM_EDIT_TITLECASE,i /*&& !bReadOnly*/ /*&& IsWindowsNT()*/);
EnableCmd(hmenu,IDM_EDIT_SENTENCECASE,i /*&& !bReadOnly*/ /*&& IsWindowsNT()*/);
EnableCmd(hmenu,IDM_EDIT_CONVERTTABS,i /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_CONVERTSPACES,i /*&& !bReadOnly*/);
i2 = SendMessage(hwndEdit,SCI_GETCODEPAGE,0,0);
EnableCmd(hmenu,IDM_EDIT_CONVERTOEM,i && (i2 == iDefaultCodePage || i2 == 0) /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_CONVERTANSI,i && (i2 == iDefaultCodePage || i2 == 0) /*&& !bReadOnly*/);
i = SendMessage(hwndEdit,SCI_GETLEXER,0,0);
EnableCmd(hmenu,IDM_EDIT_LINECOMMENT,
!(i == SCLEX_NULL || i == SCLEX_CSS || i == SCLEX_DIFF));
EnableCmd(hmenu,IDM_EDIT_STREAMCOMMENT,
!(i == SCLEX_NULL || i == SCLEX_VBSCRIPT || i == SCLEX_MAKEFILE || i == SCLEX_VB || i == SCLEX_ASM ||
i == SCLEX_SQL || i == SCLEX_PERL || i == SCLEX_PYTHON || i == SCLEX_PROPERTIES ||i == SCLEX_CONF ||
i == SCLEX_BATCH || i == SCLEX_DIFF));
//EnableCmd(hmenu,IDM_EDIT_INSERT_SHORTDATE,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_INSERT_LONGDATE,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_INSERT_FILENAME,!bReadOnly);
//EnableCmd(hmenu,IDM_EDIT_INSERT_PATHNAME,!bReadOnly);
i = SendMessage(hwndEdit,SCI_GETLENGTH,0,0);
EnableCmd(hmenu,IDM_EDIT_FIND,i);
EnableCmd(hmenu,IDM_EDIT_SAVEFIND,i);
EnableCmd(hmenu,IDM_EDIT_FINDNEXT,i);
EnableCmd(hmenu,IDM_EDIT_FINDPREV,i && lstrlen(efrData.szFind));
EnableCmd(hmenu,IDM_EDIT_SELTONEXT,i);
EnableCmd(hmenu,IDM_EDIT_SELTOPREV,i && lstrlen(efrData.szFind));
EnableCmd(hmenu,IDM_EDIT_REPLACE,i /*&& !bReadOnly*/);
CheckCmd(hmenu,IDM_VIEW_USE2NDDEFAULT,Style_GetUse2ndDefault(hwndEdit));
CheckCmd(hmenu,IDM_VIEW_WORDWRAP,fWordWrap);
CheckCmd(hmenu,IDM_VIEW_LONGLINEMARKER,bMarkLongLines);
CheckCmd(hmenu,IDM_VIEW_TABSASSPACES,bTabsAsSpaces);
CheckCmd(hmenu,IDM_VIEW_SHOWINDENTGUIDES,bShowIndentGuides);
CheckCmd(hmenu,IDM_VIEW_AUTOINDENTTEXT,bAutoIndent);
CheckCmd(hmenu,IDM_VIEW_LINENUMBERS,bShowLineNumbers);
CheckCmd(hmenu,IDM_VIEW_MARGIN,bShowSelectionMargin);
CheckCmd(hmenu,IDM_VIEW_SHOWWHITESPACE,bViewWhiteSpace);
CheckCmd(hmenu,IDM_VIEW_SHOWEOLS,bViewEOLs);
CheckCmd(hmenu,IDM_VIEW_WORDWRAPSYMBOLS,bShowWordWrapSymbols);
CheckCmd(hmenu,IDM_VIEW_MATCHBRACES,bMatchBraces);
CheckCmd(hmenu,IDM_VIEW_TOOLBAR,bShowToolbar);
EnableCmd(hmenu,IDM_VIEW_CUSTOMIZETB,bShowToolbar);
CheckCmd(hmenu,IDM_VIEW_STATUSBAR,bShowStatusbar);
i = SendMessage(hwndEdit,SCI_GETLEXER,0,0);
//EnableCmd(hmenu,IDM_VIEW_AUTOCLOSETAGS,(i == SCLEX_HTML || i == SCLEX_XML));
CheckCmd(hmenu,IDM_VIEW_AUTOCLOSETAGS,bAutoCloseTags /*&& (i == SCLEX_HTML || i == SCLEX_XML)*/);
CheckCmd(hmenu,IDM_VIEW_HILITECURRENTLINE,bHiliteCurrentLine);
i = IniGetInt("Settings2","ReuseWindow",0);
CheckCmd(hmenu,IDM_VIEW_REUSEWINDOW,i);
i = IniGetInt("Settings2","SingleFileInstance",0);
CheckCmd(hmenu,IDM_VIEW_SINGLEFILEINSTANCE,i);
bStickyWinPos = IniGetInt("Settings2","StickyWindowPosition",0);
CheckCmd(hmenu,IDM_VIEW_STICKYWINPOS,bStickyWinPos);
CheckCmd(hmenu,IDM_VIEW_ALWAYSONTOP,bAlwaysOnTop);
CheckCmd(hmenu,IDM_VIEW_MINTOTRAY,bMinimizeToTray);
CheckCmd(hmenu,IDM_VIEW_TRANSPARENT,bTransparentMode && bTransparentModeAvailable);
EnableCmd(hmenu,IDM_VIEW_TRANSPARENT,bTransparentModeAvailable);
CheckCmd(hmenu,IDM_VIEW_NOSAVERECENT,bSaveRecentFiles);
CheckCmd(hmenu,IDM_VIEW_NOSAVEFINDREPL,bSaveFindReplace);
CheckCmd(hmenu,IDM_VIEW_SAVEBEFORERUNNINGTOOLS,bSaveBeforeRunningTools);
CheckCmd(hmenu,IDM_VIEW_FILECHANGENOTIFY,bEnableFileWatching);
if (iPathNameFormat == 0)
i = IDM_VIEW_SHOWFILENAMEONLY;
else if (iPathNameFormat == 1)
i = IDM_VIEW_SHOWFILENAMEFIRST;
else
i = IDM_VIEW_SHOWFULLPATH;
CheckMenuRadioItem(hmenu,IDM_VIEW_SHOWFILENAMEONLY,IDM_VIEW_SHOWFULLPATH,i,MF_BYCOMMAND);
if (iEscFunction == 1)
i = IDM_VIEW_ESCMINIMIZE;
else if (iEscFunction == 2)
i = IDM_VIEW_ESCEXIT;
else
i = IDM_VIEW_NOESNFUNC;
CheckMenuRadioItem(hmenu,IDM_VIEW_ESCMINIMIZE,IDM_VIEW_NOESNFUNC,i,MF_BYCOMMAND);
i = lstrlen(szIniFile);
CheckCmd(hmenu,IDM_VIEW_SAVESETTINGS,bSaveSettings && i);
EnableCmd(hmenu,IDM_VIEW_REUSEWINDOW,i);
EnableCmd(hmenu,IDM_VIEW_STICKYWINPOS,i);
EnableCmd(hmenu,IDM_VIEW_SINGLEFILEINSTANCE,i);
EnableCmd(hmenu,IDM_VIEW_NOSAVERECENT,i);
EnableCmd(hmenu,IDM_VIEW_NOSAVEFINDREPL,i);
EnableCmd(hmenu,IDM_VIEW_SAVESETTINGS,i);
EnableCmd(hmenu,IDM_VIEW_SAVESETTINGSNOW,i);
}
//=============================================================================
//
// MsgCommand() - Handles WM_COMMAND
//
//
LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
{
switch(LOWORD(wParam))
{
case IDM_FILE_NEW:
FileLoad(FALSE,TRUE,FALSE,FALSE,"");
break;
case IDM_FILE_OPEN:
FileLoad(FALSE,FALSE,FALSE,FALSE,"");
break;
case IDM_FILE_REVERT:
{
if (lstrlen(szCurFile)) {
char tchCurFile2[MAX_PATH];
int iCurPos = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
int iAnchorPos = SendMessage(hwndEdit,SCI_GETANCHOR,0,0);
int iCurTopLine = SendMessage(hwndEdit,SCI_GETFIRSTVISIBLELINE,0,0);
int iXOffset = SendMessage(hwndEdit,SCI_GETXOFFSET,0,0);
if ((bModified || iCodePage != iInitialCP) && MsgBox(MBOKCANCEL,IDS_ASK_REVERT) != IDOK)
return(0);
lstrcpy(tchCurFile2,szCurFile);
if (FileLoad(TRUE,FALSE,TRUE,FALSE,tchCurFile2))
{
if (SendMessage(hwndEdit,SCI_GETLENGTH,0,0) >= 4) {
char tch[5] = "";
SendMessage(hwndEdit,SCI_GETTEXT,5,(LPARAM)tch);
if (lstrcmp(tch,".LOG") != 0) {
int iTopLineAfterLoad;
SendMessage(hwndEdit,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos);
iTopLineAfterLoad = SendMessage(hwndEdit,SCI_GETFIRSTVISIBLELINE,0,0);
SendMessage(hwndEdit,SCI_LINESCROLL,0,(LPARAM)(iCurTopLine - iTopLineAfterLoad));
SendMessage(hwndEdit,SCI_SETXOFFSET,(WPARAM)iXOffset,0);
}
}
}
}
}
break;
case IDM_FILE_SAVE:
FileSave(TRUE,FALSE,FALSE,FALSE);
break;
case IDM_FILE_SAVEAS:
FileSave(TRUE,FALSE,TRUE,FALSE);
break;
case IDM_FILE_SAVECOPY:
FileSave(TRUE,FALSE,TRUE,TRUE);
break;
case IDM_FILE_READONLY:
//bReadOnly = (bReadOnly) ? FALSE : TRUE;
//SendMessage(hwndEdit,SCI_SETREADONLY,bReadOnly,0);
//UpdateToolbar();
//UpdateStatusbar();
if (lstrlen(szCurFile))
{
BOOL bSuccess = FALSE;
DWORD dwFileAttributes = GetFileAttributes(szCurFile);
if (dwFileAttributes != INVALID_FILE_ATTRIBUTES) {
if (bReadOnly)
dwFileAttributes = (dwFileAttributes & ~FILE_ATTRIBUTE_READONLY);
else
dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
if (!SetFileAttributes(szCurFile,dwFileAttributes))
MsgBox(MBWARN,IDS_READONLY_MODIFY,szCurFile);
}
else
MsgBox(MBWARN,IDS_READONLY_MODIFY,szCurFile);
dwFileAttributes = GetFileAttributes(szCurFile);
if (dwFileAttributes != INVALID_FILE_ATTRIBUTES)
bReadOnly = (dwFileAttributes & FILE_ATTRIBUTE_READONLY);
SetWindowTitle(hwnd,uidsAppTitle,IDS_UNTITLED,szCurFile,
iPathNameFormat,bModified || iCodePage != iInitialCP,
IDS_READONLY,bReadOnly);
}
break;
case IDM_FILE_BROWSE:
{
SHELLEXECUTEINFO sei;
char tchParam[MAX_PATH+4];
char tchExeFile[MAX_PATH+4];
lstrcpy(tchParam,szCurFile);
PathQuoteSpaces(tchParam);
if (!IniGetString("Settings2","filebrowser.exe","",tchExeFile,COUNTOF(tchExeFile))) {
if (!SearchPath(NULL,"metapath.exe",NULL,COUNTOF(tchExeFile),tchExeFile,NULL)) {
lstrcpy(tchExeFile,"metapath.exe");
}
}
ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
sei.hwnd = hwnd;
sei.lpVerb = NULL;
sei.lpFile = tchExeFile;
sei.lpParameters = tchParam;
sei.lpDirectory = NULL;
sei.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&sei);
if ((int)sei.hInstApp < 32)
MsgBox(MBWARN,IDS_ERR_BROWSE);
}
break;
case IDM_FILE_NEWWINDOW:
case IDM_FILE_NEWWINDOW2:
{
char szModuleName[MAX_PATH];
char szFileName[MAX_PATH];
char szParameters[2*MAX_PATH+64];
MONITORINFO mi;
HMONITOR hMonitor;
WINDOWPLACEMENT wndpl;
int x,y,cx,cy,imax;
char tch[64];
if (bSaveBeforeRunningTools && !FileSave(FALSE,TRUE,FALSE,FALSE))
break;
GetModuleFileName(NULL,szModuleName,COUNTOF(szModuleName));
lstrcpy(szParameters,"-f");
if (lstrlen(szIniFile)) {
lstrcat(szParameters," \"");
lstrcat(szParameters,szIniFile);
lstrcat(szParameters,"\"");
}
else
lstrcat(szParameters,"0");
lstrcat(szParameters," -n");
wndpl.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hwnd,&wndpl);
hMonitor = MonitorFromRect(&wndpl.rcNormalPosition,MONITOR_DEFAULTTONEAREST);
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor,&mi);
// offset new window position +10/+10
x = wndpl.rcNormalPosition.left + 10;
y = wndpl.rcNormalPosition.top + 10;
cx = wndpl.rcNormalPosition.right - wndpl.rcNormalPosition.left;
cy = wndpl.rcNormalPosition.bottom - wndpl.rcNormalPosition.top;
// check if window fits monitor
if ((x + cx) > mi.rcWork.right || (y + cy) > mi.rcWork.bottom) {
x = mi.rcMonitor.left;
y = mi.rcMonitor.top;
}
imax = IsZoomed(hwnd);
wsprintf(tch," -p %i,%i,%i,%i,%i",x,y,cx,cy,imax);
lstrcat(szParameters,tch);
if (LOWORD(wParam) != IDM_FILE_NEWWINDOW2 && lstrlen(szCurFile)) {
lstrcpy(szFileName,szCurFile);
PathQuoteSpaces(szFileName);
lstrcat(szParameters," ");
lstrcat(szParameters,szFileName);
}
ShellExecute(hwnd,NULL,szModuleName,szParameters,NULL,SW_SHOWNORMAL);
}
break;
case IDM_FILE_LAUNCH:
{
SHELLEXECUTEINFO sei;
if (!lstrlen(szCurFile))
break;
if (bSaveBeforeRunningTools && !FileSave(FALSE,TRUE,FALSE,FALSE))
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?