Помогите с програмкой. Извечная проблема с и иконками

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

ImKarlas
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 03.07.2009 (Пт) 20:16

Помогите с програмкой. Извечная проблема с и иконками

Сообщение ImKarlas » 03.07.2009 (Пт) 20:22

Здравствуйте!
Написал программу: при запуске на экране появляются значки. При нажатии на них они качаются в разые стороны и запускается опр. программа. Ну типа RockedDoca или дока из MacOSa только значки можно перемещать.
Проблемм несколько:
1) как запускать панель управления, мой компьютер, корзину и тд.
2) Как извлечь из exe, dll, lnk и др файлов значок БОЛЬШОГО размера (48x48,64x64,96x96,128x128) (explorer это ведь как то делает?!) ExtractAsociatedIcon извлекает значок 32x32 а GetSHInfo извлекает только 16x16 и 32x32 еще и неполноцветные (24бита а не 32бита).
У меня есть несколько решений не одно не могу осуществить: а) каким то образом растягивать маленикие иконки при этом сглаживая их чтобы не было видно что они растянуты (мне кажется это решение не идеалтное не получится сделать так чтобы не было видно растяжения...) б) извлекать большие иконки из библиотек но у меня не получается...

3)Полученные иконки надо преобразовать в IconSource(WPF).
Проект у меня WPF.

Помогите пожалуйста!

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение Admiralisimys » 23.07.2009 (Чт) 11:20

ImKarlas доброго времени суток!
1)
Код: Выделить всё
Process.Start("explorer.exe", "/n, ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}")  'панель управления
Process.Start("explorer.exe", "/n, ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")   'мой компьютер
Process.Start("explorer.exe", "/n, ::{645FF040-5081-101B-9F08-00AA002F954E}")   'корзину

И некоторые другие здесь Explorer.exe and Visual Basic.NET 2005
Главное знать CLSID интересующей виртуальной папки.
2)Из exe и dll извлечь можно посредством Win32 Api функции ExtractIcon или ExtractIconEx, управляемого (встроенного в .NET Framework) варианта данных функций, насколько знаю, не существует.
Код: Выделить всё
Imports System
Imports System.Drawing
Imports System.Windows.Forms

Class IconLoaders
    Inherits Form
    Public Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As IntPtr, ByVal lpszExeFileName As String, ByVal nIconIndex As Integer) As IntPtr
    Dim Icon4Exe As IntPtr = 0
    Dim Icon4Dll As IntPtr = 0
    Dim LARGE_ICON As IntPtr = 32
    Shared Sub Main()
        Application.Run(New IconLoaders)
    End Sub
    Sub New()
        Icon4Exe = ExtractIcon(IntPtr.Zero, "explorer.exe", 1)
        Icon4Dll = ExtractIcon(IntPtr.Zero, "shell32.dll", 120)
    End Sub
    Protected Overrides Sub OnPaint(ByVal pea As PaintEventArgs)
        Dim grfx As Graphics = pea.Graphics
        grfx.DrawIcon(Icon.FromHandle(Icon4Exe), LARGE_ICON, 0)
        grfx.DrawIcon(Icon.FromHandle(Icon4Dll), 2 * LARGE_ICON, 0)
    End Sub
End Class

В случаи lnk нужно определить содержит ли файл на который указывает ярлык иконку, если содержит достать её оттуда. В противном случаи определить по расширению какую иконку в конкретной системе имеет указанный файл. В данной статьи, на C# правда, указанно как.
В случаи если в свойствах ярлыка указанна собственная иконка, тогда нужно парсить lnk файл.

[q]3)Полученные иконки надо преобразовать в IconSource(WPF).
Проект у меня WPF.[/q]
Упс... Не обратил сразу внимание. Тогда даже и не знаю, подойдёт ли выше для WPF.

ImKarlas
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 03.07.2009 (Пт) 20:16

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение ImKarlas » 23.07.2009 (Чт) 12:52

Ну преобразовывать можно так:
Код: Выделить всё
Dim ico as Drawing.Icon = Drawing.Icon.ExtractAssociatedIcon("c:\11.mp3")
Dim stream as New IO.MemoryStream
ico.save(stream)
Dim wpfbmp as new BitmapImage
wpfbmp.BeginInit
wpfbmp.StreamSource=stream
wpfbmp.EndInit
stream.Close

ImKarlas
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 03.07.2009 (Пт) 20:16

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение ImKarlas » 23.07.2009 (Чт) 12:57

