From 6497f3daae131840154e79aa58d88f27251f1ecd Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 11 Aug 2003 19:44:53 +0000 Subject: [PATCH] draw blue background svn path=/trunk/; revision=5533 --- .../system/explorer/desktop/desktop.cpp | 205 ++++++++++-------- .../subsys/system/explorer/desktop/desktop.h | 13 +- .../system/explorer/shell/filechild.cpp | 28 +-- reactos/subsys/system/explorer/shell/pane.cpp | 47 ++-- reactos/subsys/system/explorer/shell/pane.h | 6 +- .../system/explorer/shell/shellbrowser.cpp | 15 +- .../subsys/system/explorer/utility/window.cpp | 5 + .../subsys/system/explorer/utility/window.h | 4 +- 8 files changed, 187 insertions(+), 136 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index d43a78ff90f..9893e280c89 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -46,6 +46,55 @@ BOOL IsAnyDesktopRunning() } +static void draw_desktop_background(HWND hwnd, HDC hdc) +{ + // We'd want to draw the desktop wallpaper here. Need to + // maintain a copy of the wallpaper in an off-screen DC and then + // bitblt (or stretchblt?) it to the screen appropriately. For + // now, though, we'll just draw some text. + + static const TCHAR BkgndText[] = TEXT("ReactOS 0.1.2 Desktop Example\nby Silver Blade, Martin Fuchs"); + + RECT rect; + GetClientRect(hwnd, &rect); + + HBRUSH bkgndBrush = CreateSolidBrush(RGB(0,32,160)); // dark blue + FillRect(hdc, &rect, bkgndBrush/*GetStockBrush(BLACK_BRUSH)*/); + DeleteBrush(bkgndBrush); + + // This next part could be improved by working out how much + // space the text actually needs... + + rect.left = rect.right - 260; + rect.top = rect.bottom - 80; + rect.right = rect.left + 250; + rect.bottom = rect.top + 40; + + SetTextColor(hdc, RGB(255,255,255)); + SetBkMode(hdc, TRANSPARENT); + DrawText(hdc, BkgndText, -1, &rect, DT_RIGHT); +} + + +LRESULT BackgroundWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_ERASEBKGND: + draw_desktop_background(_hwnd, (HDC)wparam); + return TRUE; + + case WM_RBUTTONDBLCLK: + explorer_show_frame(_hwnd, SW_SHOWNORMAL); + break; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + + DesktopWindow::DesktopWindow(HWND hwnd) : super(hwnd) { @@ -62,116 +111,94 @@ DesktopWindow::~DesktopWindow() LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { switch(nmsg) { - case WM_PAINT: { - // We'd want to draw the desktop wallpaper here. Need to - // maintain a copy of the wallpaper in an off-screen DC and then - // bitblt (or stretchblt?) it to the screen appropriately. For - // now, though, we'll just draw some text. + case WM_PAINT: { + PAINTSTRUCT ps; + draw_desktop_background(_hwnd, BeginPaint(_hwnd, &ps)); + EndPaint(_hwnd, &ps); + break;} - PAINTSTRUCT ps; - HDC DesktopDC = BeginPaint(_hwnd, &ps); + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + explorer_show_frame(_hwnd, SW_SHOWNORMAL); + break; - static const TCHAR Text [] = TEXT("ReactOS 0.1.2 Desktop Example\nby Silver Blade, Martin Fuchs"); + case WM_GETISHELLBROWSER: + return (LRESULT)static_cast(this); + + case WM_CREATE: { + HRESULT hr = Desktop()->CreateViewObject(_hwnd, IID_IShellView, (void**)&_pShellView); + + HWND hWndView = 0; + + if (SUCCEEDED(hr)) { + FOLDERSETTINGS fs; + + fs.ViewMode = FVM_ICON; + fs.fFlags = FWF_DESKTOP|FWF_TRANSPARENT|FWF_NOCLIENTEDGE|FWF_NOSCROLL|FWF_BESTFITWINDOW|FWF_SNAPTOGRID; RECT rect; GetClientRect(_hwnd, &rect); - // This next part could be improved by working out how much - // space the text actually needs... + hr = _pShellView->CreateViewWindow(NULL, &fs, this, &rect, &hWndView); - rect.left = rect.right - 260; - rect.top = rect.bottom - 80; - rect.right = rect.left + 250; - rect.bottom = rect.top + 40; - - SetTextColor(DesktopDC, 0x00ffffff); - SetBkMode(DesktopDC, TRANSPARENT); - DrawText(DesktopDC, Text, -1, &rect, DT_RIGHT); - - EndPaint(_hwnd, &ps); - break;} - - case WM_LBUTTONDBLCLK: - explorer_show_frame(_hwnd, SW_SHOWNORMAL); - break; - - case WM_GETISHELLBROWSER: - return (LRESULT)static_cast(this); - - case WM_CREATE: { - HRESULT hr = Desktop()->CreateViewObject(_hwnd, IID_IShellView, (void**)&_pShellView); - - HWND hWndView = 0; + //TODO: use IShellBrowser::GetViewStateStream() to restore previous view state if (SUCCEEDED(hr)) { - FOLDERSETTINGS fs; + _pShellView->UIActivate(SVUIA_ACTIVATE_FOCUS); - fs.ViewMode = FVM_ICON; - fs.fFlags = FWF_DESKTOP|FWF_TRANSPARENT|FWF_NOCLIENTEDGE|FWF_NOSCROLL|FWF_BESTFITWINDOW|FWF_SNAPTOGRID; + /* + IShellView2* pShellView2; - RECT rect; - GetClientRect(_hwnd, &rect); + hr = _pShellView->QueryInterface(IID_IShellView2, (void**)&pShellView2); - hr = _pShellView->CreateViewWindow(NULL, &fs, this, &rect, &hWndView); + SV2CVW2_PARAMS params; + params.cbSize = sizeof(SV2CVW2_PARAMS); + params.psvPrev = _pShellView; + params.pfs = &fs; + params.psbOwner = this; + params.prcView = ▭ + params.pvid = params.pvid;//@@ - //TODO: use IShellBrowser::GetViewStateStream() to restore previous view state + hr = pShellView2->CreateViewWindow2(¶ms); + params.pvid; + */ + + /* + IFolderView* pFolderView; + + hr = _pShellView->QueryInterface(IID_IFolderView, (void**)&pFolderView); if (SUCCEEDED(hr)) { - _pShellView->UIActivate(SVUIA_ACTIVATE_FOCUS); - - /* - IShellView2* pShellView2; - - hr = _pShellView->QueryInterface(IID_IShellView2, (void**)&pShellView2); - - SV2CVW2_PARAMS params; - params.cbSize = sizeof(SV2CVW2_PARAMS); - params.psvPrev = _pShellView; - params.pfs = &fs; - params.psbOwner = this; - params.prcView = ▭ - params.pvid = params.pvid;//@@ - - hr = pShellView2->CreateViewWindow2(¶ms); - params.pvid; - */ - - /* - IFolderView* pFolderView; - - hr = _pShellView->QueryInterface(IID_IFolderView, (void**)&pFolderView); - - if (SUCCEEDED(hr)) { - hr = pFolderView->GetAutoArrange(); - hr = pFolderView->SetCurrentViewMode(FVM_DETAILS); - } - */ - - HWND hwndFolderView = ::GetNextWindow(hWndView, GW_CHILD); - - ShowWindow(hwndFolderView, SW_SHOW); + hr = pFolderView->GetAutoArrange(); + hr = pFolderView->SetCurrentViewMode(FVM_DETAILS); } + */ + + HWND hwndFolderView = ::GetNextWindow(hWndView, GW_CHILD); + + new BackgroundWindow(hwndFolderView); } - - if (hWndView && SetShellWindowEx) - SetShellWindowEx(_hwnd, hWndView); - else if (SetShellWindow) - SetShellWindow(_hwnd); - break;} + } - case WM_DESTROY: + if (hWndView && SetShellWindowEx) + SetShellWindowEx(_hwnd, hWndView); + else if (SetShellWindow) + SetShellWindow(_hwnd); + break;} - //TODO: use IShellBrowser::GetViewStateStream() and _pShellView->SaveViewState() to store view state - - if (SetShellWindow) - SetShellWindow(0); - break; + case WM_DESTROY: - case WM_CLOSE: - break; // Over-ride close. We need to close desktop some other way. + //TODO: use IShellBrowser::GetViewStateStream() and _pShellView->SaveViewState() to store view state + + if (SetShellWindow) + SetShellWindow(0); + break; - default: - return super::WndProc(nmsg, wparam, lparam); + case WM_CLOSE: + break; // Over-ride close. We need to close desktop some other way. + + default: + return super::WndProc(nmsg, wparam, lparam); } return 0; diff --git a/reactos/subsys/system/explorer/desktop/desktop.h b/reactos/subsys/system/explorer/desktop/desktop.h index bafb68e638d..baccb4cba91 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.h +++ b/reactos/subsys/system/explorer/desktop/desktop.h @@ -34,6 +34,17 @@ #include "../externals.h" +struct BackgroundWindow : public SubclassedWindow +{ + typedef SubclassedWindow super; + + BackgroundWindow(HWND hwnd) : super(hwnd) {} + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); +}; + + struct DesktopWindow : public Window, public IShellBrowserImpl { typedef Window super; @@ -65,7 +76,7 @@ struct DesktopWindow : public Window, public IShellBrowserImpl } protected: - LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); IShellView* _pShellView; }; diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index ce8e6e0b7ed..2c5e0bcd422 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -471,7 +471,7 @@ void FileChildWindow::scan_entry(Entry* entry, HWND hwnd) int FileChildWindow::Notify(int id, NMHDR* pnmh) { - return (pnmh->idFrom==IDW_HEADER_LEFT? _left: _right)->Notify(pnmh); + return (pnmh->idFrom==IDW_HEADER_LEFT? _left: _right)->Notify(id, pnmh); } @@ -480,22 +480,22 @@ BOOL CALLBACK ExecuteDialog::WndProg(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM static struct ExecuteDialog* dlg; switch(nmsg) { - case WM_INITDIALOG: - dlg = (struct ExecuteDialog*) lparam; - return 1; + case WM_INITDIALOG: + dlg = (struct ExecuteDialog*) lparam; + return 1; - case WM_COMMAND: { - int id = (int)wparam; + case WM_COMMAND: { + int id = (int)wparam; - if (id == IDOK) { - GetWindowText(GetDlgItem(hwnd, 201), dlg->cmd, MAX_PATH); - dlg->cmdshow = Button_GetState(GetDlgItem(hwnd,214))&BST_CHECKED? - SW_SHOWMINIMIZED: SW_SHOWNORMAL; - EndDialog(hwnd, id); - } else if (id == IDCANCEL) - EndDialog(hwnd, id); + if (id == IDOK) { + GetWindowText(GetDlgItem(hwnd, 201), dlg->cmd, MAX_PATH); + dlg->cmdshow = Button_GetState(GetDlgItem(hwnd,214))&BST_CHECKED? + SW_SHOWMINIMIZED: SW_SHOWNORMAL; + EndDialog(hwnd, id); + } else if (id == IDCANCEL) + EndDialog(hwnd, id); - return 1;} + return 1;} } return 0; diff --git a/reactos/subsys/system/explorer/shell/pane.cpp b/reactos/subsys/system/explorer/shell/pane.cpp index 95a722c86f8..9188360a092 100644 --- a/reactos/subsys/system/explorer/shell/pane.cpp +++ b/reactos/subsys/system/explorer/shell/pane.cpp @@ -110,9 +110,9 @@ static const int g_pos_align[] = { Pane::Pane(HWND hparent, int id, int id_header, Entry* root, bool treePane, int visible_cols) - : SubclassedWindow(CreateWindow(TEXT("ListBox"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL| - LBS_DISABLENOSCROLL|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED|LBS_NOTIFY, - 0, 0, 0, 0, hparent, (HMENU)id, g_Globals._hInstance, 0)), + : super(CreateWindow(TEXT("ListBox"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL| + LBS_DISABLENOSCROLL|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED|LBS_NOTIFY, + 0, 0, 0, 0, hparent, (HMENU)id, g_Globals._hInstance, 0)), _root(root), _treePane(treePane), _visible_cols(visible_cols) @@ -132,29 +132,29 @@ Pane::Pane(HWND hparent, int id, int id_header, Entry* root, bool treePane, int LRESULT Pane::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { switch(nmsg) { - case WM_HSCROLL: - set_header(); - break; + case WM_HSCROLL: + set_header(); + break; - case WM_SETFOCUS: { - FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), WM_GET_FILEWND_PTR, 0, 0); + case WM_SETFOCUS: { + FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), WM_GET_FILEWND_PTR, 0, 0); - child->set_focus_pane(this); - ListBox_SetSel(_hwnd, TRUE, 1); - /*TODO: check menu items */ - break;} + child->set_focus_pane(this); + ListBox_SetSel(_hwnd, TRUE, 1); + /*TODO: check menu items */ + break;} - case WM_KEYDOWN: { - FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), WM_GET_FILEWND_PTR, 0, 0); + case WM_KEYDOWN: { + FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), WM_GET_FILEWND_PTR, 0, 0); - if (wparam == VK_TAB) { - /*TODO: SetFocus(g_Globals.hdrivebar) */ - child->switch_focus_pane(); - } - break;} - } + if (wparam == VK_TAB) { + /*TODO: SetFocus(g_Globals.hdrivebar) */ + child->switch_focus_pane(); + } + break;} +} - return CallWindowProc(_orgWndProc, _hwnd, nmsg, wparam, lparam); + return super::WndProc(nmsg, wparam, lparam); } @@ -766,7 +766,7 @@ void Pane::calc_single_width(int col) } -LRESULT Pane::Notify(NMHDR* pnmh) +int Pane::Notify(int id, NMHDR* pnmh) { switch(pnmh->code) { case HDN_TRACK: @@ -832,6 +832,9 @@ LRESULT Pane::Notify(NMHDR* pnmh) Header_SetItem(_hwndHeader, phdn->iItem, &item); InvalidateRect(_hwnd, 0, TRUE); break;} + + default: + return super::Notify(id, pnmh); } return 0; diff --git a/reactos/subsys/system/explorer/shell/pane.h b/reactos/subsys/system/explorer/shell/pane.h index 8f842255c9d..37d71c87bd9 100644 --- a/reactos/subsys/system/explorer/shell/pane.h +++ b/reactos/subsys/system/explorer/shell/pane.h @@ -64,6 +64,8 @@ struct OutputWorker { struct Pane : public SubclassedWindow { + typedef SubclassedWindow super; + Pane(HWND hparent, int id, int id_header, Entry* rool, bool treePane, int visible_cols); #define COLUMNS 10 @@ -87,10 +89,10 @@ struct Pane : public SubclassedWindow void insert_entries(Entry* dir, int idx); BOOL command(UINT cmd); - LRESULT Notify(NMHDR* pnmh); + int Notify(int id, NMHDR* pnmh); protected: - LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); void calc_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str); void calc_tabbed_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str); diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 17ea3e4cca1..9677f15f225 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -391,15 +391,15 @@ void ShellBrowserChild::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv) LRESULT ShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { switch(nmsg) { - case WM_GETISHELLBROWSER: // for Registry Explorer Plugin - return (LRESULT)static_cast(this); + case WM_GETISHELLBROWSER: // for Registry Explorer Plugin + return (LRESULT)static_cast(this); - case WM_CREATE: - OnCreate((LPCREATESTRUCT)lparam); - goto def; + case WM_CREATE: + OnCreate((LPCREATESTRUCT)lparam); + goto def; - default: def: - return super::WndProc(nmsg, wparam, lparam); + default: def: + return super::WndProc(nmsg, wparam, lparam); } return 0; @@ -412,6 +412,7 @@ int ShellBrowserChild::Notify(int id, NMHDR* pnmh) case TVN_ITEMEXPANDING: OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break; case TVN_SELCHANGED: OnTreeItemSelected(id, (LPNMTREEVIEW)pnmh); break; case NM_RCLICK: OnTreeItemRClick(id, pnmh); break; + default: return super::Notify(id, pnmh); } return 0; diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index 0b2686c226e..6387f7e9c26 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -184,6 +184,11 @@ SubclassedWindow::SubclassedWindow(HWND hwnd) _orgWndProc = SubclassWindow(_hwnd, WindowWndProc); } +LRESULT SubclassedWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + return CallWindowProc(_orgWndProc, _hwnd, nmsg, wparam, lparam); +} + ChildWindow::ChildWindow(HWND hwnd) : Window(hwnd) diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 9ec6a1b78ab..16b7e664e31 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -67,7 +67,7 @@ protected: virtual LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); virtual int Command(int id, int code); - virtual int Notify(int id, NMHDR* pnmh); + virtual int Notify(int id, NMHDR* pnmh); static const void* s_new_info; //TODO: protect for multithreaded access @@ -85,6 +85,8 @@ struct SubclassedWindow : public Window protected: WNDPROC _orgWndProc; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); };