Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

Chamuanza

[Resolvido] Rodar Texto

Mensagens Recomendadas

Chamuanza    4
Chamuanza

Um bem Aja

Encontrei este código no https://msdn.microsoft.com/pt-br/library/ms404359%28v=vs.90%29.aspx que pretendo aplicar num projecto que tenho entre mãos.

No entanto apresenta alguns erros que não sei decifrar, mas que penso estarem relacionados com "Imports Microsoft.WindowsCE.Forms"

Agradecia uma ajuda se possivel.

//
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports Microsoft.WindowsCE.Forms
Public Class Form1
Inherits System.Windows.Forms.Form
' Declare objects to draw the text.
Private rotatedFont As System.Drawing.Font
Private redBrush As SolidBrush
' Specify the text to roate, the rotation angle,
' and the base font.
Private rTxt As String = "abc ABC 123"
Private rAng As Integer = 45
' Determine the vertial DPI setting for scaling the font on the
' device you use for developing the application.
' You will need this value for properly scaling the font on
' devices with a different DPI.
' In another application, get the DpiY property from a Graphics object
' on the device you use for application development:
'
'   Dim g As Graphics = Me.CreateGraphics()
'   Dim curDPI As Integer = g.DpiY
Private Const curDPI As Integer = 96
' Note that capabilities for rendering a font are
' dependant on the device.
Private rFnt As String = "Arial"
Public Sub New()
	MyBase.New()
	' Display OK button to close application.
	Me.MinimizeBox = False
	Me.Text = "Rotated Font"
	' Create rotatedFont and redBrush objects in the custructor of
	' the form so that they can be resued when the form is repainted.
	Me.rotatedFont = CreateRotatedFont(rFnt, rAng)
	Me.redBrush = New SolidBrush(Color.Red)
End Sub
' Method to create a rotated font using a LOGFONT structure.
Private Function CreateRotatedFont(ByVal fontname As String, _
	ByVal angleInDegrees As Integer) As Font
	Dim logf As LogFont = New Microsoft.WindowsCE.Forms.LogFont
	' Create graphics object for the form, and obtain
	' the current DPI value at design time. In this case,
	' only the vertical resolution is petinent, so the DpiY
	' property is used.
	Dim g As Graphics = Me.CreateGraphics
	' Scale an 18-point font for current screen vertical DPI.
	logf.Height = Fix(-18.0F * g.DpiY / curDPI)
	' Convert specified rotation angle to tenths of degrees.
	logf.Escapement = (angleInDegrees * 10)
	' Orientation is the same as Escapement in mobile platforms.
	logf.Orientation = logf.Escapement
	logf.FaceName = fontname
	' Set LogFont enumerations.
	logf.CharSet = LogFontCharSet.Default
	logf.OutPrecision = LogFontPrecision.Default
	logf.ClipPrecision = LogFontClipPrecision.Default
	logf.Quality = LogFontQuality.ClearType
	logf.PitchAndFamily = LogFontPitchAndFamily.Default
	' Explicitly dispose any drawing objects created.
	g.Dispose()
	Return System.Drawing.Font.FromLogFont(logf)
End Function
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
	If (Me.rotatedFont Is Nothing) Then
		Return
	End If
	' Draw the text to the screen using the LogFont, starting at
	' the specified coordinates on the screen.
	e.Graphics.DrawString(rTxt, Me.rotatedFont, Me.redBrush, _
		75, 125, New StringFormat( _
		(StringFormatFlags.NoWrap Or StringFormatFlags.NoClip)))
End Sub
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
	' Dispose created graphic objects. Although they are
	' disposed by the garbage collector when the application
	' terminates, a good practice is to dispose them when they
	' are no longer needed.
	Me.redBrush.Dispose()
	Me.rotatedFont.Dispose()
	MyBase.Dispose(disposing)
End Sub
Public Shared Sub Main()
	Application.Run(New Form1)
End Sub
End Class

Editado por Chamuanza

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
siul72    2
siul72

Boas, vais correr o programa em Windows CE? se não procura outro exemplo que não utilize essa plataforma....

... da wiki...

"Windows CE... ... o sistema operativo Windows para dispositivos portáteis,...."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

Olá Chamuanza.

Não precisas das libs do CE para nada. Esse código precisa delas porque usa um "truque" para fazer a rotação, que implica uma classe que só existe nas libs do CE.

Podes obter o mesmo resultado com transformações de matriz com a própria GDI+

Ora espreita lá este exemplo:

    Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
       Dim F As New Font("Arial", 14) 'A fonte que queres usar
       Dim B As New SolidBrush(Color.Black) 'O brush da fonte (determina a cor, padrão ou textura da letra)
       Dim g As Graphics = Me.CreateGraphics 'Isto coloca em g o contexto da área desenhável, neste caso do form (Me)
       Dim palavra = "Portugal-a-Programar"
       Dim area As SizeF = g.VisibleClipBounds.Size 'Guardamos as dimensões da área desenhável
       Dim centro As Point = New Point(area.Width / 2, area.Height / 2) 'Calculamos o centro dessa área (só porque neste exemplo te estou a colocar o texto ao centro)
       g.TranslateTransform(centro.X, centro.Y) 'Fazemos uma translação até ao centro
       g.RotateTransform(20) 'E rodamos a matriz em 20 graus. É importante fazer a translação ao centro antes de rodar, porque estas operações à matriz são feitas no centro
       Dim areapalavra As SizeF = g.MeasureString(palavra, F) 'Medimos a área ocupada por a palavra
       g.DrawString(palavra, F, B, -(areapalavra.Width / 2), -(areapalavra.Height / 2)) 'E usamos esse cálculo para desenhar a string deslocada do centro por metade do seu comprimento e largura (ou seja, vai centrar)
       g.ResetTransform() 'Isto é opcional. Deves fazê-lo apenas porque se fosses desenhar novamente algo com orientação diferente, tinhas a matriz deslocada e rodada (alinhada com o texto).
   End Sub

Basta adaptares à área "desenhável" que pretendes.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    4
Chamuanza

Bom dia Ribeiro55

Obrigado desde já pela dica.

De facto este exemplo é o que pretendo em termos de efeito.

Tentei aplicar no meu caso no evento "Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint" mas o texto fica encoberto com a picturebox.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

A PictureBox é por si uma superfície de desenho controlada.

Para usares em PictureBox, sugiro que o teu alvo Graphics seja um Bitmap e que o dês à PictureBox como fonte da imagem.

Caso contrário, um simples Panel faz o trabalho.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    4
Chamuanza

Boas Ribeiro

Testei como indicas num PANEL e funciona.

No entanto ao por a propriedade do PANEL BackColor=Transparente não assume.

Poderia colocar o BackColor do Panel com a cor da zona onde vai ser aplicada mas sucede que apanha duas cores diferentes

Como não tenho experiencia nesta matéria se me pudesses dar uma dica sobre o BitMap agradecia

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

Olá Chamuanza,

Basta trocares o contexto do Graphics para um objecto que implemente o Image, como o Bitmap:

    Dim Bmp As New Bitmap(Panel1.ClientSize.Width, Panel1.ClientSize.Height)
   Dim g As Graphics = Graphics.FromImage(Bmp)

E depois no fim, dás ao background do panel a imagem:

Panel1.BackgroundImage = Bmp

Também podes usar a PictureBox para o mesmo efeito. Até é mais rápida que o Panel a desenhar.

No entanto, e atenção, só vais conseguir transparência caso essas "cores diferentes" sejam background do FORM.

Em WinForms, transparência entre dois controlos não é pêra doce. Só consegues facilidade transparência entre num controlo relativamente ao form.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.