📄 notepad2.c
字号:
if (wi.y < mi.rcWork.top)
wi.y = mi.rcWork.top;
if (wi.x + wi.cx > mi.rcWork.right) {
wi.x -= (wi.x + wi.cx - mi.rcWork.right);
if (wi.x < mi.rcWork.left)
wi.x = mi.rcWork.left;
if (wi.x + wi.cx > mi.rcWork.right)
wi.cx = mi.rcWork.right - wi.x;
}
if (wi.y + wi.cy > mi.rcWork.bottom) {
wi.y -= (wi.y + wi.cy - mi.rcWork.bottom);
if (wi.y < mi.rcWork.top)
wi.y = mi.rcWork.top;
if (wi.y + wi.cy > mi.rcWork.bottom)
wi.cy = mi.rcWork.bottom - wi.y;
}
SetRect(&rc,wi.x,wi.y,wi.x+wi.cx,wi.y+wi.cy);
if (!IntersectRect(&rc2,&rc,&mi.rcWork)) {
wi.y = mi.rcWork.top + 16;
wi.cy = mi.rcWork.bottom - mi.rcWork.top - 32;
wi.cx = min(mi.rcWork.right - mi.rcWork.left - 32,wi.cy);
wi.x = mi.rcWork.right - wi.cx - 16;
}
}
hwndMain = CreateWindowEx(
0,
(!flagPasteBoard) ? WC_NOTEPAD2 : WC_NOTEPAD2PASTEBOARD,
"Notepad2",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
wi.x,
wi.y,
wi.cx,
wi.cy,
NULL,
NULL,
hInstance,
NULL);
if (wi.max)
nCmdShow = SW_SHOWMAXIMIZED;
if (bAlwaysOnTop)
SetWindowPos(hwndMain,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
if (bTransparentMode)
SetWindowTransparentMode(hwndMain,TRUE);
// Current file information -- moved in front of ShowWindow()
FileLoad(TRUE,TRUE,FALSE,FALSE,"");
if (!flagStartAsTrayIcon) {
ShowWindow(hwndMain,nCmdShow);
UpdateWindow(hwndMain);
}
else {
ShowWindow(hwndMain,SW_HIDE); // trick ShowWindow()
ShowNotifyIcon(hwndMain,TRUE);
}
// Pathname parameter
if (lpFileArg /*&& !flagNewFromClipboard*/)
{
// Open from Directory
if (PathIsDirectory(lpFileArg))
{
char tchFile[MAX_PATH];
if (OpenFileDlg(hwndMain,tchFile,COUNTOF(tchFile),lpFileArg))
FileLoad(FALSE,FALSE,FALSE,FALSE,tchFile);
}
else {
if (FileLoad(FALSE,FALSE,FALSE,FALSE,lpFileArg)) {
if (flagJumpTo) // Jump to position
EditJumpTo(hwndEdit,iInitialLine,iInitialColumn);
}
}
GlobalFree(lpFileArg);
}
// Check for /c [if no file is specified] -- even if a file is specified
/*else */if (flagNewFromClipboard) {
if (SendMessage(hwndEdit,SCI_CANPASTE,0,0)) {
BOOL bAutoIndent2 = bAutoIndent;
bAutoIndent = 0;
EditJumpTo(hwndEdit,-1,0);
SendMessage(hwndEdit,SCI_BEGINUNDOACTION,0,0);
if (SendMessage(hwndEdit,SCI_GETLENGTH,0,0) > 0)
SendMessage(hwndEdit,SCI_NEWLINE,0,0);
SendMessage(hwndEdit,SCI_PASTE,0,0);
SendMessage(hwndEdit,SCI_NEWLINE,0,0);
SendMessage(hwndEdit,SCI_ENDUNDOACTION,0,0);
bAutoIndent = bAutoIndent2;
}
}
// Check for Paste Board option -- after loading files
if (flagPasteBoard) {
bLastCopyFromMe = TRUE;
hwndNextCBChain = SetClipboardViewer(hwndMain);
uidsAppTitle = IDS_APPTITLE_PASTEBOARD;
SetWindowTitle(hwndMain,uidsAppTitle,IDS_UNTITLED,szCurFile,
iPathNameFormat,bModified || iCodePage != iInitialCP,
IDS_READONLY,bReadOnly);
bLastCopyFromMe = FALSE;
}
// check if a lexer was specified from the command line
if (flagLexerSpecified) {
if (iInitialLexer >=0 && iInitialLexer < NUMLEXERS)
Style_SetLexerFromID(hwndEdit,iInitialLexer);
}
// If start as tray icon, set current filename as tooltip
if (flagStartAsTrayIcon)
SetNotifyIconTitle(hwndMain);
// Toolbar
UpdateToolbar();
// Statusbar
UpdateStatusbar();
return(hwndMain);
}
//=============================================================================
//
// MainWndProc()
//
// Messages are distributed to the MsgXXX-handlers
//
//
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
{
static BOOL bHideIcon = FALSE;
switch(umsg)
{
// Quickly handle painting and sizing messages, found in ScintillaWin.cxx
// Cool idea, don't know if this has any effect... ;-)
case WM_MOVE:
case WM_MOUSEACTIVATE:
case WM_NCHITTEST:
case WM_NCCALCSIZE:
case WM_NCPAINT:
case WM_PAINT:
case WM_ERASEBKGND:
case WM_NCMOUSEMOVE:
case WM_NCLBUTTONDOWN:
case WM_WINDOWPOSCHANGING:
case WM_WINDOWPOSCHANGED:
return DefWindowProc(hwnd,umsg,wParam,lParam);
case WM_CREATE:
return MsgCreate(hwnd,wParam,lParam);
case WM_DESTROY:
{
WINDOWPLACEMENT wndpl;
// Terminate file watching
InstallFileWatching(NULL);
// GetWindowPlacement
wndpl.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hwnd,&wndpl);
wi.x = wndpl.rcNormalPosition.left;
wi.y = wndpl.rcNormalPosition.top;
wi.cx = wndpl.rcNormalPosition.right - wndpl.rcNormalPosition.left;
wi.cy = wndpl.rcNormalPosition.bottom - wndpl.rcNormalPosition.top;
wi.max = (IsZoomed(hwnd) || (wndpl.flags & WPF_RESTORETOMAXIMIZED));
DragAcceptFiles(hwnd,FALSE);
// Restore clipboard chain...
if (flagPasteBoard)
ChangeClipboardChain(hwnd,hwndNextCBChain);
// Destroy find / replace dialog
if (IsWindow(hDlgFindReplace))
DestroyWindow(hDlgFindReplace);
// call SaveSettings() when hwndToolbar is still valid
SaveSettings(FALSE);
// Cleanup unwanted MRU's
if (!bSaveRecentFiles)
MRU_Empty(pFileMRU);
MRU_Save(pFileMRU);
MRU_Destroy(pFileMRU);
if (!bSaveFindReplace) {
MRU_Empty(mruFind);
MRU_Empty(mruReplace);
}
MRU_Save(mruFind);
MRU_Destroy(mruFind);
MRU_Save(mruReplace);
MRU_Destroy(mruReplace);
// Remove tray icon if necessary
ShowNotifyIcon(hwnd,FALSE);
PostQuitMessage(0);
}
break;
case WM_CLOSE:
if (FileSave(FALSE,TRUE,FALSE,FALSE))
DestroyWindow(hwnd);
break;
case WM_QUERYENDSESSION:
if (FileSave(FALSE,TRUE,FALSE,FALSE))
return TRUE;
else
return FALSE;
// Reinitialize theme-dependent values and resize windows
case 0x031A /*WM_THEMECHANGED*/:
MsgThemeChanged(hwnd,wParam,lParam);
break;
// update Scintilla colors
case WM_SYSCOLORCHANGE:
{
extern PEDITLEXER pLexCurrent;
Style_SetLexer(hwndEdit,pLexCurrent);
return DefWindowProc(hwnd,umsg,wParam,lParam);
}
//case WM_TIMER:
// break;
case WM_SIZE:
MsgSize(hwnd,wParam,lParam);
break;
case WM_SETFOCUS:
SetFocus(hwndEdit);
//if (bPendingChangeNotify)
// PostMessage(hwnd,WM_CHANGENOTIFY,0,0);
break;
case WM_DROPFILES:
{
char szBuf[MAX_PATH+40];
HDROP hDrop = (HDROP)wParam;
// Reset Change Notify
//bPendingChangeNotify = FALSE;
if (IsIconic(hwnd))
ShowWindow(hwnd,SW_RESTORE);
//SetForegroundWindow(hwnd);
DragQueryFile(hDrop,0,szBuf,COUNTOF(szBuf));
FileLoad(FALSE,FALSE,FALSE,FALSE,szBuf);
if (DragQueryFile(hDrop,(UINT)(-1),NULL,0) > 1)
MsgBox(MBINFO,IDS_ERR_DROP);
DragFinish(hDrop);
}
break;
case WM_COPYDATA:
{
PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam;
// Reset Change Notify
//bPendingChangeNotify = FALSE;
if (pcds->dwData == DATA_NOTEPAD2_FILEARG)
{
LPSTR lpsz = LocalAlloc(LPTR,pcds->cbData);
CopyMemory(lpsz,pcds->lpData,pcds->cbData);
FileLoad(FALSE,FALSE,FALSE,FALSE,lpsz);
LocalFree(lpsz);
}
}
return TRUE;
case WM_CONTEXTMENU:
{
HMENU hmenu;
int imenu = 0;
POINT pt;
int nID = GetDlgCtrlID((HWND)wParam);
if ((nID != IDC_EDIT) && (nID != IDC_STATUSBAR) &&
(nID != IDC_REBAR) && (nID != IDC_TOOLBAR))
return DefWindowProc(hwnd,umsg,wParam,lParam);
hmenu = LoadMenu(g_hInstance,MAKEINTRESOURCE(IDR_POPUPMENU));
//SetMenuDefaultItem(GetSubMenu(hmenu,1),0,FALSE);
pt.x = (int)(short)LOWORD(lParam);
pt.y = (int)(short)HIWORD(lParam);
switch(nID)
{
case IDC_EDIT:
{
int iSelStart = SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
int iSelEnd = SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0);
if (iSelStart == iSelEnd && pt.x != -1 && pt.y != -1)
{
int iNewPos;
POINT ptc = { pt.x, pt.y };
ScreenToClient(hwndEdit,&ptc);
iNewPos = SendMessage(hwndEdit,SCI_POSITIONFROMPOINT,(WPARAM)ptc.x,(LPARAM)ptc.y);
SendMessage(hwndEdit,SCI_GOTOPOS,(WPARAM)iNewPos,0);
}
if (pt.x == -1 && pt.y == -1)
{
int iCurrentPos = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
pt.x = SendMessage(hwndEdit,SCI_POINTXFROMPOSITION,0,(LPARAM)iCurrentPos);
pt.y = SendMessage(hwndEdit,SCI_POINTYFROMPOSITION,0,(LPARAM)iCurrentPos);
ClientToScreen(hwndEdit,&pt);
}
imenu = 0;
}
break;
case IDC_TOOLBAR:
case IDC_STATUSBAR:
case IDC_REBAR:
if (pt.x == -1 && pt.y == -1)
GetCursorPos(&pt);
imenu = 1;
break;
}
TrackPopupMenuEx(GetSubMenu(hmenu,imenu),
TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x+1,pt.y+1,hwnd,NULL);
DestroyMenu(hmenu);
}
break;
case WM_INITMENU:
MsgInitMenu(hwnd,wParam,lParam);
break;
case WM_NOTIFY:
return MsgNotify(hwnd,wParam,lParam);
case WM_COMMAND:
return MsgCommand(hwnd,wParam,lParam);
case WM_SYSCOMMAND:
switch (wParam)
{
case SC_MINIMIZE:
ShowOwnedPopups(hwnd,FALSE);
if (bMinimizeToTray) {
MinimizeWndToTray(hwnd);
ShowNotifyIcon(hwnd,TRUE);
SetNotifyIconTitle(hwnd);
return(0);
}
else
return DefWindowProc(hwnd,umsg,wParam,lParam);
case SC_RESTORE: {
LRESULT lrv = DefWindowProc(hwnd,umsg,wParam,lParam);
ShowOwnedPopups(hwnd,TRUE);
return(lrv);
}
}
return DefWindowProc(hwnd,umsg,wParam,lParam);
case WM_CHANGENOTIFY:
SetForegroundWindow(hwnd);
if (PathFileExists(szCurFile)) {
if (MsgBox(MBYESNO,IDS_FILECHANGENOTIFY) == IDYES)
FileLoad(TRUE,FALSE,TRUE,FALSE,szCurFile);
}
else {
if (MsgBox(MBYESNO,IDS_FILECHANGENOTIFY2) == IDYES)
FileSave(TRUE,FALSE,FALSE,FALSE);
}
if (!bRunningWatch)
InstallFileWatching(szCurFile);
break;
//// This message is posted before Notepad2 reactivates itself
//case WM_CHANGENOTIFYCLEAR:
// bPendingChangeNotify = FALSE;
// break;
case WM_DRAWCLIPBOARD:
if (!bLastCopyFromMe) {
if (SendMessage(hwndEdit,SCI_CANPASTE,0,0)) {
BOOL bAutoIndent2 = bAutoIndent;
bAutoIndent = 0;
EditJumpTo(hwndEdit,-1,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -