Ruslan Demidow писал(а):Но от примера, хотя бы схематичного (скелета) я не отказался бы.
Держи - для хорошего человека ничего не жалко

В левом пикчербоксе иконка, в правом появляется битмап.
Ruslan Demidow писал(а):Но от примера, хотя бы схематичного (скелета) я не отказался бы.
tyomitch писал(а):Ruslan: нет, иконку в буфер действительно невозможно кинуть. То, что она из гифа, тут не при чём.
Готовый пример чтения гифа тоже есть на vbrussian
gaidar писал(а):В аське смайлы не анимированные. А что там используется легко узнать с помощью Spy++
tyomitch писал(а):Ruslan, ты посмотрел, как сконвертировать иконку в битмап с нужным фоном?
Если да, то оставшееся очень просто - в начале использовать не Picture1.Picture.Handle, а ListImages(...).ExtractIcon.Handle, и в конце битмап класть не в Picture2.Picture, а в буфер. Должно работать:
hDesktop = GetDesktopWindow
hDesktopDC = GetDC(hDesktop)
tyomitch писал(а):Ruslan, ты посмотрел, как сконвертировать иконку в битмап с нужным фоном?
Если да, то оставшееся очень просто - в начале использовать не Picture1.Picture.Handle, а ListImages(...).ExtractIcon.Handle, и в конце битмап класть не в Picture2.Picture, а в буфер. Должно работать
Private Declare Function GetIconInfo Lib "user32" (ByVal hIcon As Long, piconinfo As ICONINFO) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function PatBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32" (lpPictDesc As PICTDESC, riid As Guid, ByVal fOwn As Long, lplpvObj As iPicture) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Type ICONINFO
fIcon As Long
xHotspot As Long
yHotspot As Long
hbmMask As Long
hbmColor As Long
End Type
Private Type Guid
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type PICTDESC
Size As Long
Type As Long
hBmp As Long
hPal As Long
Reserved As Long
End Type
Sub ShowSmailes()
Dim Pic As StdPicture
Dim sSmail As String
Dim sStart As Long, i As Integer
For i = 1 To UBound(arrSmail)
SmailImageList.BackColor = MsgTextBox.BackColor
Set Pic = SmailImageList.ListImages("Smail" & i).ExtractIcon
With MsgTextBox
Do While .SelStart <> 0
.SelStart = InStr(1, .Text, arrSmail(i))
If .SelStart <> 0 Then
.SelStart = .SelStart - 1
.SelLength = Len(arrSmail(i))
GetSmailToClipboard Pic
SendMessage .hwnd, WM_PASTE, 0, 0
End If
Loop
.SelStart = 1
End With
Next i
End Sub
Sub GetSmailToClipboard(ByVal iPicture As Variant)
Dim ii As ICONINFO
GetIconInfo iPicture.Handle, ii
Dim hDesktopDC As Long, hDesktop As Long
hDesktop = GetDesktopWindow
hDesktopDC = GetDC(hDesktop)
Dim hdc As Long, hOldBmp As Long, hNewBmp As Long
hdc = CreateCompatibleDC(hDesktopDC)
hNewBmp = CreateCompatibleBitmap(hDesktopDC, 20, 20)
hOldBmp = SelectObject(hdc, hNewBmp)
ReleaseDC hDesktop, hDesktopDC
Dim hBrush As Long, hOldBrush As Long
hBrush = CreatePatternBrush(ii.hbmColor)
hOldBrush = SelectObject(hdc, hBrush)
PatBlt hdc, 0, 0, 20, 20, vbPatCopy
SelectObject hdc, hOldBrush
DeleteObject hBrush
SetBkColor hdc, MessBackGRNDColor
hBrush = CreatePatternBrush(ii.hbmMask)
hOldBrush = SelectObject(hdc, hBrush)
PatBlt hdc, 0, 0, 20, 20, vbPatInvert
SelectObject hdc, hOldBrush
DeleteObject hBrush
SelectObject hdc, hOldBmp
DeleteDC hdc
Clipboard.Clear
Clipboard.SetData CreatePictureFromBitmap(hNewBmp)
End Sub
Private Function CreatePictureFromBitmap(ByVal hBmp As Long) As StdPicture
Dim Pic As PICTDESC, IID_IDispatch As Guid
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
With Pic
.Size = Len(Pic)
.Type = vbPicTypeBitmap
.hBmp = hBmp
.hPal = 0
End With
OleCreatePictureIndirect Pic, IID_IDispatch, 1, CreatePictureFromBitmap
End Function
Zer писал(а):To Ruslan Demidow: так тебе куда текстовичёк кинуть?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2