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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы