// selects all text in an edit box if it's selected either // through a keyboard shortcut or a non-selecting mouse click // (or responds to Ctrl+Backspace as nowadays expected) bool ExtendedEditWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { UNUSED(lParam); static bool delayFocus = false; switch (message) { case WM_LBUTTONDOWN: delayFocus = GetFocus() != hwnd; return true; case WM_LBUTTONUP: if (delayFocus) { DWORD sel = Edit_GetSel(hwnd); if (LOWORD(sel) == HIWORD(sel)) PostMessage(hwnd, UWM_DELAYED_SET_FOCUS, 0, 0); delayFocus = false; } return true; case WM_KILLFOCUS: return false; // for easier debugging (make setting a breakpoint possible) case WM_SETFOCUS: if (!delayFocus) PostMessage(hwnd, UWM_DELAYED_SET_FOCUS, 0, 0); return true; case UWM_DELAYED_SET_FOCUS: Edit_SelectAll(hwnd); return true; case WM_KEYDOWN: if (VK_BACK != wParam || !IsCtrlPressed() || IsShiftPressed()) return false; PostMessage(hwnd, UWM_DELAYED_CTRL_BACK, 0, 0); return true; case UWM_DELAYED_CTRL_BACK: { ScopedMem<WCHAR> text(win::GetText(hwnd)); int selStart = LOWORD(Edit_GetSel(hwnd)), selEnd = selStart; // remove the rectangle produced by Ctrl+Backspace if (selStart > 0 && text[selStart - 1] == '\x7F') { memmove(text + selStart - 1, text + selStart, str::Len(text + selStart - 1) * sizeof(WCHAR)); win::SetText(hwnd, text); selStart = selEnd = selStart - 1; } // remove the previous word (and any spacing after it) for (; selStart > 0 && str::IsWs(text[selStart - 1]); selStart--); for (; selStart > 0 && !str::IsWs(text[selStart - 1]); selStart--); Edit_SetSel(hwnd, selStart, selEnd); SendMessage(hwnd, WM_CLEAR, 0, 0); } return true; default: return false; } }
char *GetFirstLine (char *pszLine) { char szLineBuffer [iMaxLineLength]; int iEndSel = HIWORD (Edit_GetSel (hEditWnd)); int iCopyCount; int iLineNr; register int i; /* lese akt. Zeile */ for (i = 0; i < sizeof (szLineBuffer); i++) szLineBuffer [i] = '\0'; iLineNr = Edit_LineFromChar (hEditWnd, iEndSel); Edit_GetLine (hEditWnd, iLineNr, szLineBuffer, sizeof (szLineBuffer) -1); /* berechne Indizes für Kopieren des sel. Strings */ iEndSel -= Edit_LineIndex (hEditWnd, iLineNr); /* berechne Anz. zu kopierender Zeichen */ iCopyCount = strlen (szLineBuffer) - iEndSel; /* überflüssige Zeichen überschreiben */ memmove (szLineBuffer, szLineBuffer+iEndSel, iCopyCount); szLineBuffer [iCopyCount] = '\0'; // setze Endekennzeichen /* in Zielstring kopieren */ strcpy (pszLine, szLineBuffer); return (pszLine); }
static void current_path_to_edit (void) { int cur; HWND manpath = GetDlgItem(hMainWindow, IDC_MANPATH); cur = LOWORD(Edit_GetSel (manpath)); Edit_SetText (manpath, CurrentPath); Edit_SetSel (manpath, cur, cur); }
/* Text suchen und selektieten Punkt übergeben */ BOOL SearchText (char* pszKeyStr, POINT* pPoint) { register int i; int iEnd; char szLine [iMaxLineLength]; char *pszAktPos; int iStart = HIWORD (Edit_GetSel (hEditWnd)); int iLineNr = Edit_LineFromChar (hEditWnd, iStart); int iMaxLineNr = Edit_GetLineCount (hEditWnd); int iLineLength = Edit_LineLength (hEditWnd, iStart); /* 1. (akt.) Zeile untersuchen */ if (iLineLength) { for (i = 0; i < sizeof (szLine); i++) szLine [i] = '\0'; GetFirstLine (szLine); if (pszAktPos = CompareStrings (szLine, pszKeyStr)) { iStart += pszAktPos - szLine; iEnd = iStart + strlen (pszKeyStr); pPoint->x = iStart; pPoint->y = iEnd; return (TRUE); } else iStart += strlen (szLine) + 2; // einschl. 0D0A } else iStart += 2; /* alle restlichen Zeilen untersuchen */ for (++iLineNr; iLineNr < iMaxLineNr; iLineNr++) { if (iLineLength = Edit_LineLength (hEditWnd, iStart)) { for (i = 0; i < sizeof (szLine); i++) szLine [i] = '\0'; Edit_GetLine (hEditWnd, iLineNr, szLine, sizeof (szLine) -1); if (pszAktPos = CompareStrings (szLine, pszKeyStr)) { iStart += pszAktPos - szLine; iEnd = iStart + strlen (pszKeyStr); pPoint->x = iStart; pPoint->y = iEnd; return (TRUE); } else iStart += iLineLength + 2; } else iStart += 2; } /* Punkt auf ungültigen Wert setzen */ pPoint->x = -1; pPoint->y = -1; return (FALSE); }
/* This function writes the appropriate signature for the specified * topic. */ void FASTCALL SetEditSignature( HWND hwndEdit, PTL ptl ) { LPSTR lpszSignature; char * pszSig; pszSig = NULL; if( NULL == ptl ) pszSig = szGlobalSig; else { TOPICINFO topicinfo; Amdb_GetTopicInfo( ptl, &topicinfo ); if( topicinfo.szSigFile[ 0 ] ) pszSig = topicinfo.szSigFile; } if( NULL != pszSig ) if( NULL != ( lpszSignature = GetEditSignature( pszSig ) ) ) { DWORD dwSig1Sel; /* Save the caret position and append the signature to the end of the * current text. Then put the caret back where it was. */ dwSig1Sel = Edit_GetSel( hwndEdit ); if( fEditAtTop ) { Edit_SetSel( hwndEdit, 0, 0 ); Edit_ReplaceSel( hwndEdit, lpszSignature ); Edit_SetSel( hwndEdit, 0, 0 ); Edit_ScrollCaret( hwndEdit ); } else { Edit_SetSel( hwndEdit, USHRT_MAX, USHRT_MAX ); Edit_ReplaceSel( hwndEdit, lpszSignature ); Edit_SetSel( hwndEdit, LOWORD(dwSig1Sel), HIWORD(dwSig1Sel) ); } FreeMemory( &lpszSignature ); } }
/* Selektierten Text lesen */ char *GetSelectedText (char *pszResultText, int iMaxCopy) { char szLineBuffer [iMaxLineLength]; DWORD dwSel = Edit_GetSel (hEditWnd); int iAnfSel = LOWORD (dwSel); int iEndSel = HIWORD (dwSel); int iCopyCount; int iLineNr; register int i; iCopyCount = iEndSel - iAnfSel; if (iCopyCount) { /* akt. Zeile lesen */ for (i = 0; i < sizeof (szLineBuffer); i++) szLineBuffer [i] = '\0'; iLineNr = Edit_LineFromChar (hEditWnd, -1); Edit_GetLine (hEditWnd, iLineNr, szLineBuffer, sizeof (szLineBuffer) -1); /* berechne Indizes für Kopieren des sel. Strings */ iAnfSel -= Edit_LineIndex (hEditWnd, iLineNr); /* korrigiere ggf. Anz. zu kopierender Zeichen */ if (Edit_LineFromChar (hEditWnd, iEndSel) != iLineNr) { iEndSel = strlen (szLineBuffer); iCopyCount = iEndSel - iAnfSel; } /* begrenze ggf. Anz. zu kopierender Zeichen */ if (iCopyCount > iMaxCopy) iCopyCount = iMaxCopy; /* überflüssige Zeichen überschreiben */ memmove (szLineBuffer, szLineBuffer+iAnfSel, iCopyCount); szLineBuffer [iCopyCount] = '\0'; // setze Endekennzeichen /* in Zielstring kopieren */ strcpy (pszResultText, szLineBuffer); } return (pszResultText); }
INT_PTR CDialogManage::CTabSkins::OnCommand(WPARAM wParam, LPARAM lParam) { if (!m_HandleCommands) { // Values are being changed/reset, no need to apply changes return FALSE; } switch (LOWORD(wParam)) { case IDC_MANAGESKINS_ACTIVESKINS_BUTTON: { HMENU menu = CreatePopupMenu(); // Add active skins to menu std::map<std::wstring, CMeterWindow*>::const_iterator iter = Rainmeter->GetAllMeterWindows().begin(); int index = 0; for ( ; iter != Rainmeter->GetAllMeterWindows().end(); ++iter) { std::wstring name = ((*iter).second)->GetFolderPath() + L'\\'; name += ((*iter).second)->GetFileName(); InsertMenu(menu, index, MF_BYPOSITION, ID_CONFIG_FIRST + index, name.c_str()); ++index; } if (index > 0) { RECT r; GetWindowRect((HWND)lParam, &r); // Show context menu TrackPopupMenu( menu, TPM_RIGHTBUTTON | TPM_LEFTALIGN, (*GetString(ID_STR_ISRTL) == L'1') ? r.right : r.left, --r.bottom, 0, m_Window, NULL ); } DestroyMenu(menu); } break; case IDC_MANAGESKINS_CREATEPACKAGE_BUTTON: { std::wstring file = Rainmeter->GetPath() + L"SkinInstaller.exe"; RunFile(file.c_str(), L"/Packager"); } break; case IDC_MANAGESKINS_LOAD_BUTTON: { if (!m_SkinWindow) { // Skin not active, load std::pair<int, int> indexes = Rainmeter->GetMeterWindowIndex(m_SkinFolderPath, m_SkinFileName); if (indexes.first != -1 && indexes.second != -1) { Rainmeter->ActivateSkin(indexes.first, indexes.second); // Fake selection change to update controls NMHDR nm; nm.code = TVN_SELCHANGED; nm.idFrom = IDC_MANAGESKINS_SKINS_TREEVIEW; nm.hwndFrom = GetDlgItem(m_Window, IDC_MANAGESKINS_SKINS_TREEVIEW); OnNotify(0, (LPARAM)&nm); } } else { m_HandleCommands = false; Rainmeter->DeactivateSkin(m_SkinWindow, -1); } } break; case IDC_MANAGESKINS_REFRESH_BUTTON: if (m_SkinWindow) { m_SkinWindow->Refresh(false); } break; case IDC_MANAGESKINS_EDIT_BUTTON: Rainmeter->EditSkinFile(m_SkinFolderPath, m_SkinFileName); break; case IDC_MANAGESKINS_X_TEXT: if (HIWORD(wParam) == EN_CHANGE) { WCHAR buffer[32]; m_IgnoreUpdate = true; int x = (GetWindowText((HWND)lParam, buffer, 32) > 0) ? _wtoi(buffer) : 0; m_SkinWindow->MoveWindow(x, m_SkinWindow->GetY()); if (x > m_SkinWindow->GetX()) { _itow_s(m_SkinWindow->GetX(), buffer, 10); Edit_SetText((HWND)lParam, buffer); } } break; case IDC_MANAGESKINS_Y_TEXT: if (HIWORD(wParam) == EN_CHANGE) { WCHAR buffer[32]; m_IgnoreUpdate = true; int y = (GetWindowText((HWND)lParam, buffer, 32) > 0) ? _wtoi(buffer) : 0; m_SkinWindow->MoveWindow(m_SkinWindow->GetX(), y); if (y > m_SkinWindow->GetY()) { _itow_s(m_SkinWindow->GetY(), buffer, 10); Edit_SetText((HWND)lParam, buffer); } } break; case IDC_MANAGESKINS_LOADORDER_TEXT: if (HIWORD(wParam) == EN_CHANGE) { if (m_IgnoreUpdate) { // To avoid infinite loop after setting value below m_IgnoreUpdate = false; } else { // Convert text to number and set it to get rid of extra chars WCHAR buffer[32]; int len = GetWindowText((HWND)lParam, buffer, 32); if ((len == 0) || (len == 1 && buffer[0] == L'-')) { // Ignore if empty or if - is only char break; } // Get selection DWORD sel = Edit_GetSel((HWND)lParam); // Reset value (to get rid of invalid chars) m_IgnoreUpdate = true; int value = _wtoi(buffer); _itow_s(value, buffer, 10); SetWindowText((HWND)lParam, buffer); // Reset selection Edit_SetSel((HWND)lParam, LOWORD(sel), HIWORD(sel)); WritePrivateProfileString(m_SkinFolderPath.c_str(), L"LoadOrder", buffer, Rainmeter->GetIniFile().c_str()); std::pair<int, int> indexes = Rainmeter->GetMeterWindowIndex(m_SkinWindow); if (indexes.first != -1) { Rainmeter->SetLoadOrder(indexes.first, value); std::multimap<int, CMeterWindow*> windows; Rainmeter->GetMeterWindowsByLoadOrder(windows); CSystem::PrepareHelperWindow(); // Reorder window z-position to reflect load order std::multimap<int, CMeterWindow*>::const_iterator iter = windows.begin(); for ( ; iter != windows.end(); ++iter) { CMeterWindow* mw = (*iter).second; mw->ChangeZPos(mw->GetWindowZPosition(), true); } } } } break; case IDC_MANAGESKINS_DISPLAYMONITOR_BUTTON: { HMENU menu = LoadMenu(Rainmeter->GetResourceInstance(), MAKEINTRESOURCE(IDR_SKIN_MENU)); if (menu) { HMENU subMenu = GetSubMenu(menu, 0); // Skin menu subMenu = GetSubMenu(subMenu, 4); // Settings menu subMenu = GetSubMenu(subMenu, 0); // Position menu subMenu = GetSubMenu(subMenu, 0); // Display monitor menu Rainmeter->CreateMonitorMenu(subMenu, m_SkinWindow); RECT r; GetWindowRect((HWND)lParam, &r); // Show context menu TrackPopupMenu( subMenu, TPM_RIGHTBUTTON | TPM_LEFTALIGN, (*GetString(ID_STR_ISRTL) == L'1') ? r.right : r.left, --r.bottom, 0, m_Window, NULL ); DestroyMenu(menu); } } break; case IDC_MANAGESKINS_DRAGGABLE_CHECKBOX: m_IgnoreUpdate = true; m_SkinWindow->SetWindowDraggable(!m_SkinWindow->GetWindowDraggable()); break; case IDC_MANAGESKINS_CLICKTHROUGH_CHECKBOX: m_IgnoreUpdate = true; m_SkinWindow->SetClickThrough(!m_SkinWindow->GetClickThrough()); break; case IDC_MANAGESKINS_KEEPONSCREEN_CHECKBOX: m_IgnoreUpdate = true; m_SkinWindow->SetKeepOnScreen(!m_SkinWindow->GetKeepOnScreen()); break; case IDC_MANAGESKINS_SAVEPOSITION_CHECKBOX: m_IgnoreUpdate = true; m_SkinWindow->SetSavePosition(!m_SkinWindow->GetSavePosition()); break; case IDC_MANAGESKINS_SNAPTOEDGES_CHECKBOX: m_IgnoreUpdate = true; m_SkinWindow->SetSnapEdges(!m_SkinWindow->GetSnapEdges()); break; case IDC_MANAGESKINS_ZPOSITION_COMBOBOX: if (HIWORD(wParam) == CBN_SELCHANGE) { m_IgnoreUpdate = true; ZPOSITION zpos = (ZPOSITION)(ComboBox_GetCurSel((HWND)lParam) - 2); m_SkinWindow->SetWindowZPosition(zpos); } break; case IDC_MANAGESKINS_TRANSPARENCY_COMBOBOX: if (HIWORD(wParam) == CBN_SELCHANGE) { m_IgnoreUpdate = true; int sel = ComboBox_GetCurSel((HWND)lParam) + IDM_SKIN_TRANSPARENCY_0; SendMessage(m_SkinWindow->GetWindow(), WM_COMMAND, sel, 0); } break; case IDC_MANAGESKINS_ONHOVER_COMBOBOX: if (HIWORD(wParam) == CBN_SELCHANGE) { m_IgnoreUpdate = true; HIDEMODE hide = (HIDEMODE)ComboBox_GetCurSel((HWND)lParam); m_SkinWindow->SetWindowHide(hide); } break; case IDM_MANAGESKINSMENU_EXPAND: { HWND tree = GetDlgItem(m_Window, IDC_MANAGESKINS_SKINS_TREEVIEW); HTREEITEM item = TreeView_GetSelection(tree); TreeView_Expand(tree, item, TVE_TOGGLE); } break; case IDM_MANAGESKINSMENU_OPENFOLDER: { HWND tree = GetDlgItem(m_Window, IDC_MANAGESKINS_SKINS_TREEVIEW); Rainmeter->OpenSkinFolder(GetTreeSelectionPath(tree)); } break; default: if (wParam >= ID_CONFIG_FIRST && wParam <= ID_CONFIG_LAST) { std::map<std::wstring, CMeterWindow*>::const_iterator iter = Rainmeter->GetAllMeterWindows().begin(); int index = (int)wParam - ID_CONFIG_FIRST; int i = 0; for ( ; iter != Rainmeter->GetAllMeterWindows().end(); ++iter) { if (i == index) { std::wstring name = ((*iter).second)->GetFolderPath() + L'\\'; name += ((*iter).second)->GetFileName(); HWND item = GetDlgItem(m_Window, IDC_MANAGESKINS_SKINS_TREEVIEW); SelectTreeItem(item, TreeView_GetRoot(item), name.c_str()); break; } ++i; } } else if (wParam == IDM_SKIN_MONITOR_AUTOSELECT || wParam == IDM_SKIN_MONITOR_PRIMARY || wParam >= ID_MONITOR_FIRST && wParam <= ID_MONITOR_LAST) { if (m_SkinWindow) { SendMessage(m_SkinWindow->GetWindow(), WM_COMMAND, wParam, 0); } break; } return 1; } return 0; }
INT_PTR CDialogPackage::CTabOptions::OnCommand(WPARAM wParam, LPARAM lParam) { switch (LOWORD(wParam)) { case IDC_PACKAGEOPTIONS_FILEBROWSE_BUTTON: { WCHAR buffer[MAX_PATH]; HWND item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_FILE_EDIT); GetWindowText(item, buffer, _countof(buffer)); OPENFILENAME ofn = { sizeof(OPENFILENAME) }; ofn.lpstrFilter = L"Rainmeter skin package (.rmskin)\0*.rmskin"; ofn.lpstrTitle = L"Select Rainmeter skin package"; ofn.lpstrDefExt = L"dll"; ofn.lpstrFile = buffer; ofn.nMaxFile = _countof(buffer); ofn.hwndOwner = c_Dialog->GetWindow(); if (GetOpenFileName(&ofn)) { c_Dialog->m_TargetFile = buffer; SetWindowText(item, buffer); } } break; case IDC_PACKAGEOPTIONS_DONOTHING_RADIO: { HWND item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADSKIN_EDIT); ShowWindow(item, SW_HIDE); item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADSKINBROWSE_BUTTON); ShowWindow(item, SW_HIDE); item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADTHEME_COMBO); ShowWindow(item, SW_HIDE); c_Dialog->m_Load.clear(); } break; case IDC_PACKAGEOPTIONS_LOADSKIN_RADIO: { HWND item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADSKIN_EDIT); ShowWindow(item, SW_SHOWNORMAL); WCHAR buffer[MAX_PATH]; GetWindowText(item, buffer, _countof(buffer)); c_Dialog->m_Load = buffer; c_Dialog->m_LoadLayout = false; item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADSKINBROWSE_BUTTON); ShowWindow(item, SW_SHOWNORMAL); item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADTHEME_COMBO); ShowWindow(item, SW_HIDE); } break; case IDC_PACKAGEOPTIONS_LOADTHEME_RADIO: { HWND item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADSKIN_EDIT); ShowWindow(item, SW_HIDE); item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADSKINBROWSE_BUTTON); ShowWindow(item, SW_HIDE); item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADTHEME_COMBO); ShowWindow(item, SW_SHOWNORMAL); WCHAR buffer[MAX_PATH]; GetWindowText(item, buffer, _countof(buffer)); c_Dialog->m_Load = buffer; c_Dialog->m_LoadLayout = true; } break; case IDC_PACKAGEOPTIONS_LOADSKINBROWSE_BUTTON: { WCHAR buffer[MAX_PATH]; HWND item = GetDlgItem(m_Window, IDC_PACKAGEOPTIONS_LOADSKIN_EDIT); GetWindowText(item, buffer, _countof(buffer)); OPENFILENAME ofn = { sizeof(OPENFILENAME) }; ofn.Flags = OFN_FILEMUSTEXIST; ofn.FlagsEx = OFN_EX_NOPLACESBAR; ofn.lpstrFilter = L"Rainmeter skin file (.ini)\0*.ini"; ofn.lpstrTitle = L"Select Rainmeter skin file"; ofn.lpstrDefExt = L"ini"; ofn.lpstrFile = buffer; ofn.nMaxFile = _countof(buffer); ofn.lpstrInitialDir = c_Dialog->m_SkinFolder.second.c_str(); ofn.hwndOwner = c_Dialog->GetWindow(); if (GetOpenFileName(&ofn)) { // Make sure user didn't browse to some random folder if (_wcsnicmp(ofn.lpstrInitialDir, buffer, c_Dialog->m_SkinFolder.second.length()) == 0) { // Skip everything before actual skin folder const WCHAR* folderPath = buffer + c_Dialog->m_SkinFolder.second.length() - c_Dialog->m_SkinFolder.first.length() - 1; SetWindowText(item, folderPath); c_Dialog->m_Load = folderPath; } } } break; case IDC_PACKAGEOPTIONS_RAINMETERVERSION_EDIT: if (HIWORD(wParam) == EN_CHANGE) { WCHAR buffer[32]; GetWindowText((HWND)lParam, buffer, _countof(buffer)); // Get caret position DWORD sel = Edit_GetSel((HWND)lParam); // Only allow numbers and period WCHAR* version = buffer; while (*version) { if (iswdigit(*version) || *version == L'.') { ++version; } else { *version = L'\0'; SetWindowText((HWND)lParam, buffer); // Reset caret position Edit_SetSel((HWND)lParam, LOWORD(sel), HIWORD(sel)); break; } } c_Dialog->m_MinimumRainmeter = buffer; } break; case IDC_PACKAGEOPTIONS_WINDOWSVERSION_COMBO: if (HIWORD(wParam) == CBN_SELCHANGE) { int sel = ComboBox_GetCurSel((HWND)lParam); c_Dialog->m_MinimumWindows = g_OsNameVersions[sel].version; } break; default: return FALSE; } return TRUE; }
void CEditBox::GetSel(LPDWORD pStart, LPDWORD pEnd) { Edit_GetSel(this->GetHWnd(), pStart, pEnd); }
void TextEditor::GetContents() { _contentsLength = GetWindowText(_editControlHandle, _contents, MAX_FILE_LENGTH); _caret = (int)LOWORD(Edit_GetSel(_editControlHandle)); }
/* This function locates the old signature in the specified edit * control and replaces it with the new one. */ void FASTCALL ReplaceEditSignature( HWND hwndEdit, char * pszOldSig, char * pszNewSig, BOOL fTop ) { LPSTR lpszOldSigText; LPSTR lpszNewSigText; UINT cbEdit; /* Get some lengths. Skip the replacement if * the signature is smaller than the edit text. */ cbEdit = Edit_GetTextLength( hwndEdit ); if( NULL != ( lpszOldSigText = GetEditSignature( pszOldSig ) ) ) { if( NULL != ( lpszNewSigText = GetEditSignature( pszNewSig ) ) ) { if( strlen(lpszOldSigText) <= cbEdit ) { LPSTR lpText; INITIALISE_PTR(lpText); if( fNewMemory( &lpText, cbEdit + 1 ) ) { DWORD sel; int nOldSig; int selEnd; int selStart; /* Get the edit control contents. */ sel = Edit_GetSel( hwndEdit ); selStart = LOWORD(sel); selEnd = HIWORD(sel); Edit_GetText( hwndEdit, lpText, cbEdit+1 ); nOldSig = FStrMatch( lpText, lpszOldSigText, TRUE, FALSE ); #ifdef USEBIGEDIT SetWindowRedraw( hwndEdit, FALSE ); #endif USEBIGEDIT if( -1 != nOldSig ) { Edit_SetSel( hwndEdit, nOldSig, nOldSig + strlen(lpszOldSigText) ); Edit_ReplaceSel( hwndEdit, lpszNewSigText ); } else { /* Not found, so go to end of edit text and append new * signature there. */ if( fTop ) Edit_SetSel( hwndEdit, 0, 0 ); else Edit_SetSel( hwndEdit, 32767, 32767 ); Edit_ReplaceSel( hwndEdit, lpszNewSigText ); } Edit_SetSel( hwndEdit, selStart, selEnd ); #ifdef USEBIGEDIT SetWindowRedraw( hwndEdit, TRUE ); #endif USEBIGEDIT UpdateWindow( hwndEdit ); FreeMemory( &lpText ); } } FreeMemory( &lpszNewSigText ); } FreeMemory( &lpszOldSigText ); } }