Gå til innhold

Printe med fonts og farger


Anbefalte innlegg

Skrevet

Jeg lager en Rich Text program, men jeg har et lite problem med printe funksjonen.

Når jeg printer ut kommer det ikke noe bilder eller farger eller teksttyper, bare vanlig kjedelig skrift med liten skriftstørelse.

Hvordan kan jeg gjøre sånn at jeg får printa ut forskjellige fonts, farger og bilder?

Koden min:

		PrintDialog1.Document = PrintDocument1
	If PrintDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
		PrintDocument1.Print()
	End If

Videoannonse
Annonse
Skrevet

Den ble aldri særlig bra, så jeg tror du hadde sagt nei takk :p Hehe. Jeg kan se om jeg finner den på jobben i morra, så kan jeg slenge ut prinsippet i alle fall.

Skrevet

Printer du fra Rich textbox kontrollen?

Da må du isåfall sette fonten der.

 

Fonten settes når dokumentet rendres, altså i Document.Print eventet eller hva det nå en er.

 

Så det er i funksjonen som blir kalt av Document.Print som setter fonten.

Skrevet

public System.Drawing.Printing.PrintDocument Document { get { return m_document; } }

public EditorForm()
{
 m_comps = new List<BaseComponent>();
 m_sel = new List<BaseComponent>();
 arrow_pen = new Pen(Brushes.LightGreen);
 arrow_pen.EndCap = LineCap.ArrowAnchor;
 InitializeComponent();
 zoom = 1.0f;
 m_meta = new Dictionary<string, string>();
 m_filename = "";
 [b]m_document = new System.Drawing.Printing.PrintDocument();[/b]
 [b]m_document.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(m_document_PrintPage);[/b]
 UpdatePageBounds();
}

 

Er constructoren for Editor formen i ElectroShack programmet mitt

De linjene som er i fet skrift er relatert til print funksjonen

 

void m_document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
 [b]Print(e.Graphics);[/b]
 e.HasMorePages = false;
}

 

public void Print(Graphics g)
{
 BaseComponent.StandardPen = Pens.Black;
 BaseComponent.PrintMode = true;
 [b]Render(g);[/b]
}

 

Render funksjonen er egendefinert, men hvis du synes det kan hjelpe, slenger jeg den med her.

 

Klikk for å se/fjerne innholdet nedenfor
public void Render(Graphics g)
{
 foreach (BaseComponent comp in m_comps)
 {
if (float.IsNaN(comp.Transform.OffsetX) || float.IsNaN(comp.Transform.OffsetY))
comp.Transform = new Matrix(comp.Transform.Elements[0], comp.Transform.Elements[1], comp.Transform.Elements[2], comp.Transform.Elements[3], 0, 0);

// Get object center
PointF center = new PointF(comp.Transform.OffsetX, comp.Transform.OffsetY);
// Store object position
PointF offset = new PointF(comp.Transform.OffsetX, comp.Transform.OffsetY);
PointF[] pts = new PointF[] { center };

comp.Render(g);

if (!BaseComponent.PrintMode)
{

  if (m_sel.Contains(comp))
  {
	// Store matrix
	Matrix mat = g.Transform;
	g.MultiplyTransform(comp.Transform);

	Rectangle rect = new Rectangle((int)comp.Bounds.X - 2, (int)comp.Bounds.Y - 2, (int)comp.Bounds.Width + 4, (int)comp.Bounds.Height + 4);
	g.DrawRectangle(BaseComponent.StandardPen, rect);

	// Restore matrix
	g.Transform = mat;
	if (is_rotating)
	{

	  g.FillPie(new SolidBrush(Color.FromArgb(64, Color.Red)), center.X - 16, center.Y - 16, 32, 32, 0, rotate_angle / ((float)Math.PI / 180));
	  g.DrawEllipse(Pens.White, new RectangleF(center.X - 16, center.Y - 16, 32, 32));

	  g.DrawLine(arrow_pen, center.X, center.Y, center.X + (float)Math.Cos(rotate_angle) * 15.0f, center.Y + (float)Math.Sin(rotate_angle) * 15.0f);
	}
  }
}
 }

 if (start_connector != null)
 {
Pen connector_pen;
connector_pen = new Pen(BaseComponent.StandardPen.Color, 2);
connector_pen.EndCap = LineCap.ArrowAnchor;
connector_pen.DashStyle = DashStyle.Dash;
PointF[] arr = new PointF[] { start_connector.Point };
start_connector.Parent.Transform.TransformPoints(arr);
g.DrawLine(connector_pen, arr[0].X, arr[0].Y, xx, yy);
 }
}

 

Det eneste jeg sier her, er at det du skriver er det du får; dersom du skriver en font med Size 100 så er det det som dukker opp på papiret. Så du må sette fonten i riktig størrelse på dokumentet du har tenkt til å skrive ut (dersom dette er fra en RichTextBox så må du sette [RichTextBox].Font = new Font("Arial", 100) f.eks.

Skrevet

Oi, burde kanskje ha sagt at jeg bruker fontdialog og colordialog.

fontdialog:

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

Skrevet (endret)

Det spiller forsåvidt ingen rolle.

Sett opp font størrelsen der; så vil det blir større på papiret.

 

edit: jeg skal prøve å bli bedre på å skrive VB istedet for C# i VB forumet :p

Endret av GeirGrusom
Skrevet (endret)

Den siste koden er ikke viktig

 

public System.Drawing.Printing.PrintDocument Document { get { return m_document; } }

Dette er en property i C#

 

I VB.NET direkte oversatt blir det slik:

 

Public ReadOnly Property Document() As System.Drawing.Printing.PrintDocument
 Get
Return m_document
 End Get
End Property

Jeg tror jeg vet hvilken av de to jeg liker best :roll:

 

 

Public Sub New()
 m_comps = new List(Of BaseComponent)
 m_sel = new List(Of BaseComponent)
 arrow_pen = new Pen(Brushes.LightGreen)
 arrow_pen.EndCap = LineCap.ArrowAnchor
 InitializeComponent()
 zoom = 1.0
 m_meta = new Dictionary(Of string, string)
 m_filename = ""
 m_document = New System.Drawing.Printing.PrintDocument()
 AddHandler m_document.PrintPage, AddressOf m_document_PrintPage
 UpdatePageBounds()
End Sub

 

Public Sub m_document_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
 Print(e.Graphics)
 e.HasMorePages = False
End Sub

 

Public Sub Print(ByVal g As Graphics)
 BaseComponent.StandardPen = Pens.Black
 BaseComponent.PrintMode = True
 Render(g)
End Sub

Endret av GeirGrusom
Skrevet

fikk en error:

Error 1 Value of type 'System.Drawing.Graphics' cannot be converted to 'Integer'. C:\Documents and Settings\Ørjan\Mine dokumenter\Visual Studio 2008\Projects\Text Editor\Text Editor\Form1.vb 181 15 WordBoard
  • 2 måneder senere...
Skrevet

Jeg fant ut hva som var galt nå.

Jeg bruker denne koden for å sjekke hvilken font jeg skal printe:

	Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage 'Get what is on the text box.
	Dim yPos As Single = e.MarginBounds.Top
	Dim xPos As Single = e.MarginBounds.Left
	Dim printFont As Font = RichTextBox1.Font
	Dim myBrush As New SolidBrush(Color.Black)

	e.Graphics.DrawString(RichTextBox1.Text, printFont, myBrush, xPos, yPos)
End Sub

Men den blir bare sjekket når programmet starter, så det vil ikke virke velldig bra...

Så er det noen måte for å opdatere den koden når jeg skifter font?

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...