Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Системный Hint в файловом браузере, Системный Hint в файловом браузере 
V
    Опции темы
Keeper89
Дата 11.3.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Доброго времени суток!

Делаю файловый браузер на основе ShellListView. Как можно показать Hint аналогично проводнику Windows, который обычно отображается при наведении курсора на папку или файл (желательно вызвать саму системную подсказку)?

Заранее спасибо.


--------------------
PM MAIL WWW   Вверх
Rrader
  Дата 11.3.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Вызывать надо самостоятельно - создавать вручную окошко tooltips_class32 (API) или THintWindow (VCL), вручную и показывать. А текст получить можно так:
Код

...
const
  IID_IQueryInfo: TGUID = (
    D1: $00021500; D2: $0000; D3: $0000; D4: ($C0, 0, 0, 0, 0, 0, 0, $46));
  QITIPF_DEFAULT = $00000000;
  QITIPF_USENAME = $00000001;
  QITIPF_LINKNOTARGET = $00000002;
  QITIPF_LINKUSETARGET = $00000004;
  QITIPF_USESLOWTIP = $00000008;
var
  QI: IQueryInfo;
begin
  { Возьмем код из соседней ветки - дошли до
    Folder.ParseDisplayName, получаем Hint }
...
  { FileName }
  if Succeeded(Folder.ParseDisplayName(0, nil,
    PFileName, PULONG(nil)^, ItemID, PULONG(nil)^)) then
  try
    if Succeeded(Folder.GetUIObjectOf(0, 1, ItemID, IID_IQueryInfo,
      nil, QI)) then
    try
      if Succeeded(QI.GetInfoTip(QITIPF_DEFAULT, Tip)) then
      try
        ShowMessage(Tip);
      finally
        CoTaskMemFree(Tip);
      end;
    finally
      QI := nil;
    end;
...


Это сообщение отредактировал(а) Rrader - 11.3.2009, 17:29


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Keeper89
Дата 11.3.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Видоизменил свой код согласно вашему:
Код

procedure MyShowHint(AFolder: TShellFolder);
const
  IID_IQueryInfo: TGUID = (
    D1: $00021500; D2: $0000; D3: $0000; D4: ($C0, 0, 0, 0, 0, 0, 0, $46));
  QITIPF_DEFAULT = $00000000;
  QITIPF_USENAME = $00000001;
  QITIPF_LINKNOTARGET = $00000002;
  QITIPF_LINKUSETARGET = $00000004;
  QITIPF_USESLOWTIP = $00000008;
var
  PIDL: PItemIDList;
  Tip: PWIdeChar;
  QI: IQueryInfo;
begin

  if AFolder = nil then Exit;
  PIDL := AFolder.RelativeID;
  AFolder.ParentShellFolder.GetUIObjectOf(0, 1, PIDL, IID_IQueryInfo, nil, QI);

    try
      if Succeeded(QI.GetInfoTip(QITIPF_DEFAULT, Tip)) then
      try
        ShowMessage(Tip);
      finally
        CoTaskMemFree(Tip);
      end;
    finally
      QI := nil;
    end;
end;

Все работает отлично, единственное плохо - показывает пустой ShowMessage для папок. С другими объектами все в порядке.

Это сообщение отредактировал(а) Keeper89 - 11.3.2009, 22:47


--------------------
PM MAIL WWW   Вверх
Rrader
  Дата 12.3.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Виртуальные папки - пример для Корзины:
Код

procedure TForm1.Button1Click(Sender: TObject);
const
  IID_IQueryInfo: TGUID = (
    D1: $00021500; D2: $0000; D3: $0000; D4: ($C0, 0, 0, 0, 0, 0, 0, $46));
  QITIPF_DEFAULT = $00000000;
  QITIPF_USENAME = $00000001;
  QITIPF_LINKNOTARGET = $00000002;
  QITIPF_LINKUSETARGET = $00000004;
  QITIPF_USESLOWTIP = $00000008;
var
  { Recycle Bin ID }
  ID: PItemIDList;
  { Shell Allocator }
  Malloc: IMalloc;
  { Desktop IShellFolder }
  Desktop: IShellFolder;
  Tip: PWideChar;
  QI: IQueryInfo;
begin
  if Succeeded(CoGetMalloc(1, Malloc)) then
  try
    if Succeeded(SHGetSpecialFolderLocation(Handle, CSIDL_BITBUCKET, ID)) then
    try
      if Succeeded(SHGetDesktopFolder(Desktop)) then
      try
        if Succeeded(Desktop.GetUIObjectOf(0, 1, ID, IID_IQueryInfo,
          nil, QI)) then
        try
          if Succeeded(QI.GetInfoTip(QITIPF_USESLOWTIP, Tip)) then
          try
            ShowMessage(Tip);
          finally
            CoTaskMemFree(Tip);
          end;
        finally
          QI := nil;
        end;
      finally
        Desktop := nil;
      end;
    finally
      Malloc.Free(ID);
    end;
  finally
    Malloc := nil;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CoInitialize(nil);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  CoUninitialize();
end;

А вот для C:\WINDOWS (ну, так у меня smile )
Код

procedure TForm1.Button1Click(Sender: TObject);
const
  IID_IQueryInfo: TGUID = (
    D1: $00021500; D2: $0000; D3: $0000; D4: ($C0, 0, 0, 0, 0, 0, 0, $46));
  QITIPF_DEFAULT = $00000000;
  QITIPF_USENAME = $00000001;
  QITIPF_LINKNOTARGET = $00000002;
  QITIPF_LINKUSETARGET = $00000004;
  QITIPF_USESLOWTIP = $00000008;
var
  ID, ItemID: PItemIDList;
  Malloc: IMalloc;
  Desktop: IShellFolder;
  Folder: IShellFolder2;
  Tip: PWideChar;
  QI: IQueryInfo;
  Path: WideString;
begin
  Path := 'C:\WINDOWS';
  if Succeeded(CoGetMalloc(1, Malloc)) then
  try
    if Succeeded(SHGetDesktopFolder(Desktop)) then
    try
      if Succeeded(Desktop.ParseDisplayName(0, nil,
        StringToOleStr(ExtractFilePath(Path)), PULONG(nil)^,
        ID, PULONG(nil)^)) then
      try
        if Succeeded(Desktop.BindToObject(ID, nil,
          IID_IShellFolder2, Folder)) then
        try
          if Succeeded(Folder.ParseDisplayName(0, nil,
            StringToOleStr(ExtractFileName(Path)) , PULONG(nil)^,
            ItemID, PULONG(nil)^)) then
          try
            if Succeeded(Folder.GetUIObjectOf(0, 1, ItemID, IID_IQueryInfo,
              nil, QI)) then
            try
              if Succeeded(QI.GetInfoTip(QITIPF_USESLOWTIP, Tip)) then
              try
                ShowMessage(Tip);
              finally
                CoTaskMemFree(Tip);
              end;
            finally
              QI := nil;
            end;
          finally
            Malloc.Free(ItemID);
          end;
        finally
          Folder := nil;
        end;
      finally
       Malloc.Free(ID);
      end;
    finally
      Desktop := nil;
    end;
  finally
    Malloc := nil;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CoInitialize(nil);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  CoUninitialize();
end;

Keeper89, рекомендую самостоятельно читать все подряд про Shell В MSDN и разбираться в теме. Открываете главу Shell Iterfaces и все читаете....иначе Ваш файловый менеджер будет весь на темах этого форума основан - разве так интересно? smile 

Это сообщение отредактировал(а) Rrader - 25.4.2009, 17:09


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Keeper89
Дата 12.3.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(Rrader @  12.3.2009,  19:59 Найти цитируемый пост)
рекомендую самостоятельно читать все подряд про Shell В MSDN и разбираться в теме. Открываете главу Shell Iterfaces и все читаете....иначе Ваш файловый менеджер будет весь на темах этого форума основан - разве так интересно? smile 

Согласен, буду искать время.  smile 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.