lstrcpyn(szIconFile, _T("c:\\winnt\\system32\\shell32.dll"),cchMax); // ну или найти граммотно где находится shell32.dll
...
*piIndex = 4; // индекс иконы открытой папки
*piIndex = 3; // индекс иконы открытой папки
...
HICON *phiconSmall
...
*phiconSmall = ExtractIcon(
_Module.m_hInst, // instance handle
szIconFile, // file name
nIconIndex
);
а еще, загляните сюда :
HKEY_CLASSES_ROOT\Folder\DefaultIcon
может, кто скажет, как это сделать ЕЩЕ умнее?
спасибо
!> lstrcpyn(szIconFile, _T("c:\\winnt\\system32\\shell32.dll"),cchMax); // ну или найти граммотно где находится shell32.dll
!>...
!> *piIndex = 4; // индекс иконы открытой папки
!> *piIndex = 3; // индекс иконы открытой папки
!>...
!> HICON *phiconSmall
!>...
!> *phiconSmall = ExtractIcon(
!> _Module.m_hInst, // instance handle
!> szIconFile, // file name
!> nIconIndex
!> );
!>
!>а еще, загляните сюда :
!>
!>HKEY_CLASSES_ROOT\Folder\DefaultIcon
!>
Спасибо, но хотелось бы обойтись только средствами NET...имхо, пишешь на C# — используй только NET, а Win32 тут не причем.
Но все равно, спасибо. Не уж-то эти ребята из микрософт опять че-то не доделали? Прискорбно
Хотя, одно то, что header (тот, который в ListView) исключен из контролов, говорит о многом!
К модераторам:
Вы, уважаемые, не делайте поспешных выводов. Не надо это сообщение в WinAPI переносить. Я ведь тоже не вчера на этот форум пришел, и если я его здесь написал, то, видимо, на то были причины. Или я должен был начать сообщение как-то так: "Я вот пишу тут на C# и у меня возник вопрос..."?
А зачем тогда форуты разные если я, для понятности, так писать должен?
KSA>Спасибо, но хотелось бы обойтись только средствами NET...имхо, пишешь на C# — используй только NET, а Win32 тут не причем. KSA>Но все равно, спасибо. Не уж-то эти ребята из микрософт опять че-то не доделали? Прискорбно
Гм, странно, а Вы знаете как на Java проделать ту же самую операцию? И я не знаю!
Так что ето касается только Винды, потому и функции нада использовать касаютщиеся тока Windows .. так что ребята правильно сделали.. мот быть тока для удобства все ето счастье не портировали на .NET, но зачем кода мона руками все испортировать
Здравствуйте, KaSA, Вы писали: KSA>Та, которая используется Explorer'ом... O>я тоже долго и муторно пытался все сделать хотя бы через
[skipped] O>в конце концов сделал
[skipped] KSA>Спасибо, но хотелось бы обойтись только средствами NET...имхо, пишешь на C# — используй только NET, а Win32 тут не причем.
ну как это "не причем" Или вы видели как работает Explorer на других платформах???
under «*none*»,
... << RSDN@Home 1.1.4 beta 6a rev. 444>>
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, KaSA, Вы писали:
KSA>Спасибо, но хотелось бы обойтись только средствами NET...имхо, пишешь на C# — используй только NET, а Win32 тут не причем. KSA>Но все равно, спасибо. Не уж-то эти ребята из микрософт опять че-то не доделали? Прискорбно KSA>Хотя, одно то, что header (тот, который в ListView) исключен из контролов, говорит о многом!
Про только NET в контексте данного вопроса спокойно забываем — импоссибл. Я долго колбасился с этим вопросом: писал свое, брал готовые(и здоровые!) библиотеки(на C#) c codeproject, и т.п. Резюме: 100%но вопрос не решен до сих пор(!) Да, обычно показывает нормально и ПОЧТИ все, но... То иконка ассоциированная с приложением рисуется неверно, то когда в сетевые ресурсы лезешь иконки сетевых компов неверные, то еще чего-нибудь... Короче вопрос получился на удивление "мутным"...
Здравствуйте, KaSA, Вы писали:
KSA>Спасибо, но хотелось бы обойтись только средствами NET...имхо, пишешь на C# — используй только NET, а Win32 тут не причем. KSA>Но все равно, спасибо. Не уж-то эти ребята из микрософт опять че-то не доделали? Прискорбно KSA>Хотя, одно то, что header (тот, который в ListView) исключен из контролов, говорит о многом!
Про только NET в контексте данного вопроса спокойно забываем — импоссибл. Я долго колбасился с этим вопросом: писал свое, брал готовые(и здоровые!) библиотеки(на C#) c codeproject, и т.п. Резюме: 100%но вопрос не решен до сих пор(!) Да, обычно показывает нормально и ПОЧТИ все, но... То иконка ассоциированная с приложением рисуется неверно, то когда в сетевые ресурсы лезешь иконки сетевых компов неверные, то еще чего-нибудь... Короче вопрос получился на удивление "мутным"...
В ShellIcons я определил некоторые именованные константы-проперти (не факт, что все правильно, мне нужно было всего 5 стандартных иконок, остальные я насувал без проверки)
в любом месте можно вызвать:
ShellIcons.ShowIcons();
И посмотреть соответствие иконок номерам.
Сами классы:
using System.Drawing;
using System.Windows.Forms;
using EsdGuiLib.Controls;
namespace EsdGuiLib {
/// <summary>
/// Summary description for ShellIcons.
/// </summary>public sealed class ShellIcons {
static ShellIconCache _smallIcons = new ShellIconCache(false);
static ShellIconCache _largeIcons = new ShellIconCache(true);
ShellIcons() {}
public static ShellIconCache Small {
get { return _smallIcons; }
}
public static ShellIconCache Large {
get { return _largeIcons; }
}
public static void ShowIcons() {
Form frm = new Form();
frm.AutoScroll = true;
frm.BackColor = SystemColors.Window;
frm.TopLevel = false;
frm.Dock = DockStyle.Fill;
frm.FormBorderStyle = FormBorderStyle.None;
int xStep = 100;
int yStep = 40;
int yColumn = 8;
for(int i=0; i<256; i++) {
int j = i/yColumn * xStep;
int k = i%yColumn;
Label label = new Label();
label.Text = i.ToString();
label.Location = new Point(j + 4, k*yStep+6);
label.Width = label.Width/4;
frm.Controls.Add(label);
IconBox iconBoxSmall = new IconBox();
iconBoxSmall.Icon = ShellIcons.Small[i];
iconBoxSmall.Location = new Point(label.Right + 4, k*yStep+4);
frm.Controls.Add(iconBoxSmall);
IconBox iconBox = new IconBox();
iconBox.Icon = ShellIcons.Large[i];
iconBox.Location = new Point(iconBoxSmall.Right + 8, k*yStep+4);
frm.Controls.Add(iconBox);
}
Form frm1 = new Form();
frm1.StartPosition = FormStartPosition.CenterParent;
frm1.Controls.Add(frm);
frm.Visible = true;
frm1.Height = yColumn * yStep + SystemInformation.CaptionHeight +
SystemInformation.HorizontalScrollBarHeight + SystemInformation.Border3DSize.Height*2;
frm1.Width = 800;
frm1.MaximumSize = new Size(10000, frm1.Height);
frm1.ShowDialog();
}
}
public class ShellIconCache : FileIconCache {
public ShellIconCache(bool largeIcons)
: base("Shell32.dll", largeIcons) {}
public Icon File {
get { return base[0]; }
}
public Icon Document {
get { return base[1]; }
}
public Icon Program {
get { return base[2]; }
}
public Icon Folder {
get { return base[3]; }
}
public Icon OpenFolder {
get { return base[4]; }
}
public Icon Floppy {
get { return base[5]; }
}
public Icon Jazz {
get { return base[6]; }
}
public Icon UsbHD {
get { return base[7]; }
}
public Icon HD {
get { return base[8]; }
}
public Icon NetworkDrive {
get { return base[9]; }
}
public Icon NetworkDriveDisconnected {
get { return base[10]; }
}
public Icon CD {
get { return base[11]; }
}
public Icon Memory {
get { return base[12]; }
}
public Icon Web {
get { return base[13]; }
}
public Icon WebMouse {
get { return base[14]; }
}
public Icon Printer {
get { return base[15]; }
}
public Icon WebDesktop {
get { return base[16]; }
}
public Icon Network {
get { return base[17]; }
}
public Icon Programs {
get { return base[18]; }
}
public Icon Schedulle {
get { return base[19]; }
}
public Icon Property {
get { return base[21]; }
}
public Icon Find {
get { return base[21]; }
}
public Icon Help {
get { return base[22]; }
}
public Icon Run {
get { return base[23]; }
}
public Icon MonitorOld {
get { return base[24]; }
}
public Icon PlugOut {
get { return base[25]; }
}
public Icon CloseButton {
get { return base[26]; }
}
public Icon Shared {
get { return base[27]; }
}
public Icon Link {
get { return base[28]; }
}
public Icon Timed {
get { return base[29]; }
}
public Icon RecircleBin {
get { return base[30]; }
}
public Icon RecircleBinFull {
get { return base[31]; }
}
public Icon Terminals {
get { return base[32]; }
}
public Icon Desktop {
get { return base[15]; }
}
public Icon ControlPanel {
get { return base[34]; }
}
public Icon Programs2 {
get { return base[35]; }
}
public Icon Printers {
get { return base[36]; }
}
public Icon Fonts {
get { return base[37]; }
}
public Icon StartMenu {
get { return base[38]; }
}
public Icon MediaCD {
get { return base[39]; }
}
public Icon Tree {
get { return base[40]; }
}
public Icon SystemFolder {
get { return base[41]; }
}
public Icon Favorites {
get { return base[42]; }
}
public Icon LockButton {
get { return base[43]; }
}
public Icon SearchFolder {
get { return base[44]; }
}
public Icon WebMsLogo {
get { return base[45]; }
}
public Icon Lock {
get { return base[46]; }
}
public Icon Task {
get { return base[72]; }
}
}
}
using System;
using System.Collections;
using System.Drawing;
namespace EsdGuiLib
{
public class FileIconCache {
bool _largeIcons;
string _fileName;
Hashtable _icons = new Hashtable();
public FileIconCache(string fileName, bool largeIcons) {
_largeIcons = largeIcons;
_fileName = fileName;
}
public Icon this[int index] {
get {
if(!_icons.ContainsKey(index)) {
IntPtr[] icon = new IntPtr[1];
WinApi.ExtractIconEx(_fileName,
index, _largeIcons?icon:null, _largeIcons?null:icon, 1);
if(icon[0].ToInt32()!=0)
_icons.Add(index, Icon.FromHandle(icon[0]));
}
return (Icon) _icons[index];
}
}
}
}
[DllImport("Shell32.dll", CharSet=CharSet.Auto)]
public static extern uint ExtractIconEx(
string lpszFile, int nIconIndex, IntPtr[] phiconLarge, IntPtr[] phiconSmall, uint nIcons );
Re[3]: Как получить иконку для отображения папок?
От:
Аноним
Дата:
09.01.06 09:22
Оценка:
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, ole!, Вы писали:
O>>может, кто скажет, как это сделать ЕЩЕ умнее?
V>Умнее чего? Тебе нужны вещи, специфичные для виндов, вот и возись со спецификой.
V>Даю пару велосипедов на эту тему (код ниже):
V>Использовать так: V>
V>В ShellIcons я определил некоторые именованные константы-проперти (не факт, что все правильно, мне нужно было всего 5 стандартных иконок, остальные я насувал без проверки)
V>в любом месте можно вызвать: V>
V>ShellIcons.ShowIcons();
V>
И посмотреть соответствие иконок номерам.
V>Сами классы: V>
V>using System.Drawing;
V>using System.Windows.Forms;
V>using EsdGuiLib.Controls;
V>namespace EsdGuiLib {
V> /// <summary>
V> /// Summary description for ShellIcons.
V> /// </summary>
V> public sealed class ShellIcons {
V> static ShellIconCache _smallIcons = new ShellIconCache(false);
V> static ShellIconCache _largeIcons = new ShellIconCache(true);
V> ShellIcons() {}
V> public static ShellIconCache Small {
V> get { return _smallIcons; }
V> }
V> public static ShellIconCache Large {
V> get { return _largeIcons; }
V> }
V> public static void ShowIcons() {
V> Form frm = new Form();
V> frm.AutoScroll = true;
V> frm.BackColor = SystemColors.Window;
V> frm.TopLevel = false;
V> frm.Dock = DockStyle.Fill;
V> frm.FormBorderStyle = FormBorderStyle.None;
V> int xStep = 100;
V> int yStep = 40;
V> int yColumn = 8;
V> for(int i=0; i<256; i++) {
V> int j = i/yColumn * xStep;
V> int k = i%yColumn;
V> Label label = new Label();
V> label.Text = i.ToString();
V> label.Location = new Point(j + 4, k*yStep+6);
V> label.Width = label.Width/4;
V> frm.Controls.Add(label);
V> IconBox iconBoxSmall = new IconBox();
V> iconBoxSmall.Icon = ShellIcons.Small[i];
V> iconBoxSmall.Location = new Point(label.Right + 4, k*yStep+4);
V> frm.Controls.Add(iconBoxSmall);
V> IconBox iconBox = new IconBox();
V> iconBox.Icon = ShellIcons.Large[i];
V> iconBox.Location = new Point(iconBoxSmall.Right + 8, k*yStep+4);
V> frm.Controls.Add(iconBox);
V> }
V> Form frm1 = new Form();
V> frm1.StartPosition = FormStartPosition.CenterParent;
V> frm1.Controls.Add(frm);
V> frm.Visible = true;
V> frm1.Height = yColumn * yStep + SystemInformation.CaptionHeight +
V>SystemInformation.HorizontalScrollBarHeight + SystemInformation.Border3DSize.Height*2;
V> frm1.Width = 800;
V> frm1.MaximumSize = new Size(10000, frm1.Height);
V> frm1.ShowDialog();
V> }
V> }
V> public class ShellIconCache : FileIconCache {
V> public ShellIconCache(bool largeIcons)
V> : base("Shell32.dll", largeIcons) {}
V> public Icon File {
V> get { return base[0]; }
V> }
V> public Icon Document {
V> get { return base[1]; }
V> }
V> public Icon Program {
V> get { return base[2]; }
V> }
V> public Icon Folder {
V> get { return base[3]; }
V> }
V> public Icon OpenFolder {
V> get { return base[4]; }
V> }
V> public Icon Floppy {
V> get { return base[5]; }
V> }
V> public Icon Jazz {
V> get { return base[6]; }
V> }
V> public Icon UsbHD {
V> get { return base[7]; }
V> }
V> public Icon HD {
V> get { return base[8]; }
V> }
V> public Icon NetworkDrive {
V> get { return base[9]; }
V> }
V> public Icon NetworkDriveDisconnected {
V> get { return base[10]; }
V> }
V> public Icon CD {
V> get { return base[11]; }
V> }
V> public Icon Memory {
V> get { return base[12]; }
V> }
V> public Icon Web {
V> get { return base[13]; }
V> }
V> public Icon WebMouse {
V> get { return base[14]; }
V> }
V> public Icon Printer {
V> get { return base[15]; }
V> }
V> public Icon WebDesktop {
V> get { return base[16]; }
V> }
V> public Icon Network {
V> get { return base[17]; }
V> }
V> public Icon Programs {
V> get { return base[18]; }
V> }
V> public Icon Schedulle {
V> get { return base[19]; }
V> }
V> public Icon Property {
V> get { return base[21]; }
V> }
V> public Icon Find {
V> get { return base[21]; }
V> }
V> public Icon Help {
V> get { return base[22]; }
V> }
V> public Icon Run {
V> get { return base[23]; }
V> }
V> public Icon MonitorOld {
V> get { return base[24]; }
V> }
V> public Icon PlugOut {
V> get { return base[25]; }
V> }
V> public Icon CloseButton {
V> get { return base[26]; }
V> }
V> public Icon Shared {
V> get { return base[27]; }
V> }
V> public Icon Link {
V> get { return base[28]; }
V> }
V> public Icon Timed {
V> get { return base[29]; }
V> }
V> public Icon RecircleBin {
V> get { return base[30]; }
V> }
V> public Icon RecircleBinFull {
V> get { return base[31]; }
V> }
V> public Icon Terminals {
V> get { return base[32]; }
V> }
V> public Icon Desktop {
V> get { return base[15]; }
V> }
V> public Icon ControlPanel {
V> get { return base[34]; }
V> }
V> public Icon Programs2 {
V> get { return base[35]; }
V> }
V> public Icon Printers {
V> get { return base[36]; }
V> }
V> public Icon Fonts {
V> get { return base[37]; }
V> }
V> public Icon StartMenu {
V> get { return base[38]; }
V> }
V> public Icon MediaCD {
V> get { return base[39]; }
V> }
V> public Icon Tree {
V> get { return base[40]; }
V> }
V> public Icon SystemFolder {
V> get { return base[41]; }
V> }
V> public Icon Favorites {
V> get { return base[42]; }
V> }
V> public Icon LockButton {
V> get { return base[43]; }
V> }
V> public Icon SearchFolder {
V> get { return base[44]; }
V> }
V> public Icon WebMsLogo {
V> get { return base[45]; }
V> }
V> public Icon Lock {
V> get { return base[46]; }
V> }
V> public Icon Task {
V> get { return base[72]; }
V> }
V> }
V>}
V>
Чуваки!!! Тоже мучался пару часов, искал — всё просто:
в любой папке: My documents, My images, My favorites находится файл Desktop.ini в котором IconFile,IconIndex
по ним можно получить нужную иконку!!!