В связи с граблями при регистрации richtx32.ocx (для неспециалиста), есть потребность использовать RichTextBox в диалоговом окне макроса, работающего под MS Word БЕЗ использования richtx32.ocx. Насколько я понимаю, OCX - это прокладка между DLL и VBA. Вот и появилась мысль убрать этот самый OCX - нарисовать RichTextBox при помощи API и как-то с ним общаться... Общение через API с буфером обмена у меня получилось, а вот с RichTextBox пока никак...
Нужно создать элемент RichTextBox в диалоговом окне MS Word, вставить в созданный элемент текст - это вроде бы есть в примере ниже... и получить текст обратно после изменения пользователем (закинуть в буфер обмена, чтобы сохранился RTF).
Приведу пример решения очень схожей задачи с какого-то французского форума, просто чтобы понятно было о каком уровне идёт речь. Французские комментарии перевёл я. Указанный код создаёт RichTextBox и вытаскивает "голый текст" из RTF. Работает в MSAccess. Собственно, это часть решения, но сильно неполная... В MS Word сия функция не запускается хотя бы по причине отсутствия HwndAccessApp - я не работал с API и не знаю чем его заменить в MS Word.
Кто умеет на таком уровне работать?
| Код | Option Explicit Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Declare Function CreateWindowEx Lib "user32" Alias _ "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String _ , ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long _ , ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long _ , ByVal hwndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long _ , lpParam As Any) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long Private Const WC_RICHEDIT1 = "RichEdit" Private Const WC_RICHEDIT2 = "RichEdit20A" Private Const WS_CHILD = &H40000000 Private Const ES_MULTILINE = &H4& Private Const WM_SETTEXT = &HC Private Const WM_GETTEXT = &HD Private Const WM_GETTEXTLENGTH = &HE Function RTFtoTEXT(pRTF As String) As String Dim lLen As Long Dim ltext As String Dim lClass As String Dim lHwnd As Long On Error GoTo Gestion_Erreurs ' Загрузка библиотеки ' cf http://msdn2.microsoft.com/en-us/library/bb787873(VS.85).aspx If LoadLibrary("Riched20.dll") > 32 Then lClass = WC_RICHEDIT2 ElseIf LoadLibrary("Riched32.dll") > 32 Then lClass = WC_RICHEDIT1 End If ' Создает окно с текстовым редактором lHwnd = CreateWindowEx(0, lClass, vbNullString, _ WS_CHILD Or ES_MULTILINE, 0, 0, 0, 0, Application.HwndAccessApp, 0&, 0&, ByVal 0&) ' Внедряет текст в элементе управления SendMessage lHwnd, WM_SETTEXT, Len(pRTF), ByVal pRTF ' Читает текст без тегов в формате RTF lLen = SendMessage(lHwnd, WM_GETTEXTLENGTH, 0, ByVal 0) ltext = Space(lLen + 1) ltext = Left(ltext, SendMessage(lHwnd, WM_GETTEXT, lLen + 1, ByVal ltext)) RTFtoTEXT = ltext Gestion_Erreurs: ' Удаляет контрол DestroyWindow lHwnd End Function
|
|