arrowHome Friday, 10 September 2010  



 
Google
Web winapi.org
Main Menu
Home
News
FAQ
Links
Download
Kontakt
FORUM

Artykuły
Podstawy
GDI i Multimedia
Kontrolki
inne
Winapi + asm
WinSock
Soft
Login Form
Login

Hasło

Zapamiętaj mnie
Nie pamiętasz hasła?
Nie masz konta? Załóż je sobie
Odświeżanie ikon (UPDATE) Drukuj E-mail
Oceny: / 5
KiepskiBardzo dobry 
Nadesłał Twardy   
Monday, 07 March 2005

[Wersja zmieniona]

Często tworząc aplikacje obsługującą dany format pliku rejestrujemy dane rozszerzenie, aby nasz program otwieral ten zbiór i dodatkowo dla danego rozszerzenia przypisujemy odpowiednią ikone. Operacja jest banalna i sprowadza się do manipulacji wpisami w rejestrze. Nie będę tego procesu opisywał dokładnie, gdyż nie oto tutaj chodzi. I teraz po zarejestrowaniu takiego rozszerzenia i przypisaniu mu ikony chcielibyśmy aby efekt był widoczny bezpośrednio, tzn. aby plik z naszym rozszerzeniem odświeżył ikone i żeby zmieniła się ona na odpowiednią dla tego pliku.

Aby to wykonać, należy wprowadzić chwilową zmianę w rejestrze systemowym aby po odświeżeniu wszystkich okien ponownie ją przywrócić i w końcu jeszcze raz odświeżyć wszystkie okna. Zmiana dotyczyć będzie wielkości dla rozmiaru ikon. A oto kod, który to wykona:

#include <windows.h>
#include <shlobj.h>

int main()
{

  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);

}

Wersja wcześniejsza, która czasami sprawiała problemy zwłaszcza pod WinXP (źródło napisane pod delphi):

var key:HKEY;
    typ,sz:dword;
    i,code:integer;
    buf:array[0..255]of char;
begin
 if RegOpenkeyEx(HKEY_CURRENT_USER,'Control PanelDesktopWindowMetrics',0,KEY_WRITE or KEY_READ,Key)=ERROR_SUCCESS then begin
  typ:=REG_SZ;
  sz:=sizeof(buf);
  if RegQueryValueEx(key,'Shell Icon Size',nil,@typ,@buf,@sz)<>ERROR_SUCCESS then begin
   RegCloseKey(Key);
   exit;
  end;

  val(buf,i,code);
  if code<>0 then begin
   RegCloseKey(Key);
   exit;
  end;
  inc(i);
  fillchar(buf,sizeof(buf),0);
  str(i,buf);
  sz:=length(buf);
  if RegSetValueEx(key,'Shell Icon Size',0,typ,@buf,sz)<>ERROR_SUCCESS then begin
   RegCloseKey(Key);
   exit;
  end;

  SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0);

  dec(i);
  fillchar(buf,sizeof(buf),0);
  str(i,buf);
  sz:=length(buf);
  RegSetValueEx(key,'Shell Icon Size',0,typ,@buf,sz);

  RegCloseKey(Key);

  SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0);
 end;
end;

opis dzialania powyzszej funkcji:

1. Otwarcie klucza rejestru:

HKEY_CURRENT_USER/Control Panel/Desktop/WindowMetrics

2. Odczytanie wartosci: Shell Icon Size

3. Odczytana wartosc jest liczba calkowita. Inkrementujemy ja o 1 i nadpisujemy wartosc Shell Icon Size w danym kluczu

4. Odswiezamy wszystkie okna za pomoca sendmessage z kolejnymi parametrami: HWND_BROADCAST,WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS,0

5. ponownie aktualizujemy wartosc Shell Icon Size rejestru wartoscia oryginalna

6. Ponowne odswezenie okien (pkt. 4)

7. Zamykamy klucz rejestru.

Ostatnia aktualizacja ( Friday, 18 November 2005 )
< Poprzedni   Następny >
Ankieta
Jak ocenisz poziom swoich umiejętnośći?
  
Dodaj do ulubionych
Ustaw stronę startową
Ostatnio dodane
Popularne
 
top

www.winapi.org © 2003 - 2007