А зачем здесь:
grfx.DrawIcon(Icon.FromHandle(Icon4Dll), 2 * LARGE_ICON, 0)
LARGE_ICON умножать на 2?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение Admiralisimys » 23.07.2009 (Чт) 13:25

ImKarlas спасибо за пример преобразования изображения в WPF. Вызов панель управления, моего компьютера, корзины изменения не требует?

В данном случаи значение LARGE_ICON иконки используется как координата на форме. Умножение на два требуется, что б разместить иконку на форме на 64м пикселе от левого края.

ImKarlas
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 03.07.2009 (Пт) 20:16

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение ImKarlas » 23.07.2009 (Чт) 14:02

Да все работает. Спасибо. :wink: Но мне интересно вот что: извлекается иконка 32x32. А в Windows есть иконки больше. 48 64 и т.д. Как получить такие иконки? Или растягивать только?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение iGrok » 23.07.2009 (Чт) 16:42

ImKarlas писал(а):Да все работает. Спасибо. :wink: Но мне интересно вот что: извлекается иконка 32x32. А в Windows есть иконки больше. 48 64 и т.д. Как получить такие иконки? Или растягивать только?

Использовать не ExtractIcon, а ExtractIconEx.
label:
cli
jmp label

ImKarlas
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 03.07.2009 (Пт) 20:16

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение ImKarlas » 24.07.2009 (Пт) 12:48

как именно использовать? :D

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение Admiralisimys » 27.07.2009 (Пн) 10:43

ImKarlas, а можно примеры dll, exe и т.д. файлов в которых находятся столь большие иконки? Дело в том что в самих функциях не указывается с каким размером вытягивать иконку и она тянется как есть. Кстати говоря, в Висте и Севен значки и вправду большие, однако мне так и не удалось выявить - где они располагаются. FileMon показал на файлы thumbs
iGrok согласно документации расширенная версия ExtractIcon - ExtractIconEx даёт возможность создать массив с описанием иконок и каких либо иных отличий, в том числе и по наличии возможности доставании больших иконок, - не имеет. Или есть возможность продемонстрировать не документированные возможности функции?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение iGrok » 27.07.2009 (Пн) 16:59

Мда. И действительно, ExtractIconEx (по крайней мере, на XP) не даёт извлечь большую иконку.

Но можно почитать MSDN. Там описана ещё одна функция. С ней всё работает.

Код: Выделить всё
Option Explicit

Private Const DI_MASK = &H1&
Private Const DI_IMAGE = &H2&
Private Const DI_NORMAL = &H3&
Private Const DI_COMPAT = &H4&
Private Const DI_DEFAULTSIZE = &H8&

Private Declare Function DrawIconEx Lib "user32" (ByVal hdc As Long, ByVal xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, ByVal cxWidth As Long, ByVal cyWidth As Long, ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As Long, ByVal diFlags As Long) As Long
Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long

Private Declare Function PrivateExtractIcons Lib "user32.dll" Alias "PrivateExtractIconsA" ( _
    ByVal lpszFile As String, _
    ByVal nIconIndex As Long, _
    ByVal cxIcon As Long, _
    ByVal cyIcon As Long, _
    pHIcon As Long, _
    pIDS As Long, _
    ByVal nIcons As Long, _
    ByVal flags As Long) As Long
   
Private Sub Form_Load()
    Me.ScaleMode = vbPixels
End Sub

Private Sub Form_Paint()
    Dim mIcon As Long, Cnt As Long, i As Long
    'Clear the form
    Me.Cls
    For Cnt = 0 To Me.ScaleWidth / 48
        PrivateExtractIcons "shell32.dll", Cnt, 48, 48, mIcon, ByVal 0&, 1, 0
        DrawIconEx Me.hdc, 48 * Cnt, 0, mIcon, 0, 0, 0, ByVal 0&, DI_NORMAL Or DI_COMPAT 'Or DI_DEFAULTSIZE
        DestroyIcon mIcon
    Next Cnt
End Sub

Private Sub Form_Resize()
    Form_Paint
End Sub
label:
cli
jmp label

ImKarlas
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 03.07.2009 (Пт) 20:16

Re: Помогите с програмкой. Извечная проблема с и иконками

Сообщение ImKarlas » 02.08.2009 (Вс) 18:08

Спасибо! Работает! :D :D :D


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

    TopList