Добавление текста в 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
Листинг программы
  1. INSERTFIXEDIMAGE_API BOOL WINAPI InsertFSImage(HWND hRichEdit, CHAR* FilePath)
  2. {
  3.     IRichEditOle* ppObject = NULL;
  4.     REOBJECT myObj;
  5.     SendMessage(hRichEdit, EM_GETOLEINTERFACE, 0, (LPARAM) &ppObject);
  6.  
  7.     ZeroMemory(&myObj, sizeof(REOBJECT));
  8.  
  9.     SCODE sc;
  10.     IOleClientSite *pOleClientSite = NULL;
  11.     IStorage *pStorage = NULL;
  12.     ILockBytes *pLockBytes = NULL;
  13.     IOleObject *pOleObject = NULL;
  14.     CLSID clsid;
  15.    
  16.     sc = CreateILockBytesOnHGlobal(0, TRUE, &pLockBytes);
  17.     if (sc != S_OK) {
  18.         //MessageBox(0, 'pLock could not be resolved. CreateILockBytesOnHGlobal failed', NULL, 0);
  19.         goto ppr;
  20.     }
  21.     sc = StgCreateDocfileOnILockBytes(pLockBytes, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
  22.     if (sc != S_OK) {
  23.         //MessageBox(0, 'pStorage could not be resolved. StgCreateDocfileOnILockBytes failed', NULL, 0);
  24.         pLockBytes->Release();
  25.         goto ppr;
  26.     }
  27.     sc = ppObject->GetClientSite(&pOleClientSite);
  28.     if (sc != S_OK) {
  29.         //MessageBox(0, 'pOleClientSite could not be resolved. GetClientSite method of IRichEditOle failed', NULL, 0);
  30.         pLockBytes->Release();
  31.         pStorage->Release();
  32.         goto ppr;
  33.     }
  34.     sc = OleCreateFromFile(CLSID_NULL, (LPCOLESTR)FilePath, IID_IOleObject, OLERENDER_DRAW, NULL, pOleClientSite, pStorage, (LPVOID*) &pOleObject);
  35.     if (sc != S_OK) {
  36.         //MessageBox(0, 'pOleObject could not be resolved. OleCreateFromFile failed', NULL, 0);
  37.         pLockBytes->Release();
  38.         pStorage->Release();
  39.         pOleClientSite->Release();
  40.         goto ppr;
  41.     }
  42.     pOleObject->GetUserClassID(&clsid);
  43.     if (IsEqualCLSID(clsid, CLSID_NULL)) {
  44.         //MessageBox(0, 'Cannot get correct clsid', NULL, 0);
  45.         pLockBytes->Release();
  46.         pStorage->Release();
  47.         pOleClientSite->Release();
  48.         pOleObject->Release();
  49.         goto ppr;
  50.     }
  51.     myObj.cbStruct = sizeof(REOBJECT);
  52.     myObj.cp = REO_CP_SELECTION;
  53.     myObj.dvaspect = DVASPECT_CONTENT;
  54.     myObj.clsid = clsid;
  55.     myObj.polesite = pOleClientSite;
  56.     myObj.poleobj = pOleObject;
  57.     myObj.pstg = pStorage;
  58.     myObj.dwFlags = REO_DYNAMICSIZE;
  59.  
  60.     ppObject->InsertObject(&myObj);
  61.     pOleObject->Update();
  62.     sc = S_OK;
  63.     pOleClientSite->Release();     
  64.     pOleObject->Release();
  65.     pStorage->Release();
  66.     pLockBytes->Release();
  67. ppr:
  68.     ppObject->Release();
  69.     return (sc == S_OK);
  70. }

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


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

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

12   голосов , оценка 3.917 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы