[visual basic 2005] Stampare il contenuto di una richtextbox con font ...

lunedì 30 luglio 2007 - 08.54

platino Profilo | Junior Member

salve a tutti.
Ho bisogno di creare un pulsante con il quale cambio il carattere del testo selezionato di una richtextbox. Qual è ilo codice, ammettendo ke la richtextbox ha per nome "richtextbox1", il pulsante "button1" e il fontdialog "fontdialog1"

Le domande però non sono ancora finite.
Ho bisogno anche di stampare il contenuto di una richtextbox. Fino qui ci siamo, ma quando il carattere delle parole della richtextbox cambiano (in grasseto), lui mi stampa in testo normale.
Il codice ke ho usato è il seguente:

Per il button
Me.PrtStampa.print
Per il printdocument:
e.graphics.drawing (Me.richtextbox1.text, Me.font, Brushes.black, 60,250)

Secondo me il problema deriva dal codice tra parentesi.

Come risolvo???





_____platino_____

SSUPERPIPPO Profilo | Guru


>salve a tutti.

Caro amico, ciao.

>Ho bisogno di creare un pulsante con il quale cambio il carattere del testo selezionato di una richtextbox. Qual è ilo codice, >ammettendo ke la richtextbox ha per nome "richtextbox1", il pulsante "button1" e il fontdialog "fontdialog1"

' Apre il fontdialog e in caso di conferma del font selezionato modifica il font relativo al testo selezioanto nella richtextbox

If Me.FontDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
Me.RichTextBox1.SelectionFont = Me.FontDialog1.Font
End If

>Le domande però non sono ancora finite.
>Ho bisogno anche di stampare il contenuto di una richtextbox. Fino qui ci siamo, ma quando il carattere delle parole della >richtextbox cambiano (in grasseto), lui mi stampa in testo normale.
>Il codice ke ho usato è il seguente:

>Per il button
>Me.PrtStampa.print
>Per il printdocument:
>e.graphics.drawing (Me.richtextbox1.text, Me.font, Brushes.black, 60,250)

>Secondo me il problema deriva dal codice tra parentesi.

>Come risolvo???

Qui l'affare si fa serio...

vai a questo link http://support.microsoft.com/kb/811401
troverai quello che ti server.


>_____platino_____

Se hai bisogno di aiuto sono sempre a disposizione.

Ciao

Alessandro

platino Profilo | Junior Member

ciao. ho gia provato con quel codice, ma niente.
t prego aiutami.
senti...ora devo andare a dormire.
Te rispondimi lo stesso troverari la risposta domani mattina.
controlla il thread, mi raccomando!!!


buona notte

SSUPERPIPPO Profilo | Guru

Hai problemi nella modifica del font nella richtextbox oppure nella stampa?

platino Profilo | Junior Member

io ho problemi nella stampa: mi stampa in un solo carattere (Times New Roman) e io vorrei ke mi stampasse in tutti i caratteri ke contiene la richtextbox (anche in grassetto)



_____platino_____

SSUPERPIPPO Profilo | Guru

Ma hai già provato seguendo quanto indicato al link

http://support.microsoft.com/kb/811401 ?

platino Profilo | Junior Member

si



_____platino_____

SSUPERPIPPO Profilo | Guru

Allora, ho appena provato io seguendo passo passo le istruzioni del link che ti ho riportato (un pò a fatica considerata la traduzione indegna..! ).
Funziona alla perfezione!

Cerco di sintetizzarti la procedura:

PRIMA PARTE (Genera la libreria):

1. Crea un nuovo progetto come Libreria di Classi.
2. Rinomina la classe predefinita che viene proposta come 'Class1' in 'RichTextBoxPrintCtrl'
3. Elimina tutto il codice (proprio tutto), contenuto nella classe
4. Copia il seguente codice (così come stà)

Option Explicit On

Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Runtime.InteropServices
Imports System.Drawing.Printing

Namespace RichTextBoxPrintCtrl
Public Class RichTextBoxPrintCtrl
Inherits RichTextBox
' Convert the unit that is used by the .NET framework (1/100 inch)
' and the unit that is used by Win32 API calls (twips 1/1440 inch)
Private Const AnInch As Double = 14.4

<StructLayout(LayoutKind.Sequential)> _
Private Structure RECT
Public Left As Integer
Public Top As Integer
Public Right As Integer
Public Bottom As Integer
End Structure

<StructLayout(LayoutKind.Sequential)> _
Private Structure CHARRANGE
Public cpMin As Integer ' First character of range (0 for start of doc)
Public cpMax As Integer ' Last character of range (-1 for end of doc)
End Structure

<StructLayout(LayoutKind.Sequential)> _
Private Structure FORMATRANGE
Public hdc As IntPtr ' Actual DC to draw on
Public hdcTarget As IntPtr ' Target DC for determining text formatting
Public rc As Rect ' Region of the DC to draw to (in twips)
Public rcPage As Rect ' Region of the whole DC (page size) (in twips)
Public chrg As CHARRANGE ' Range of text to draw (see above declaration)
End Structure

Private Const WM_USER As Integer = &H400
Private Const EM_FORMATRANGE As Integer = WM_USER + 57

Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wp As IntPtr, ByVal lp As IntPtr) As IntPtr

