Добавление текста в 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);
}