Aero - pagina codici (1)
STAMPA DA RICHTEXTBOX
Il componente RichTextBox non prevede un metodo di stampa, del tipo:
richtextbox.print o richtextbox.showprintdialog
perciò per stampare il contenuto di una richtextbox bisogna usare un escamotage particolare: bisogna convertire in elemento grafico tutto il contenuto e stamparlo come 'stringa grafica' tramite e.graphics.drawstring
Purtroppo questo metodo non permette facilmente di stampare il documento a colori, ma solo in un colore assegnato al pennino grafico.
Bisogna per prima cosa aggiungere un controllo PrintDocument al progetto, al quale assegnamo questa sub:
Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
e.Graphics.DrawString(RichTextBox1.Text, RichTextBox1.Font, Brushes.Black, 100, 100)
End Sub
Potete cambiare il colore di stampa assegnando un altro valore a Brushes (es: Brushes.Aqua).
Il comando di stampa, da assegnare eventualmente a un bottone chiamato PrintButton, é il seguente:
Private Sub PrintButton_Click(sender As System.Object, e As _System.EventArgs) Handles PrintButton.Click
PrintDocument1.PrinterSettings.Copies = 1
PrintDocument1.Print()
End Sub
Volendo potete anche cambiare il numero di copie; se per esempio é presente una textbox1 in cui digitare il numero di copie desiderate, il codice cambierà in :
PrintDocument1.PrinterSettings.Copies = val(textbox1.text)
SEMPLICE SISTEMA DI REGISTER / LOGIN
Una mia idea personale, un sistema di login e registrazione utenti che non coinvolge database o altre vie esterne per il salvataggio delle password. Si basa su un vecchio sistema che veniva utilizzato negli script javascript a fine anni 90.
In sostanza il principio é assegnare all' ambiente utente una cartella composta, per esempio, da nomeutente+password.
Per esempio quando si registra l' utente
id = admin
pass = access
il sistema crea una cartella chiamata adminaccess.
Il codice si basa sulla presenza di due bottoni (loginokbutton e registerokbutton) e due textbox (useridtext e passtext):
Private Sub registerokbutton_Click(sender As System.Object, e As System.EventArgs) Handles registerokbutton.Click
Try
If Not Directory.Exists("C:\users\" & useridtext.Text & passtext.Text) Then
My.Computer.FileSystem.CreateDirectory("C:\users\" & useridtext.Text & passtext.Text)
Else
MsgBox("User already exists")
End If
Catch ex As Exception
MsgBox("Unable to create profile for " & useridtext.Text & " " & ex.Message)
End Try
End Sub
questo esempio crea la cartella composta da userid+password come sotto cartella di c:\users\
Al momento del login non faremo altro che verificare l' esistenza di una cartella con questa struttura, in questa maniera:
Private Sub loginokbutton_Click(sender As System.Object, e As System.EventArgs) Handles loginokbutton.Click
Try
If Not Directory.Exists("C:\users\" & useridtext.Text.ToString & passtext.Text.ToString) Then
MsgBox("User " & useridtext.Text.ToString & " does not exist or wrong password")
Else
logintimer.Start()
My.Settings.loggedinuser = useridtext.Text
My.Settings.Save()
My.Settings.Reload()
End If
Catch ex As Exception
MsgBox("Unable to access " & useridtext.Text)
End Try
End Sub
In questo login abbiamo due elementi aggiuntivi: un timer chiamato logintimer e una variabile di ambiente loggedinuser. Questa variabile andrà creata nella cartella Impostazioni di My Project, e deve essere del tipo 'String'.
Il codice del timer di login sarà questo:
Private Sub logintimer_Tick(sender As System.Object, e As System.EventArgs) Handles logintimer.Tick
'lancia il form principale post login , chiamato per esempio FormMaster
Me.Hide()
formmaster.Show()
logintimer.Stop()
End If
End Sub
Ovviamente al momento della registrazione si possono aggiungere delle varianti sulla creazione della cartella... si potrebbe utilizzare per esempio:
nomeutente+codiceprestabilito+password
dove il codice prestabilito potrebbe per esempio essere un codice assegnato a seconda del 'grado di accesso' al sistema. Un power user potrebbe avere 002, un administrator potrebbe avere 001, un utente semplice 003, e così via...
nel nostro caso, quello dell' utente admin, avremmo:
admin001access come nome della cartella.
Supponiamo di creare l'utente amministratore... il sistema saprà che deve aggiungere 001 tra nome utente e password... Il codice IF di registrazione cambierà quindi in :
If Not Directory.Exists("C:\users\" & useridtext.Text & "001" & passtext.Text) Then
My.Computer.FileSystem.CreateDirectory("C:\users\" & useridtext.Text & "001" & passtext.Text)
Al momento della login, poi, il sistema non fa altro che verificare se esiste una cartella con questa struttura, secondo una logica:
se NON esiste la cartella nomeutente001password significa che l' account amministratore non é stato settato
If Not Directory.Exists("C:\users\" & useridtext.Text.ToString & "001" & passtext.Text.ToString) Then
MsgBox("Administrator account not set")
Else
logintimer.Start()
My.Settings.loggedinuser = "001"
My.Settings.Save()
My.Settings.Reload()
End If
A questo punto entra in gioco la variabile loggedinuser. Se la cartella esiste infatti (consizione Else) parte il timer di avvio e alla variabile loggedinuser viene assegnato il codice amministratore.
In tutti gli altri momenti in cui il programma debba decidere se ad agire é un amministratore o meno infatti si potrà usare la condizione:
If my.settings.loggedinuser <> "001" Then
.....
End if
Questo sistema si può inserire nei Form_Load per esempio per rendere accessibili determinate funzioni solo all' admin, o a un qualsiasi utente prestabilito.
CREARE FORM TRASCINABILI
I migliori form sono quelli senza bordi, ma senza di essi é impossibile spostarli con il trascinamento del mouse, a meno che non utilizziamo 3 eventi del Form, che andranno codificati come segue:
Intanto sotto il Public Class dobbiamo definire 3 variabili:
Dim drag As Boolean
Dim mousex As Integer
Dim mousey As Integer
poi dobbiamo definire i 3 eventi che le gestiscono. Il primo evento (MouseDown) stabilisce che se il tasto sinistro del mouse é premuto siamo in situazione di trascinamento; il secondo evento (MouseMove) verifica durante il movimento se il tasto é ancora premuto (se siamo ancora in situazione di drag = true) e aggiorna le coordinate; il terzo evento (MouseUp) stabilisce che se il tasto sinistro del mouse è rilasciato non siamo più in condizione di trascinamento e quindi il form si fermerà anche se continuiamo a muovere il mouse:
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
drag = True
mousex = Windows.Forms.Cursor.Position.X - Me.Left
mousey = Windows.Forms.Cursor.Position.Y - Me.Top
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If drag Then
Me.Top = Windows.Forms.Cursor.Position.Y - mousey
Me.Left = Windows.Forms.Cursor.Position.X - mousex
End If
End Sub
Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
drag = False
End Sub
IL BROWSER CON TAB
Per creare un browser con tab bisogna sostanzialmente usare 2 oggetti:
- una classe Browser (nel codice chiamato CustomTabbedBrowser) che eredita le caratteristiche del browser standard di Visual Studio
- una subroutine per aggiungere un nuovo tab (nel codice chiamata AddTab), il quale chiamerà al suo interno una istanza della classe browser customizzata. Questa sub dovrà contenere almeno due parametri: la URL e il Tabcontrol per controllare le funzioni del tab.
Il codice per la classe CustomTabbedBrowser sarà qualcosa di simile (sperimentate come meglio credete):
Public Class CustomTabbedBrowser
Inherits WebBrowser
Public Sub New()
Me.ScriptErrorsSuppressed = True
End Sub
Private Sub DocCompleted() Handles Me.DocumentCompleted
browser.ComboBox1.Text = Me.Url.ToString
browser.ComboBox1.Items.Add(browser.ComboBox1.Text)
Dim TP As TabPage = Me.Tag
If Me.DocumentTitle.Length > 15 Then
TP.Text = Me.DocumentTitle.Substring(0, 14) & "..."
Else
TP.Text = Me.DocumentTitle
End If
End Sub
End Class
A questo punto nella classe principale del nostro browser dobbiamo inserire la Sub che genera i nuovi tab:
Public Sub AddTab(ByRef URL As String, ByRef TabControl As TabControl)
Dim NewBrowser As New CustomTabbedBrowser
Dim NewTab As New TabPage
NewBrowser.Tag = NewTab
NewTab.Tag = NewBrowser
TabControl.TabPages.Add(NewTab)
NewTab.Controls.Add(NewBrowser)
NewBrowser.Dock = DockStyle.Fill
NewBrowser.Navigate(URL)
End Sub
Come vedete la sub crea una istanza NewBrowser della classe CustomTabbedBrowser, crea un nuovo tab del tipo TabPage, e gestisce le funzioni per aggiungere l' istanza NewBrowser nel tab appena creato e farlo andare alla URL passatagli.
Una volta inserite queste subroutine fondamentali, ogni comando del browser dovrà agire su una istanza del browser.
Così se per esempio creando un browser senza tab il comando per navigare sarà ME.NAVIGATE (TEXTBOX1.TEXT) dove Textbox1 é la textbox utilizzata per digitare l' indirizzo web, nel caso del browser con tab dovremo prima definire una istanza, e poi indirizzarla, con un codice simile:
Private Sub NavigateButton_Click(sender As System.Object, e As System.EventArgs) Handles NavigateButton.Click
Dim wb As CustomTabbedBrowser = Me.TabControl1.SelectedTab.Tag
wb.Navigate(Me.TextBox1.Text)
End Sub
Lo stesso principio varrà per i pulsanti Back, Forward, Home e Refresh, che dovrannno utilizzare l' istanza con i seguenti comandi:
-wb.GoBack()
-wb.GoForward()
-wb.GoHome
-wb.Refresh()
Fondamentali sono i due pulsanti per aggiungere e rimuovere i tabs:
Private Sub AddTabButton_Click(sender As System.Object, e As System.EventArgs) Handles AddTabButton.Click
AddTab("about:blank", TabControl1)
End Sub
Private RemTabButton_Click(sender As System.Object, e As System.EventArgs) Handles RemTabButton.Click
If TabControl1.TabPages.Count = 1 Then
Me.Close()
Else
TabControl1.TabPages.Remove(TabControl1.SelectedTab)
End If
End Sub
LA RIDUZIONE A ICONA DELLE APPLICAZIONI
Il sistema di riduzione a icona di Aero é realizzato tramite un pulsante icona e due brevi codici. I pulsanti icona sono inizialmente invisibili, in Aero sono disposti nell' angolo in alto a sinistra del desktop.
I codici qui sotto sono scritti per un sistema generico che utilizzi un pulsante icona chiamato ICONBUTTON collocato nel form MAIN e una applicazione chiamata APPFORM.
Codice di ICONBUTTON_CLICK nel form MAIN
appform.WindowState = FormWindowState.Normal
iconbutton.Visible = False
Codice di APPFORM_RESIZE
If Me.WindowState = FormWindowState.Minimized Then
main.iconbutton.Visible = True
End If
If Me.WindowState = FormWindowState.Normal Then
main.iconbutton.Visible = False
End If