' Render the contents of the RichTextBox for printing
' Return the last character printed + 1 (printing start from this point for next page)
Public Function Print(ByVal charFrom As Integer, ByVal charTo As Integer, ByVal e As PrintPageEventArgs) As Integer

' Mark starting and ending character
Dim cRange As CHARRANGE
cRange.cpMin = charFrom
cRange.cpMax = charTo

' Calculate the area to render and print
Dim rectToPrint As RECT
rectToPrint.Top = e.MarginBounds.Top * AnInch
rectToPrint.Bottom = e.MarginBounds.Bottom * AnInch
rectToPrint.Left = e.MarginBounds.Left * AnInch
rectToPrint.Right = e.MarginBounds.Right * AnInch

' Calculate the size of the page
Dim rectPage As RECT
rectPage.Top = e.PageBounds.Top * AnInch
rectPage.Bottom = e.PageBounds.Bottom * AnInch
rectPage.Left = e.PageBounds.Left * AnInch
rectPage.Right = e.PageBounds.Right * AnInch

Dim hdc As IntPtr = e.Graphics.GetHdc()

Dim fmtRange As FORMATRANGE
fmtRange.chrg = cRange ' Indicate character from to character to
fmtRange.hdc = hdc ' Use the same DC for measuring and rendering
fmtRange.hdcTarget = hdc ' Point at printer hDC
fmtRange.rc = rectToPrint ' Indicate the area on page to print
fmtRange.rcPage = rectPage ' Indicate whole size of page

Dim res As IntPtr = IntPtr.Zero

Dim wparam As IntPtr = IntPtr.Zero
wparam = New IntPtr(1)

' Move the pointer to the FORMATRANGE structure in memory
Dim lparam As IntPtr = IntPtr.Zero
lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange))
Marshal.StructureToPtr(fmtRange, lparam, False)

' Send the rendered data for printing
res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam)

' Free the block of memory allocated
Marshal.FreeCoTaskMem(lparam)

' Release the device context handle obtained by a previous call
e.Graphics.ReleaseHdc(hdc)

' Return last + 1 character printer
Return res.ToInt32()
End Function

End Class
End Namespace

5. Genera la libreria di classe dal menù Genera

SECONDA PARTE (Crea il form)

1. Apri un nuovo progetto Windows Form
2. Dal menu Strumenti seleziona 'Scegli elementi della casella degli strumenti'...
3. Dal tabs 'Componenti di .NET Frameword' clicca sul pulsante Sfoglia...
4. Trova il file DLL generato precedentemente (lo troverai nella cartella del progetto RichTextBoxPrintCtrl\BIN)
5. Una volta aggiunto il componente lo troverai nella barra degli strumenti tra i componenti aggiuntivi (in fondo in basso)
6. Trascina il nuovo controllo aggiunto in Form1
7. Trascina il componente PrintDocument1
7. Trascina i componenti PrintDialog1, PrintPreviewDialog1 e PageSetupDialog1
8. Cambia la proprietà Document di questi ultimi tre controlli selezionado 'PrintDocument1'
9. Crea tre pulsanti e cambia la loro proprietà name rispettivamente in btnPrintPreview, btnPrint,btnPageSetup
10. Cambia anche la loro proprietà text in Anteprima, Stampa, Imposta pagina
11. Ora visualizza il codice di Form1 ed eliminalo completamente
12. Copia integralmente il codice qui di seguito

Imports System
Imports System.IO
Imports System.Drawing
Imports System.Net.Mail

Public Class Form1

Private checkPrint As Integer

Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
checkPrint = 0
End Sub

Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
' Print the content of the RichTextBox. Store the last character printed.
checkPrint = RichTextBoxPrintCtrl1.Print(checkPrint, RichTextBoxPrintCtrl1.TextLength, e)

' Look for more pages
If checkPrint < RichTextBoxPrintCtrl1.TextLength Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
End Sub

Private Sub btnPageSetup_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPageSetup.Click
PageSetupDialog1.ShowDialog()
End Sub

Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
If PrintDialog1.ShowDialog() = DialogResult.OK Then
PrintDocument1.Print()
End If
End Sub

Private Sub btnPrintPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrintPreview.Click
PrintPreviewDialog1.ShowDialog()
End Sub

End Class

Ora puoi eseguire il progetto, scrivi quello che vuoi nella richtextbox e prova i pulsanti anteprima e stampa.
Potrai ora aggiungere altri pulsanti e istruzioni per modificare i font della tua richtextbox come già spiegato nelle precedenti puntate.

Fai molta attenzione a rispettare tutti i passaggi e a impostare i nomi dei controlli come indicato.
Una volta che hai preso confidenza potrai personalizzare il tuo form come preferisci.
Funziona che è una meraviglia!

Fammi sapere, ciao

Alessandro

platino Profilo | Junior Member

Grazie 1000000000000000000000000000000000000

sai a 13 anni e mezzo non si puo' conoscere in tutti i particolari un linguaggio di programmazione come vb.

Sei un genio, grazie

Come potrò sdebitarmi?



_____platino_____

SSUPERPIPPO Profilo | Guru

Ma sei giovanissimo...

mi sembra di rivedere me alla tua età...

Ciao

Alessandro

P.S.: Chiudi il post con accetta risposta
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5