Handling ofg iconized windows

svn path=/trunk/; revision=5616
This commit is contained in:
Martin Fuchs 2003-08-17 14:19:03 +00:00
parent 8568d5b2bb
commit 76a258b41b
8 changed files with 153 additions and 97 deletions

View file

@ -86,10 +86,8 @@ void explorer_show_frame(HWND hwndDesktop, int cmdshow)
}
static void InitInstance(HINSTANCE hinstance)
static void InitInstance(HINSTANCE hInstance)
{
g_Globals._hInstance = hinstance;
setlocale(LC_COLLATE, ""); // set collating rules to local settings for compareName
@ -97,9 +95,9 @@ static void InitInstance(HINSTANCE hinstance)
WindowClass wcFrame(CLASSNAME_FRAME);
wcFrame.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(IDI_EXPLORER));
wcFrame.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_EXPLORER));
wcFrame.hCursor = LoadCursor(0, IDC_ARROW);
wcFrame.hIconSm = (HICON)LoadImage(hinstance,
wcFrame.hIconSm = (HICON)LoadImage(hInstance,
MAKEINTRESOURCE(IDI_EXPLORER),
IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON),
@ -133,7 +131,7 @@ static void InitInstance(HINSTANCE hinstance)
}
int explorer_main(HINSTANCE hinstance, HWND hwndDesktop, int cmdshow)
int explorer_main(HINSTANCE hInstance, HWND hwndDesktop, int cmdshow)
{
// initialize COM and OLE
OleInit usingCOM;
@ -144,7 +142,7 @@ int explorer_main(HINSTANCE hinstance, HWND hwndDesktop, int cmdshow)
try {
MSG msg;
InitInstance(hinstance);
InitInstance(hInstance);
if (hwndDesktop)
g_Globals._desktop_mode = true;
@ -197,6 +195,8 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL
startup_desktop = TRUE;
}
g_Globals._hInstance = hInstance;
HWND hwndDesktop = 0;
if (startup_desktop)

View file

@ -332,6 +332,10 @@ SOURCE=.\res\toolbar.bmp
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\taskbar\shellhook.h
# End Source File
# Begin Source File
SOURCE=.\taskbar\taskbar.cpp
# End Source File
# Begin Source File

View file

@ -3,7 +3,22 @@ Microsoft Developer Studio Workspace File, Format Version 6.00
###############################################################################
Project: "explorer"=".\explorer.dsp" - Package Owner=<4>
Project: "explorer"=.\explorer.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name shellhook
End Project Dependency
}}}
###############################################################################
Project: "make_explorer"=.\make_explorer.dsp - Package Owner=<4>
Package=<5>
{{{
@ -15,7 +30,7 @@ Package=<4>
###############################################################################
Project: "make_explorer"=".\make_explorer.dsp" - Package Owner=<4>
Project: "shellhook"=.\shellhook.dsp - Package Owner=<4>
Package=<5>
{{{

View file

@ -44,15 +44,15 @@
#define IDW_FIRST_CHILD 0xC000 /*0x200*/
#define WM_TRANSLATE_MSG (WM_APP+2)
#define WM_GET_FILEWND_PTR (WM_APP+3)
#define WM_TRANSLATE_MSG (WM_APP+0x02)
#define WM_GET_FILEWND_PTR (WM_APP+0x03)
#define FRM_CALC_CLIENT (WM_APP+4)
#define FRM_CALC_CLIENT (WM_APP+0x04)
#define Frame_CalcFrameClient(hwnd, prt) ((BOOL)SNDMSG(hwnd, FRM_CALC_CLIENT, 0, (LPARAM)(PRECT)prt))
#define WM_OPEN_WINDOW (WM_APP+5)
#define WM_OPEN_WINDOW (WM_APP+0x05)
#define WM_GET_CONTROLWINDOW (WM_APP+6)
#define WM_GET_CONTROLWINDOW (WM_APP+0x06)
#define CLASSNAME_FRAME TEXT("CabinetWClass") // same class name for frame window as in MS Explorer

View file

@ -226,6 +226,97 @@ TaskBar::TaskBar(HWND hwnd)
_last_foreground_wnd = 0;
}
TaskBar::~TaskBar()
{
//DeinstallShellHook();
}
LRESULT TaskBar::Init(LPCREATESTRUCT pcs)
{
super::Init(pcs);
_htoolbar = CreateToolbarEx(_hwnd,
WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|CCS_TOP|//CCS_NORESIZE|
TBSTYLE_LIST|TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE|TBSTYLE_TRANSPARENT,
IDW_TASKTOOLBAR, 0, 0, 0, NULL, 0, 0, 0, 16, 16, sizeof(TBBUTTON));
SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(16,160));
//SendMessage(_htoolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
//SendMessage(_htoolbar, TB_SETDRAWTEXTFLAGS, DT_CENTER|DT_VCENTER, DT_CENTER|DT_VCENTER);
//SetWindowFont(_htoolbar, GetStockFont(ANSI_VAR_FONT), FALSE);
_next_id = IDC_FIRST_APP;
//InstallShellHook(_hwnd, WM_SHELLHOOK_NOTIFY);
Refresh();
SetTimer(_hwnd, 0, 200, NULL);
return 0;
}
LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
{
switch(nmsg) {
case WM_CLOSE:
break;
case WM_SIZE:
SendMessage(_htoolbar, WM_SIZE, 0, 0);
break;
case WM_TIMER:
Refresh();
return 0;
case WM_SHELLHOOK_NOTIFY: {
int code = lparam;
/*
switch(code) {
case HSHELL_WINDOWCREATED:
case HSHELL_WINDOWDESTROYED:
case HSHELL_WINDOWACTIVATED:
case HSHELL_WINDOWREPLACED:
Refresh();
break;
} */
Refresh();
break;}
default:
return super::WndProc(nmsg, wparam, lparam);
}
return super::WndProc(nmsg, wparam, lparam);
}
int TaskBar::Command(int id, int code)
{
TaskBarMap::iterator found = _map.find_id(id);
if (found != _map.end()) {
HWND hwnd = found->first;
if (hwnd==GetForegroundWindow() || hwnd==_last_foreground_wnd) {
ShowWindowAsync(hwnd, SW_MINIMIZE);
_last_foreground_wnd = 0;
} else {
// switch to selected application window
if (IsIconic(hwnd))
ShowWindowAsync(hwnd, SW_RESTORE);
SetForegroundWindow(hwnd);
_last_foreground_wnd = hwnd;
}
return 0;
}
return super::Command(id, code);
}
// fill task bar with buttons for enumerated top level windows
BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam)
{
@ -264,16 +355,18 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam)
++entry._used;
btn.idCommand = entry._id;
TCHAR title[BUFFER_LEN];
if (!GetWindowText(hwnd, title, BUFFER_LEN))
title[0] = '\0';
//@@ refresh window titles
// create new toolbar buttons for new windows
if (!last_id) {
if (hwnd == GetForegroundWindow())
btn.fsState |= TBSTATE_PRESSED/*|TBSTATE_MARKED*/;
TCHAR title[BUFFER_LEN];
if (!GetWindowText(hwnd, title, BUFFER_LEN))
title[0] = '\0';
if (title[0])
btn.iString = (INT_PTR)title;
@ -282,81 +375,20 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam)
SendMessage(pThis->_htoolbar, TB_INSERTBUTTON, entry._btn_idx, (LPARAM)&btn);
}
// move iconic windows out of sight
if (IsIconic(hwnd)) {
RECT rect;
GetWindowRect(hwnd, &rect);
if (rect.bottom > 0)
SetWindowPos(hwnd, 0, -32000, -32000, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
}
}
return TRUE;
}
LRESULT TaskBar::Init(LPCREATESTRUCT pcs)
{
super::Init(pcs);
_htoolbar = CreateToolbarEx(_hwnd,
WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|CCS_TOP|//CCS_NORESIZE|
TBSTYLE_LIST|TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE|TBSTYLE_TRANSPARENT,
IDW_TASKTOOLBAR, 0, 0, 0, NULL, 0, 0, 0, 16, 16, sizeof(TBBUTTON));
SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(16,160));
//SendMessage(_htoolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
//SendMessage(_htoolbar, TB_SETDRAWTEXTFLAGS, DT_CENTER|DT_VCENTER, DT_CENTER|DT_VCENTER);
//SetWindowFont(_htoolbar, GetStockFont(ANSI_VAR_FONT), FALSE);
_next_id = IDC_FIRST_APP;
Refresh();
SetTimer(_hwnd, 0, 1000, NULL);
return 0;
}
LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
{
switch(nmsg) {
case WM_CLOSE:
break;
case WM_SIZE:
SendMessage(_htoolbar, WM_SIZE, 0, 0);
break;
case WM_TIMER: // could be optimized by using WH_CBT hooks instead of timer
Refresh();
return 0;
default:
return super::WndProc(nmsg, wparam, lparam);
}
return super::WndProc(nmsg, wparam, lparam);
}
int TaskBar::Command(int id, int code)
{
TaskBarMap::iterator found = _map.find_id(id);
if (found != _map.end()) {
HWND hwnd = found->first;
if (hwnd==GetForegroundWindow() || hwnd==_last_foreground_wnd) {
ShowWindow(hwnd, SW_MINIMIZE);
_last_foreground_wnd = 0;
} else {
// switch to selected application window
SetForegroundWindow(hwnd);
if (IsIconic(hwnd))
ShowWindow(hwnd, SW_RESTORE);
_last_foreground_wnd = hwnd;
}
return 0;
}
return super::Command(id, code);
}
void TaskBar::Refresh()
{
for(TaskBarMap::iterator it=_map.begin(); it!=_map.end(); ++it)

View file

@ -26,6 +26,8 @@
//
//#include "shellhook.h"
#include <map>
#include <set>
@ -34,6 +36,8 @@
#define TASKBAR_LEFT 60
//#define TASKBAR_AT_TOP
#define WM_SHELLHOOK_NOTIFY (WM_APP+0x10)
struct DesktopBar : public Window
{
@ -74,6 +78,7 @@ struct TaskBar : public Window
typedef Window super;
TaskBar(HWND hwnd);
TaskBar::~TaskBar();
DesktopBar* _desktop_bar;
@ -87,7 +92,7 @@ protected:
LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
int Command(int id, int code);
static BOOL CALLBACK EnumWndProc(HWND, LPARAM);
static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lparam);
void Refresh();
};

View file

@ -44,7 +44,7 @@ WindowClass::WindowClass(LPCTSTR classname, WNDPROC wndproc)
}
HHOOK Window::s_hcbthook = 0;
HHOOK Window::s_hcbtHook = 0;
Window::WINDOWCREATORFUNC Window::s_window_creator = NULL;
const void* Window::s_new_info = NULL;
@ -84,11 +84,11 @@ Window* Window::create_mdi_child(HWND hmdiclient, const MDICREATESTRUCT& mcs, WI
s_new_info = info;
s_new_child_wnd = NULL;
s_hcbthook = SetWindowsHookEx(WH_CBT, CBTHookProc, 0, GetCurrentThreadId());
s_hcbtHook = SetWindowsHookEx(WH_CBT, CBTHookProc, 0, GetCurrentThreadId());
HWND hwnd = (HWND) SendMessage(hmdiclient, WM_MDICREATE, 0, (LPARAM)&mcs);
UnhookWindowsHookEx(s_hcbthook);
UnhookWindowsHookEx(s_hcbtHook);
Window* child = s_new_child_wnd;
s_new_info = NULL;
@ -110,7 +110,7 @@ LRESULT CALLBACK Window::CBTHookProc(int code, WPARAM wparam, LPARAM lparam)
s_new_child_wnd = child;
}
return CallNextHookEx(s_hcbthook, code, wparam, lparam);
return CallNextHookEx(s_hcbtHook, code, wparam, lparam);
}

View file

@ -75,7 +75,7 @@ protected:
static WINDOWCREATORFUNC s_window_creator; //TODO: protect for multithreaded access
// MDI child creation
static HHOOK s_hcbthook;
static HHOOK s_hcbtHook;
static LRESULT CALLBACK CBTHookProc(int code, WPARAM wparam, LPARAM lparam);
};
@ -126,7 +126,7 @@ struct WindowClass : public WNDCLASSEX
};
#define WM_DISPATCH_COMMAND (WM_APP+0)
#define WM_DISPATCH_COMMAND (WM_APP+0x00)
#define SPLIT_WIDTH 5
@ -140,7 +140,7 @@ struct MenuInfo
HMENU _hMenuOptions;
};
#define FRM_GET_MENUINFO (WM_APP+1)
#define FRM_GET_MENUINFO (WM_APP+0x01)
#define Frame_GetMenuInfo(hwnd) ((MenuInfo*)SNDMSG(hwnd, FRM_GET_MENUINFO, 0, 0))