deus napisał(a)
Hm... np. Blackbox /a raczej jego taskbary/ ma problem z oknami MDI, mdi child window jest wyświetlane na taskbarze jako oddzielne okno. Zajmij się wykrywaniem okien MDI, powinno być już dobrze.
Nie pomaga, jest jeszcze kwestia traktowania okna jeżeli nie ma ikony (wc.hIcon==0) czy go nie wyświetlać czy dać mu domyślną ikonę, explorer chyba je wyświetla, chyba znowu będę musiał zajrzeć do kodu BlackBoxa skoro tam jest to zrobione
Kopiuj
void WndsClass::RefreshWnds(HWND hwnd)
{
//WS_EX_TOOLWINDOW
LONG ExStyle=GetWindowLong(hwnd,GWL_EXSTYLE);
if(ExStyle&WS_EX_TOOLWINDOW) return;
//WS_DISABLED
ExStyle=GetWindowLong(hwnd,GWL_STYLE);
if(ExStyle&WS_DISABLED) return;
//Okno rodzica(tylko potomne do pulpitu lub 0, eliminacja okien MDI)
ExStyle=GetWindowLong(hwnd,GWL_HWNDPARENT);
if(ExStyle!=(LONG)GetDesktopWindow()&&ExStyle!=0) return;
WCHAR WndText[256];
for(UINT i=0;i<Wnds.size();i++) if(Wnds[i].hwnd==hwnd)//szukanie okna w istniejących
{
Wnds[i].Checked=1;
GetWindowText(hwnd,WndText,256);
for(UINT a=0;Wnds[i].szText[a]!='\0';a++) if(Wnds[i].szText[a]!=WndText[a])
{
Change=1;
UINT b=0;
while(WndText[b]!='\0')
{
if(b==255) break;
Wnds[i].szText[b]=WndText[b];
b++;
}
Wnds[i].szText[b]='\0';
return;
}
return;
}
//dodawanie okna
WndStruct Wnd;
Wnd.hwnd=hwnd;
GetWindowText(hwnd,WndText,256);
UINT b=0;
while(WndText[b]!='\0')
{
if(b==255) break;
Wnd.szText[b]=WndText[b];
b++;
}
Wnd.szText[b]='\0';
HICON Icon=(HICON)GetClassLong(hwnd,GCL_HICON);
//tutaj także nie wiem jak to potrakotwać, jeżeli okno nie ma swojej ikony, explorer chyba je wyświetla
if(Icon) Wnd.hIcon=Icon;
//else return;//jeżeli nie ma ikony to nie wyświetlamy okna
else Wnd.hIcon=CButtons->DefIcon;//jeżeli nie ma ikony to przypisujemy mu domyślną ikonę w powłoce
Wnd.Checked=1;
Change=1;
Wnds.push_back(Wnd);
}
Problem jednak tkwi w schowanym oknie(SW_HIDE), bo właśnie takie się pokazują, a nie powinny, nie działa sprawdzenie bitu WS_DISABLED z GetWindowLong, ani IsWindowEnabled() :-/
IsWindowVisible pomogło, już jest dobrze
Kolejny problem, tyczy się minimalizacji, gdy zamkniemy explorer'a okna minimalizowane są do belki w lewym dolnym rogu, może ktoś się zetknął z czymś takim i może coś na to zaradzić [???]
chodzi o coś takiego:
http://img261.imageshack.us/img261/6247/scrfi8.jpg</img>
Z braku odpowiedzi mam rozumieć że nie wiadomo jak schować te belki zminimalizowanych okien...
Ja rozkminiłem coś takiego:
Hook, przechwytuje wszystkie WM_MINIMIZED, i tam wykonuje pewne operacje, mam 2 warianty:
w1: minimalizacja polega na przesunięciu okna poza obszar ekranu, wtedy okna nie widać, natomiast cały czas jest VISIBLE więc widać go na pasku, wadą tego wariantu jest to, że funkcje IsIconic nie będą działały bo okno teoretycznie cały czas jest wyświetlane(nigdy zminimalizowane), chyba, żeby ręcznie oznaczyć okno jako zminimalizowane...
w2: minimalizacja polega na nadaniu statusu SW_HIDE i zapiasaniu w strukturze mojego programu, że to okno jest zminimalizowane i żeby pomimo SW_HIDE wyświetlać go na pasku, nie wiem jak zachowuje się funkcja IsIconic przy oknie SW_HIDE, ale pewnie zwraca true, bo okno wyświetlane nie jest....
który sposób lepszy, albo coś prostszego może ktoś zna [???]