Добавление текста в 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);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д