Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Puntatore mouse a colori in Visual Basic 2008 (Express Ed.)
Forum - C# / VB.NET - Puntatore mouse a colori in Visual Basic 2008 (Express Ed.)

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
TronSoft (Normal User)
Newbie


Messaggi: 7
Iscritto: 19/04/2010

Segnala al moderatore
Postato alle 10:23
Lunedì, 19/04/2010
Ciao,
sono un programmatore dilettante orfano di VB 6... (quante volte l'avete sentita questa?...) Vi scrivo con la speranza che potrete aiutarmi (anche questa, eh?).
Come faccio in VB 2008 ad impostare il cursore con una mia immagine personalizzata (vedi allegato), nota bene, a centinaia di colori e con antialias, da formati come PNG o ICO, per intenderci, e non una volgare CUR in bianco e nero!, cosa che in VB 6 facevo benissimo (grazie alle funzioni trovate nell'ottimo sito VBAccelerator, ormai però defunto, ahimé...)???
Sono giorni che mi rompo la testa, sia provando da me (ammetto di essere ancora disorientato con VB 2008...) sia cercando una soluzione in rete... Ma niente...
Potete aiutarmi?
Grazie infinite!
;-)
Antonio


TronSoft ha allegato un file: Dito destro.png (3584 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1844
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 13:55
Lunedì, 19/04/2010
Non è una cosa facile da fare,
devi tener conto dell'offset X e Y dello schermo più la grandezza del Cursor.Clip

fare un calcolo adeguato in modo che il click corrispondi alla cordinata perfetta del dito.

nascondere il cursore con Cursor.Hide();
e magari un draw con un timer sul form che segue il cursore.



PM Quote
Avatar
Federico_VbNet_Programmer (Normal User)
Expert


Messaggi: 222
Iscritto: 03/04/2010

Segnala al moderatore
Postato alle 14:12
Lunedì, 19/04/2010
Testo quotato

Postato originariamente da Thejuster:

Non è una cosa facile da fare,
devi tener conto dell'offset X e Y dello schermo più la grandezza del Cursor.Clip

fare un calcolo adeguato in modo che il click corrispondi alla cordinata perfetta del dito.

nascondere il cursore con Cursor.Hide();
e magari un draw con un timer sul form che segue il cursore.




Si la tua è una ottima idea,ma la devi fare a grandezza del cursore se vuoi che l'immagine sembra esso,poi scegli tu:D


pierotofy fa merda
PM Quote
Avatar
TronSoft (Normal User)
Newbie


Messaggi: 7
Iscritto: 19/04/2010

Segnala al moderatore
Postato alle 15:35
Lunedì, 19/04/2010
Scusate... Vi ringrazio, ma... non ho capito niente!
Che dovrei fare??? Qual è la procedura da seguire, i comandi da utilizzare ecc.?
Risposte criptiche non è che mi siano d'aiuto...
Grazie ancora,
A.

PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1844
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 17:46
Lunedì, 19/04/2010
Testo quotato

Postato originariamente da TronSoft:

Scusate... Vi ringrazio, ma... non ho capito niente!
Che dovrei fare??? Qual è la procedura da seguire, i comandi da utilizzare ecc.?
Risposte criptiche non è che mi siano d'aiuto...
Grazie ancora,
A.



ciptiche?

non è che parliamo in cript ma almeno un pò di teoria in materia serve....
o magari un pò di studio alle WinApi non farebbe male.

Un modo semplice per farlo e quello che ti ho descritto prima
altrimenti ci sono le api.

prima incapsuli un immagine in un contenitore Image,
e dopo crei il cursore sfruttando l'api  CreateIconIndirect

puoi perfino usare una stringa come cursore.

al load del form

Codice sorgente - presumibilmente C# / VB.NET

  1. Bitmap bitmap = new Bitmap(140, 25);
  2.             Graphics g = Graphics.FromImage(bitmap);
  3.             using (Font f = new Font(FontFamily.GenericSansSerif, 10))
  4.                 g.DrawString("Thejuster", f, Brushes.Green, 0, 0);
  5.  
  6.             this.Cursor = CreaCursore(bitmap, 3, 3);
  7.  
  8.             bitmap.Dispose();



dopo

Codice sorgente - presumibilmente C++

  1. public struct IconInfo
  2.         {
  3.             public bool fIcon;
  4.             public int xHotspot;
  5.             public int yHotspot;
  6.             public IntPtr hbmMask;
  7.             public IntPtr hbmColor;
  8.         }
  9.  
  10.         [DllImport("user32.dll",EntryPoint="CreateIconIndirect")]
  11.         public static extern IntPtr Icona(ref IconInfo icon);
  12.  
  13.         [DllImport("user32.dll",EntryPoint="GetIconInfo")]
  14.         [return: MarshalAs(UnmanagedType.Bool)]
  15.         public static extern bool InfoIcona(IntPtr hIcon, ref IconInfo pIconInfo);
  16.  
  17.         public static Cursor CreaCursore(Bitmap bmp, int xHotSpot, int yHotSpot)
  18.         {
  19.             IconInfo tmp = new IconInfo();
  20.             InfoIcona (bmp.GetHicon(), ref tmp);
  21.             tmp.xHotspot = xHotSpot;
  22.             tmp.yHotspot = yHotSpot;
  23.             tmp.fIcon = false;
  24.             return new Cursor(Icona(ref tmp));
  25.         }



Ciao e buon divertimento :k:


Edit: (così evitiamo un'altro post :rotfl: )

per quello che ti serve
devi cambiare il contenuto del form load in questo

Codice sorgente - presumibilmente C# / VB.NET

  1. Bitmap bitmap = new Bitmap(140, 25);            
  2.             Image s = Image.FromFile("C:\\mano.png");    
  3.             Graphics g = Graphics.FromImage(bitmap);
  4.             bitmap = new Bitmap(s);      
  5.             g.DrawImage(s, 0, 0, 50, 50);
  6.             this.Cursor = CreaCursore(bitmap, 3, 3);
  7.  
  8.             bitmap.Dispose();


:k:


Ultima modifica effettuata da Thejuster il 19/04/2010 alle 18:18


PM Quote
Avatar
TronSoft (Normal User)
Newbie


Messaggi: 7
Iscritto: 19/04/2010

Segnala al moderatore
Postato alle 18:12
Lunedì, 19/04/2010
Ti ringrazio, ma come ho dichiarato all'inizio, non solo sono un dilettante (e quindi per me api o vespe, sempre diffidente sono...) ma anche nuovo a VB 2008...
Oltretutto tu mi parli in C...!
:-(
Insomma, non sono capace di mettere a frutto le tue indicazioni... Non so di che parli!
Grazie lo stesso... Pensavo (speravo, m'illudevo...) di ottenere una risposta più semplice e chiara... Che so, un esempio...
Non è colpa tua: qui siete tutti esperti, sarò io che ho sbagliato sito...
Ciao
A.

PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1844
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:31
Lunedì, 19/04/2010
non è C e C#
basta convertilo in vb.net :_doubt:

tieni il codice completo sperando che ti sia di aiuto........

Al form load


Codice sorgente - presumibilmente VB.NET

  1. Dim bitmap As New Bitmap(140, 25)
  2. Dim s As Image = Image.FromFile("C:\mano.png")  'Posizione dell'immagine
  3. Dim g As Graphics = Graphics.FromImage(bitmap)
  4. bitmap = New Bitmap(s)
  5. g.DrawImage(s, 0, 0, 50, 50)
  6. Me.Cursor = CreaCursore(bitmap, 3, 3)
  7.  
  8. bitmap.Dispose()



funzioni api


Codice sorgente - presumibilmente VB.NET

  1. Public Structure IconInfo
  2.     Public fIcon As Boolean
  3.     Public xHotspot As Integer
  4.     Public yHotspot As Integer
  5.     Public hbmMask As IntPtr
  6.     Public hbmColor As IntPtr
  7. End Structure
  8.  
  9.  
  10. <DllImport("user32.dll", EntryPoint := "CreateIconIndirect")> _
  11. Public Shared Function Icona(ByRef icon As IconInfo) As IntPtr
  12. End Function
  13.  
  14.  
  15.  
  16. <DllImport("user32.dll", EntryPoint := "GetIconInfo")> _
  17. Public Shared Function InfoIcona(ByVal hIcon As IntPtr, ByRef pIconInfo As IconInfo) As Boolean
  18. End Function
  19.  
  20.  
  21.  
  22. Public Shared Function CreaCursore(ByVal bmp As Bitmap, ByVal xHotSpot As Integer, ByVal yHotSpot As Integer) As Cursor
  23.     Dim tmp As New IconInfo()
  24.     InfoIcona(bmp.GetHicon(), tmp)
  25.     tmp.xHotspot = xHotSpot
  26.     tmp.yHotspot = yHotSpot
  27.     tmp.fIcon = False
  28.     Return New Cursor(Icona(tmp))
  29. End Function




No, non sbagli affatto,
anzi..

ma non tutto e sempre semplice.
cioè per spiegarti il tutto dovrei iniziare dalla A e finire alla Z

cmq quello e sorgente C#
ti bastava andare qui

http://www.developerfusion.com/tools/convert/csharp-to-vb/

postare il mio sorgente e il programma
te lo converte in vb.net

ciao

Prova vedi che funziona :k:




Ultima modifica effettuata da Thejuster il 19/04/2010 alle 18:32


PM Quote
Avatar
TronSoft (Normal User)
Newbie


Messaggi: 7
Iscritto: 19/04/2010

Segnala al moderatore
Postato alle 18:46
Lunedì, 19/04/2010
Io continuo a ringraziarti!
Non so se sarò in grado, ma proverò.
;-)
Magari domani ti scoccerò di nuovo.
Grazie ancora
A.

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:56
Lunedì, 19/04/2010
In effetti le risposto erano tutt'altro che chiare. Inutile dire che non è possibile spiegarti proprio tutto il codice postato, perchè dovremmo ritornare indietro parecchio nella teoria e scrivere un trattato. Al massimo posso commentare brevemente quello che mi sembra di aver capito:

Codice sorgente - presumibilmente VB.NET

  1. Dim bitmap As New Bitmap(140, 25)
  2. Dim s As Image = Image.FromFile("C:\mano.png")
  3. Dim g As Graphics = Graphics.FromImage(bitmap)
  4. bitmap = New Bitmap(s)
  5. g.DrawImage(s, 0, 0, 50, 50)


Questo codice è dispersivo perchè non contempla il passaggio dal tipo image al tipo bitmap. Si potrebbe riassumere in:
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim bitmap As Bitmap = Image.FromFile("C:\mano.png")
  2. Me.Cursor = CreaCursore(bitmap, 3, 3)
  3. bitmap.Dispose()


Carica l'immagine dal file, la pone in un oggetto bitmap, quindi crea l'icona ad essa corrispondente e la imposta come nuovo cursore.

Structure corrisponde alla Struct del VB6, mentre <DllImport> corrisponde a Declare:
Codice sorgente - presumibilmente VB.NET

  1. Public Structure IconInfo
  2.     Public fIcon As Boolean
  3.     Public xHotspot As Integer
  4.     Public yHotspot As Integer
  5.     Public hbmMask As IntPtr
  6.     Public hbmColor As IntPtr
  7. End Structure
  8.  
  9. 'Crea un cursore valido a partire da una struttura IconInfo e restituisce
  10. 'un puntatore al cursore
  11. <DllImport("user32.dll", EntryPoint := "CreateIconIndirect")> _
  12. Public Shared Function Icona(ByRef icon As IconInfo) As IntPtr
  13. End Function
  14.  
  15. 'Ottiene delle informazioni sull'icona hIcon specificata come puntatore (o come valore
  16. 'notevole se identifica un cursore predefinito) e le pone in pIconInfo.
  17. <DllImport("user32.dll", EntryPoint := "GetIconInfo")> _
  18. Public Shared Function InfoIcona(ByVal hIcon As IntPtr, ByRef pIconInfo As IconInfo) As Boolean
  19. End Function
  20.  
  21. Public Shared Function CreaCursore(ByVal bmp As Bitmap, ByVal xHotSpot As Integer, ByVal yHotSpot As Integer) As Cursor
  22.     Dim tmp As New IconInfo()
  23.     'Crea una nuova struttura IconInfo riguardando l'icona
  24.     'ottenuta dalla funzione bmp.GetHicon() e la mette in tmp
  25.     InfoIcona(bmp.GetHicon(), tmp)
  26.     'Coordinate del'"hot spot" del cursore. Presumo che sia il punto che "fa click"
  27.     tmp.xHotspot = xHotSpot
  28.     tmp.yHotspot = yHotSpot
  29.     'False indica che si tratta di un cursore e non una semplice icona
  30.     tmp.fIcon = False
  31.     Return New Cursor(Icona(tmp))
  32. End Function



Potevi dare dei nomi più significativi che Icona e InfoIcona... E ricordo che le strutture sono tipi value, perciò non necessitando di un costruttore per essere inizializzate.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo