Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Mark

Проблема с RichTextBox под Windows 2000 или Windows XP

20.12.2009, 17:22. Показов 1684. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код , который прекрасно работает под Windows 98 .
На Picture1 приклеевается RichTextBox и отпечатывается Picture1 .

-----------------------------------------------------------------------------------------------------------
Option Explicit

Private Declare Function SendMessage Lib 'user32' Alias _
'SendMessageA' (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const WM_PAINT = &HF
Private Const WM_PRINT = &H317
Private Const PRF_CLIENT = &H4& ' Draw the window's client area
Private Const PRF_CHILDREN = &H10& ' Draw all visible child
Private Const PRF_OWNED = &H20& ' Draw all owned windows

Private Sub Command1_Click()
RichTextBox1.OLEObjects.Add , , 'c:windows riangles.bmp'

Picture1.SetFocus
Picture1.AutoRedraw = True
rv = SendMessage(Picture1.hwnd, WM_PAINT, Picture1.hDC, 0)
rv = SendMessage(Picture1.hwnd, WM_PRINT, Picture1.hDC, _
PRF_CHILDREN + PRF_CLIENT + PRF_OWNED)
Picture1.Picture = Picture1.Image
Picture1.AutoRedraw = False

Printer.PaintPicture Picture1.Image, 1, 1
Printer.EndDoc
End Sub
-----------------------------------------------------------------------------------------------------------
Но при переходе под Windows 2000 или Windows XP код почему-то не работает.
RichTextBox не появляется на Picture1.
Может кто-то сталкивался с этой проблемой.
Или знает как по-другому отпечатать отредактированный RichTextBox.
Заранее спасибо.
Марк. mark_str@km.ru
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.12.2009, 17:22
Ответы с готовыми решениями:

Хочу сделать программу невидимой для Windows XP или Windows 2000 или Windows NT
Ya hochu sdelat` programu nevidimuyu na Windows XP ili Windows 2000 ili Windows NT Nashel funkciu dlya Windows 9x, amne nuzno dlya vise...

Windows 2000 Prof: не работает прога под Windows 95/98
Подскажите, плз, как это дело побороть (а может сразу - в морг?)... Ругается на msvcrt.dll. Заменял длл-ку от 98-го - не помогло :( Есть...

Как установить Windows 2000 Или Windows nt Через флешку
Как установить Windows 2000 Или Windows nt Через флешку!У меня нетбук и нет дисковода!

2
0 / 0 / 0
Регистрация: 21.10.2006
Сообщений: 7
03.01.2010, 23:35
'Честно сознаюсь - основная идея не моя - нарыл где-то в Internet, а вот аранжировка - моя...

Option Explicit

'Примечание: Microsoft RichTextBox обеспечивает печать самого себя
'с помощью метода .SelPrint.
'К сожалению, данный метод не позволяет никоим образом вмешаться
'в процесс, например для печати на загловков страницы или установки
'отступов от края листа. Данный пример решает эту проблему,
'т.к. теперь Вы имеете полный контроль над процессом печати.

Private Const mFontName As String = 'Courier New Cyr'
Private Const cTvip As Single = 56.7 'Твипов на мм
Private bStopRtfPrint As Boolean 'Тормозим печать
Private bError As Boolean 'Ошибка печати

Public Type SIZE
cx As Long
cy As Long
End Type

Public Type RECT
left As Long
top As Long
right As Long
bottom As Long
End Type

Public Type CharRange
cpMin As Long ' First character of range (0 for start of doc)
cpMax As Long ' Last character of range (-1 for end of doc)
End Type

Public Type FormatRange
hDC As Long ' Actual DC to draw on
hdcTarget As Long ' Target DC for determining text formatting
rc As RECT ' Region of the DC to draw to (in twips)
rcPage As RECT ' Region of the entire DC (page size) (in twips)
chrg As CharRange ' Range of text to draw (see above declaration)
End Type

Public Const LOGPIXELSX = 88
Public Const LOGPIXELSY = 90
Public Const PHYSICALOFFSETX As Long = 112
Public Const PHYSICALOFFSETY As Long = 113

Public Const WM_USER As Long = &H400
Public Const EM_FORMATRANGE As Long = WM_USER + 57

'' DrawText() Format Flags
Public Const DT_TOP = &H0
Public Const DT_LEFT = &H0
Public Const DT_CENTER = &H1
Public Const DT_RIGHT = &H2
Public Const DT_VCENTER = &H4
Public Const DT_BOTTOM = &H8
Public Const DT_WORDBREAK = &H10
Public Const DT_SINGLELINE = &H20
Public Const DT_EXPANDTABS = &H40
Public Const DT_TABSTOP = &H80
Public Const DT_NOCLIP = &H100
Public Const DT_EXTERNALLEADING = &H200
Public Const DT_CALCRECT = &H400
Public Const DT_NOPREFIX = &H800
Public Const DT_INTERNAL = &H1000
'------------

'Declare Sub InflateRect Lib 'user' (lpRect As RECT, ByVal X%, ByVal Y%)
Declare Sub InflateRect Lib 'user32' (lpRect As RECT, ByVal X%, ByVal Y%)
Public Declare Function DrawText& Lib 'user32' Alias 'DrawTextA' (ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long)
Declare Function GetDeviceCaps Lib 'gdi32' (ByVal hDC As Long, ByVal nIndex As Long) As Long
Declare Function SendMessage Lib 'user32' Alias 'SendMessageA' (ByVal hwnd As Long, ByVal msg As Long, ByVal wp As Long, lp As Any) As Long

'--------- Печать текста RTF -------------
Public Sub PrintRTF(RTF As RichTextBox, Optional ByVal LeftMarginWidth As Long = 20, Optional ByVal TopMarginHeight As Long = 10, Optional ByVal RightMarginWidth As Long = 10, Optional ByVal BottomMarginHeight As Long = 10, Optional ByVal bPagesAll As Boolean = True, Optional ByVal lPagesNum As Long = 1)
Dim LeftOffset As Long, TopOffset As Long
Dim LeftMargin As Long, TopMargin As Long
Dim RightMargin As Long, BottomMargin As Long
Dim fr As FormatRange
Dim rcDrawTo As RECT, rcPage As RECT
Dim TextLength As Long, NextCharPos As Long
Dim lPagesCounter As Long 'Число напечатанных страниц
lPagesCounter = 0

MmToTwip LeftMarginWidth, TopMarginHeight, RightMarginWidth, BottomMarginHeight 'переводим из мм ttomMargin As Long
Dim fr As FormatRange
Dim rcDrawTo As RECT
Dim rcPage As RECT
Dim NextCharPos As Long

'переводим из мм в Твипы ----------
MmToTwip LeftMarginWidth, TopMarginHeight, RightMarginWidth, BottomMarginHeight
'--------------------------------------
bStopRtfPrint = False


oOut.ScaleMode = vbTwips
NextCharPos = 0

' Get the offsett to the printable area on the page in twips
LeftOffset = GetDeviceCaps(oOut.hDC, PHYSICALOFFSETX) / GetDeviceCaps(oOut.hDC, LOGPIXELSX) * 1440
TopOffset = GetDeviceCaps(oOut.hDC, PHYSICALOFFSETY) / GetDeviceCaps(oOut.hDC, LOGPIXELSY) * 1440


' Calculate the Left, Top, Right, and Bottom margins
LeftMargin = LeftMarginWidth - LeftOffset
TopMargin = TopMarginHeight - TopOffset
RightMargin = (oOut.Width - RightMarginWidth) - LeftOffset
BottomMargin = (oOut.Height - BottomMarginHeight) - TopOffset

rcPage.left = 0
rcPage.top = 0
rcPage.right = oOut.ScaleWidth
rcPage.bottom = oOut.ScaleHeight

' Set rect in which to print (relative to printable area)
rcDrawTo.left = LeftMargin
rcDrawTo.top = TopMargin
rcDrawTo.right = RightMargin
rcDrawTo.bottom = BottomMargin

' Set up the print instructions
fr.hDC = oOut.hDC ' Use the same DC for measuring and rendering
fr.hdcTarget = oOut.hDC ' Point at oOut hDC
'fr.chrg.cpMin = NextCharPos ' Indicate start of text through
fr.chrg.cpMin = 0 ' Indicate start of text through
fr.chrg.cpMax = -1 ' end of the text
fr.rc = rcDrawTo ' Indicate the area on page to draw to
fr.rcPage = rcPage ' Indicate entire size of page

'oOut.FontSize = 6
oOut.Print Space(1); ' Re-initialize hDC

'NextCharPos = SendMessage(RTF.hwnd, EM_FORMATRANGE, True, fr) ' Print the page by sending EM_FORMATRANGE message
SendMessage RTF.hwnd, EM_FORMATRANGE, True, fr ' Print the page by sending EM_FORMATRANGE message
'Debug.Print 'OUT EM_FORMATRANGE'; EM_FORMATRANGE
DoEvents
SendMessage RTF.hwnd, EM_FORMATRANGE, False, ByVal CLng(0) 'Похоже восстанавливает исходный RTF
Exit Sub
OutRTFSingleBad:
bError = True
End Sub

'----------- Нет ошибок принтера -----------
Public Sub PrintErrorNo()
bError = False
End Sub

Public Function PrintError() As Boolean
PrintError = bError
End Function

'------ Печать одной страницы без перевода листа -----------
Public Sub PrintRTFSingle(RTF As RichTextBox, Optional ByVal LeftMarginWidth As Long = 20, Optional ByVal TopMarginHeight As Long = 10, Optional ByVal RightMarginWidth As Long = 10, Optional ByVal BottomMarginHeight As Long = 10)
On Error GoTo PrintRTFSingleBad:
Dim LeftOffset As Long
Dim TopOffset As Long
Dim LeftMargin As Long
Dim TopMargin As Long
Dim RightMargin As Long
Dim BottomMargin As Long
Dim fr As FormatRange
Dim rcDrawTo As RECT
Dim rcPage As RECT
'Dim TextLength As Long
Dim NextCharPos As Long
'Dim lPagesCounter As Long 'Число напечатанных страниц
'lPagesCounter = 0

'переводим из мм в Твипы ----------
LeftMarginWidth = LeftMarginWidth * cTvip
TopMarginHeight = TopMarginHeight * cTvip
RightMarginWidth = RightMarginWidth * cTvip
BottomMarginHeight = BottomMarginHeight * cTvip
'MmToTwip LeftMarginWidth, TopMarginHeight, RightMarginWidth, BottomMarginHeight
'--------------------------------------

bStopRtfPrint = False

NextCharPos = 0
Printer.ScaleMode = vbTwips
<BR
0
0 / 0 / 0
Регистрация: 21.10.2006
Сообщений: 7
03.01.2010, 23:41
P&S Совсем забыл... Приведенный выше метод печати к сожалению почему-то не всегда 'дружит' с принтерами подключенными к сети через собственную сетевую плату (т.е без компьютера). С чем это связано и как бороться я так и не понял..
Если кто разберется - напишите ....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.01.2010, 23:41
Помогаю со студенческими работами здесь

Проблемма с установкой Perl под Веб сервер для IIS под Windows 2000 Professional
Помогите с установкой Perl под Веб сервер для IIS под Windows 2000 Professional Мои действия 1.Установил...

Как запустить asp-страницы, разработанные под PWS и Win98, под Windows 2000 Server?
Как запустить asp-страницы, разработанные под PWS и Win98, под Windows 2000 Server! Есть там встроенный Web-сервер? Какое программное...

Проблема после установки Windows 2000 !!!
Может мне помочь в следующей проблеме: Обновил на своем PC OS (Windows98 на Windows2000), установил заново VB, MSDN, и т.д. Запускаю...

Сеть под Windows 2000
привет всем... вот такой вопрос. на машине имеется 2 сетевых интерфейса... на одном из них локалка - 192.168.0.0/255.255.255.0 - 1...

Эмуляция стиля Windows XP или Windows 7 под восьмеркой
Добрый день! Подскажите, пожалуйста, есть ли под Window 8 способ сэмулировать интерфейсы программ как Windows XP или 7? Имеется в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru