Coppy các nét vẻ vào trang tính InkPicture

03/07/21
386
0

Coppy các nét vẻ vào trang tính InkPicture, sử dụng điều khiển InkPicture cung cấp khả năng đặt một hình ảnh trong một ứng dụng và cho phép người dùng vẽ mực lên trên nó. Nó dành cho các trường hợp trong đó mực không được nhận dạng là văn bản mà thay vào đó được lưu trữ dưới nét bút.

Coppy các nét vẻ vào trang tính InkPicture

Coppy các nét vẻ vào trang tính InkPicture
Coppy các nét vẻ vào trang tính InkPicture

Bạn có thể sử dụng điều khiển InkPicture để hiển thị mực trong Microsoft Windows 2000, Windows Server 2003, bất kỳ phiên bản nào của Windows XP ngoài Windows XP Tablet PC Edition và bất kỳ phiên bản nào của Windows Vista.

Tuy nhiên, bạn có thể nhập mực, chấp nhận cử chỉ hoặc chỉ nhận dạng chữ viết tay trong các điều kiện. Bạn có thể tham khảo đoạn code sau

Để sử dụng được Control Microsoft lnk Picture Control : Click chuột phải vào bản toolbox  chọn Microsoft lnk Picture Control

Coppy các nét vẻ vào trang tính InkPicture
Coppy các nét vẻ vào trang tính InkPicture

 

Tạo điều khiển InkPicture đằng sau điều khiển trong suốt (chẳng hạn như GroupBox với bộ thuộc tính WS_EX_TRANSPARENT) sẽ ngăn InkPicture thu thập mực.

Mực có thể được nhập và nhận dạng nếu Windows Vista hoặc XP Tablet PC Edition 2005 được cài đặt. Cử chỉ cũng có thể được nhận ra. Chữ viết tay có thể được nhận dạng dưới dạng văn bản nếu chữ viết tay bắt nguồn từ các máy chạy phiên bản Windows cũ hơn, miễn là có trình nhận dạng.

Nếu bạn sử dụng Windows 2000, Windows Server 2003, bất kỳ phiên bản nào của Windows XP ngoài Windows XP Tablet PC Edition 2005, bạn có thể gán giá trị cho các thuộc tính môi trường xung quanh của điều khiển InkPicture.

Sau đó sao chép và dán mực vào các ứng dụng khác. Tuy nhiên, giá trị của thuộc tính InkEnabled sẽ luôn là FALSE .

Coppy các nét vẻ vào trang tính InkPicture
Coppy các nét vẻ vào trang tính InkPicture

I.CODE Coppy các nét vẻ vào trang tính InkPicture

Option Explicit
Private Type uPicDesc
    Size As Long
    Type As Long
    #If VBA7 Then
        hPic As LongPtr
        hPal As LongPtr
    #Else
       hPic As Long
       hPal As Long
    #End If
End Type
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type
#If VBA7 Then
    Private Declare PtrSafe Function OleCreatePictureIndirectAut Lib "oleAut32.dll" Alias "OleCreatePictureIndirect" (PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle As Long, iPic As IPicture) As Long
    Private Declare PtrSafe Function OleCreatePictureIndirectPro Lib "olepro32.dll" Alias "OleCreatePictureIndirect" (PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle As Long, iPic As IPicture) As Long
    Private Declare PtrSafe Function CopyImage Lib "user32" (ByVal handle As LongPtr, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As LongPtr
    Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
    Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
    Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
    Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As LongPtr
    Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
    Private Declare PtrSafe Function FreeLibrary Lib "kernel32" (ByVal hLibModule As LongPtr) As Long
    Private hCopy As LongPtr, hPtr As LongPtr, hLib As LongPtr
#Else
    Private Declare Function OleCreatePictureIndirectAut Lib "oleAut32.dll" Alias "OleCreatePictureIndirect" (PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle As Long, iPic As IPicture) As Long
    Private Declare Function OleCreatePictureIndirectPro Lib "olepro32.dll" Alias "OleCreatePictureIndirect" (PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle As Long, iPic As IPicture) As Long
    Private Declare Function CopyImage Lib "user32" (ByVal handle As Long, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
    Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function CloseClipboard Lib "user32" () As Long
    Private Declare Function EmptyClipboard Lib "user32" () As Long
    Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    Private hCopy As Long, hPtr As Long, hLib As Long
#End If
Private Const IMAGE_BITMAP = 0
Private Const PICTYPE_BITMAP = 1
Private Const LR_COPYRETURNORG = &H4
Private Const CF_BITMAP = 2
Private Const S_OK = 0
Private oInitPic As IPicture
Private oCurrentShape As Object
Private Sub UserForm_Initialize()
    InkPicture1.DefaultDrawingAttributes.Color = vbRed
    Set oInitPic = CreatePicture(Me.InkPicture1)
End Sub
'Private Sub UserForm_Terminate()
'    If Not oCurrentShape Is Nothing Then oCurrentShape.Delete
'End Sub
Private Sub Cmd_CopyToSheet_Click()
    If Me.InkPicture1.Ink.Strokes.Count Then
        Me.InkPicture1.Ink.ClipboardCopy
        Range("B2").PasteSpecial xlPasteAll
        Set oCurrentShape = Selection
        oCurrentShape.TopLeftCell.Select
        Me.InkPicture1.Ink.DeleteStrokes
    Else
        If Not oCurrentShape Is Nothing Then
            Set Me.InkPicture1.Picture = oInitPic
            oCurrentShape.Visible = True
        End If
    End If
    Me.InkPicture1.AutoRedraw = True
End Sub
Private Function CreatePicture(ByVal Shape As Object) As IPicture
    Dim IID_IDispatch As GUID, uPicinfo As uPicDesc
    Dim iPic As IPicture, lRet As Long
    On Error GoTo errHandler
    Shape.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
    OpenClipboard 0
    hPtr = GetClipboardData(CF_BITMAP)
    hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
    With IID_IDispatch
        .Data1 = &H20400
        .Data4(0) = &HC0
        .Data4(7) = &H46
    End With
    With uPicinfo
        .Size = Len(uPicinfo)
        .Type = PICTYPE_BITMAP
        .hPic = hCopy
        .hPal = 0
    End With
    hLib = LoadLibrary("oleAut32.dll")
    If hLib Then
        lRet = OleCreatePictureIndirectAut(uPicinfo, IID_IDispatch, True, iPic)
    Else
        lRet = OleCreatePictureIndirectPro(uPicinfo, IID_IDispatch, True, iPic)
    End If
    FreeLibrary hLib
    If lRet = S_OK Then
        Set CreatePicture = iPic
    End If
errHandler:
    EmptyClipboard
    CloseClipboard
Kết thúc chức năng

II. DOWN FILE Coppy các nét vẻ vào trang tính InkPicture

CLICK VÀO ĐÂY ĐỂ TAI FILE DEMO

Bạn có thê thêm các thủ thuật khác ở đây

Cho phép nhập liệu số trong TEXTBOX

Chuyển đổi số thành chữ viết bằng Code VBA

Tìm kiếm dữ liệu trong listbox từ textbox

5/5 - (6 bình chọn)

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *