LRESULT CALLBACK EDIT_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_KEYDOWN: case WM_KEYUP: { switch (wParam) { case VK_UP: case VK_DOWN: case VK_LEFT: case VK_RIGHT: DIALOG_StatusBarUpdateCaretPos(); break; } } case WM_LBUTTONUP: { DIALOG_StatusBarUpdateCaretPos(); break; } } return CallWindowProc( (WNDPROC)Globals.EditProc, hWnd, msg, wParam, lParam); }
VOID DoCreateStatusBar(VOID) { RECT rc; RECT rcstatus; BOOL bStatusBarVisible; /* Check if status bar object already exists. */ if (Globals.hStatusBar == NULL) { /* Try to create the status bar */ Globals.hStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_EX_STATICEDGE, NULL, Globals.hMainWnd, CMD_STATUSBAR_WND_ID); if (Globals.hStatusBar == NULL) { ShowLastError(); return; } /* Load the string for formatting column/row text output */ LoadString(Globals.hInstance, STRING_LINE_COLUMN, Globals.szStatusBarLineCol, MAX_PATH - 1); /* Set the status bar for single-text output */ SendMessage(Globals.hStatusBar, SB_SIMPLE, (WPARAM)TRUE, (LPARAM)0); } /* Set status bar visiblity according to the settings. */ if (Globals.bWrapLongLines == TRUE || Globals.bShowStatusBar == FALSE) { bStatusBarVisible = FALSE; ShowWindow(Globals.hStatusBar, SW_HIDE); } else { bStatusBarVisible = TRUE; ShowWindow(Globals.hStatusBar, SW_SHOW); SendMessage(Globals.hStatusBar, WM_SIZE, 0, 0); } /* Set check state in show status bar item. */ if (bStatusBarVisible) { CheckMenuItem(Globals.hMenu, CMD_STATUSBAR, MF_BYCOMMAND | MF_CHECKED); } else { CheckMenuItem(Globals.hMenu, CMD_STATUSBAR, MF_BYCOMMAND | MF_UNCHECKED); } /* Update menu mar with the previous changes */ DrawMenuBar(Globals.hMainWnd); /* Sefety test is edit control exists */ if (Globals.hEdit != NULL) { /* Retrieve the sizes of the controls */ GetClientRect(Globals.hMainWnd, &rc); GetClientRect(Globals.hStatusBar, &rcstatus); /* If status bar is currently visible, update dimensions of edit control */ if (bStatusBarVisible) rc.bottom -= (rcstatus.bottom - rcstatus.top); /* Resize edit control to right size. */ MoveWindow(Globals.hEdit, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); } /* Update content with current row/column text */ DIALOG_StatusBarUpdateCaretPos(); }
/*********************************************************************** * * NOTEPAD_WndProc */ static LRESULT WINAPI NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: Globals.hMenu = GetMenu(hWnd); break; case WM_COMMAND: if (HIWORD(wParam) == EN_CHANGE || HIWORD(wParam) == EN_HSCROLL || HIWORD(wParam) == EN_VSCROLL) DIALOG_StatusBarUpdateCaretPos(); if ((HIWORD(wParam) == EN_CHANGE)) NOTEPAD_EnableSearchMenu(); NOTEPAD_MenuCommand(LOWORD(wParam)); break; case WM_DESTROYCLIPBOARD: /*MessageBox(Globals.hMainWnd, "Empty clipboard", "Debug", MB_ICONEXCLAMATION);*/ break; case WM_CLOSE: if (DoCloseFile()) { if (Globals.hFont) DeleteObject(Globals.hFont); DestroyWindow(hWnd); } break; case WM_QUERYENDSESSION: if (DoCloseFile()) { return 1; } break; case WM_DESTROY: SetWindowLongPtr(Globals.hEdit, GWLP_WNDPROC, (LONG_PTR)Globals.EditProc); SaveSettings(); PostQuitMessage(0); break; case WM_SIZE: { if (Globals.bShowStatusBar == TRUE && Globals.bWrapLongLines == FALSE) { RECT rcStatusBar; HDWP hdwp; if (!GetWindowRect(Globals.hStatusBar, &rcStatusBar)) break; hdwp = BeginDeferWindowPos(2); if (hdwp == NULL) break; hdwp = DeferWindowPos(hdwp, Globals.hEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam) - (rcStatusBar.bottom - rcStatusBar.top), SWP_NOZORDER | SWP_NOMOVE); if (hdwp == NULL) break; hdwp = DeferWindowPos(hdwp, Globals.hStatusBar, NULL, 0, 0, LOWORD(lParam), LOWORD(wParam), SWP_NOZORDER); if (hdwp != NULL) EndDeferWindowPos(hdwp); } else SetWindowPos(Globals.hEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOZORDER | SWP_NOMOVE); break; } // The entire client area is covered by edit control and by // the status bar. So there is no need to erase main background. // This resolves the horrible fliker effect during windows resizes. case WM_ERASEBKGND: return 1; case WM_SETFOCUS: SetFocus(Globals.hEdit); break; case WM_DROPFILES: { TCHAR szFileName[MAX_PATH]; HDROP hDrop = (HDROP) wParam; DragQueryFile(hDrop, 0, szFileName, SIZEOF(szFileName)); DragFinish(hDrop); DoOpenFile(szFileName); break; } case WM_CHAR: case WM_INITMENUPOPUP: NOTEPAD_InitMenuPopup((HMENU)wParam, lParam); break; default: if (msg == aFINDMSGSTRING) { FINDREPLACE *pFindReplace = (FINDREPLACE *) lParam; Globals.find = *(FINDREPLACE *) lParam; if (pFindReplace->Flags & FR_FINDNEXT) NOTEPAD_FindNext(pFindReplace, FALSE, TRUE); else if (pFindReplace->Flags & FR_REPLACE) NOTEPAD_FindNext(pFindReplace, TRUE, TRUE); else if (pFindReplace->Flags & FR_REPLACEALL) NOTEPAD_ReplaceAll(pFindReplace); else if (pFindReplace->Flags & FR_DIALOGTERM) NOTEPAD_FindTerm(); break; } return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }