PDA

View Full Version : آموزش: تغییر Cursor برای اشیاء با استفاده از فایل های متفاوت



ROSTAM2
سه شنبه 18 مرداد 1401, 22:26 عصر
سلام

با این کدها شما می تونید فایلهای Cursor - PNG و Icon رو بعنوان Cursor استفاده کنید.


Public Class Form2
Dim Cur As Icon
Dim ICO As Icon
Dim BMP As Bitmap
Private Sub Form2_Load(sender As Object, e As System.EventArgs) Handles Me.Load


Dim CursorPath As String = String.Format("{0}{1}\link.cur", Application.StartupPath, "\Cursors")
Cur = Icon.ExtractAssociatedIcon(CursorPath)
Me.PictureBox1.Image = Cur.ToBitmap
Me.PictureBox1.Cursor = New Cursor(Cur.Handle)


Dim IconPath As String = String.Format("{0}{1}\Search.ico", Application.StartupPath, "\Images")
ICO = New Icon(IconPath)
Me.PictureBox2.Image = Image.FromFile(IconPath)
Me.PictureBox2.Cursor = New Cursor(ICO.Handle)


Dim ImagePath As String = String.Format("{0}{1}\New Folder.png", Application.StartupPath, "\Images")
BMP = New Bitmap(Image.FromFile(ImagePath), New Size(24, 24))
Me.PictureBox3.Image = BMP
Me.PictureBox3.Cursor = New Cursor(BMP.GetHicon)


End Sub


End Class



153953

ROSTAM2
یک شنبه 06 آذر 1401, 02:00 صبح
سلام دوباره.

فراخوانی Cursor از فایل توسط کلاس Cursor که ورودی filename آدرس فایل رو می گیره باعث می شه نشانگر ماوس یک تصویر سیاه باشه! شاید این مشکل مربوط به نسخه ویندوز باشه اما برای کارایی بهتر از تبدیلش به آیکون می شه از تابع LoadCursorFromFileA Win32-API استفاده کرد:
LoadCursorFromFileA function (winuser.h) (https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadcursorfromfilea)

Declaration Section:

Private Declare Function LoadCursorFromFile Lib "user32.dll" Alias "LoadCursorFromFileA" _
(ByVal lpFileName As String) As IntPtr


Method:

Shared Function GetCursor(lpFileName As String) As Cursor
Dim Expr As Cursor = Nothing
Dim Cur As IntPtr
Cur = LoadCursorFromFile(lpFileName)
Expr = New Cursor(Cur)
Return Expr
End Function

ROSTAM2
پنج شنبه 01 دی 1401, 23:06 عصر
سلام.
در صورتی که کرسر مستقیم از ریسورس فراخوانی و Handle از اون برای تبدیل به کرسر استفاده بشه،ی تصویر سیاه از کرسر برمی گردونه
من یک کلاس ساختم برای فراخوانی Cursor از ریسورس (resx.):


Public Class ResxCursor
Private Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (
ByVal lpFileName As String) As IntPtr


Public Shared Widening Operator CType(ByVal initialData As ResxCursor) As Cursor
Dim ExtractDIR As String = IO.Path.GetFullPath(".")
Dim ExtractPath As String = ExtractDIR + initialData._Cursor.GetHashCode.ToString
IO.File.WriteAllBytes(ExtractPath, initialData._Cursor)
Dim CL As IntPtr = LoadCursorFromFile(ExtractPath)
IO.File.Delete(ExtractPath)
Return New Cursor(CL)
End Operator
Protected Friend _Cursor As Byte()
Sub New(Cursor As Byte())
_Cursor = Cursor
End Sub
End Class


این هم کد تعیین کرسر برای شیء:

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Me.Button1.Cursor = New ResxCursor(My.Resources.MainFormResource.aero_pen)
End Sub


اگر روش بهتری می دونید اعلام کنید.