Добавление текста в RichTextBox так, чтобы при фокусе на нем не было автоматического скроллирования - VB
Формулировка задачи:
Проблема: добавление текста в вышеназваный контролл так, чтобы при фокусе на нем не было автоматического скроллирования.
Поясню: есть RichTextBox, в нем есть некое кол-во текста, форматированного. Чтобы форматирование не исчезало при добавлении текста, обычно ставят каретку ввода на самый конец файла (SelStart=len(text)). Однако при этом ричтекстбокс непременно будет скроллироваться вниз, что крайне нежелательно.
Есть способ с помощью АПИ: EM_EXSETSEL (выделяю текст), затем EM_REPLACESEL ('вставляю' текст) и даю команду ричэдиту на форматирование (например, SelColor=vbRed). Отлично, код работает! Однако, если я в это время переведу фокус на ричэдит, то в нем появляется каретка ввода и при выделении EM_EXSETSEL окно опять скроллируется вниз... а ведь при всем при этом нужна возможность спокойно копировать текст из окна в то время, как другой текст вставлялся бы в конец и форматировался под некие требования. Как решить эту проблему?
На данный момент была осуществлена попытка создать сабклассинг и ловля сообщения WM_VSCROLL. Упрощенный алгоритм: запоминание позиции ползунка скролла, потом вставка нужного текста, форматирование, и снова возврат ползунка на исходную позицию. Однако вот беда: в wRaram содержится позиция бегунка только когда я его мышкой непосредственно передвину! А если я пользуюсь 'стрелочками' на полосе прокрутки? Или, скажем, с помощью скролла мыши? Как быть?
И еще вопрос вдогонку: как вставить туда картинку так, чтобы ее нельзя было ресайзить мышкой? Аналог - клиент ICQ, там сделано как раз так, как мне нужно, т.е. картинка не ресайзится, и можно спокойно вводить текст, редактировать и т.д. Как они так сделали?
Заранее благодарен.
PS попытки обсудить эту проблему на http://bbs.vbstreets.ru/viewtopic.php?t=12917 к сожалению, не увенчались успехом...
Решение задачи: «Добавление текста в RichTextBox так, чтобы при фокусе на нем не было автоматического скроллирования»
textual
Листинг программы
INSERTFIXEDIMAGE_API BOOL WINAPI InsertFSImage(HWND hRichEdit, CHAR* FilePath) { IRichEditOle* ppObject = NULL; REOBJECT myObj; SendMessage(hRichEdit, EM_GETOLEINTERFACE, 0, (LPARAM) &ppObject); ZeroMemory(&myObj, sizeof(REOBJECT)); SCODE sc; IOleClientSite *pOleClientSite = NULL; IStorage *pStorage = NULL; ILockBytes *pLockBytes = NULL; IOleObject *pOleObject = NULL; CLSID clsid; sc = CreateILockBytesOnHGlobal(0, TRUE, &pLockBytes); if (sc != S_OK) { //MessageBox(0, 'pLock could not be resolved. CreateILockBytesOnHGlobal failed', NULL, 0); goto ppr; } sc = StgCreateDocfileOnILockBytes(pLockBytes, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage); if (sc != S_OK) { //MessageBox(0, 'pStorage could not be resolved. StgCreateDocfileOnILockBytes failed', NULL, 0); pLockBytes->Release(); goto ppr; } sc = ppObject->GetClientSite(&pOleClientSite); if (sc != S_OK) { //MessageBox(0, 'pOleClientSite could not be resolved. GetClientSite method of IRichEditOle failed', NULL, 0); pLockBytes->Release(); pStorage->Release(); goto ppr; } sc = OleCreateFromFile(CLSID_NULL, (LPCOLESTR)FilePath, IID_IOleObject, OLERENDER_DRAW, NULL, pOleClientSite, pStorage, (LPVOID*) &pOleObject); if (sc != S_OK) { //MessageBox(0, 'pOleObject could not be resolved. OleCreateFromFile failed', NULL, 0); pLockBytes->Release(); pStorage->Release(); pOleClientSite->Release(); goto ppr; } pOleObject->GetUserClassID(&clsid); if (IsEqualCLSID(clsid, CLSID_NULL)) { //MessageBox(0, 'Cannot get correct clsid', NULL, 0); pLockBytes->Release(); pStorage->Release(); pOleClientSite->Release(); pOleObject->Release(); goto ppr; } myObj.cbStruct = sizeof(REOBJECT); myObj.cp = REO_CP_SELECTION; myObj.dvaspect = DVASPECT_CONTENT; myObj.clsid = clsid; myObj.polesite = pOleClientSite; myObj.poleobj = pOleObject; myObj.pstg = pStorage; myObj.dwFlags = REO_DYNAMICSIZE; ppObject->InsertObject(&myObj); pOleObject->Update(); sc = S_OK; pOleClientSite->Release(); pOleObject->Release(); pStorage->Release(); pLockBytes->Release(); ppr: ppObject->Release(); return (sc == S_OK); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д