one-click activation of "Start" button Modified: trunk/reactos/subsys/system/explorer/taskbar/desktopbar.cpp Modified: trunk/reactos/subsys/system/explorer/taskbar/desktopbar.h _____
Modified: trunk/reactos/subsys/system/explorer/taskbar/desktopbar.cpp --- trunk/reactos/subsys/system/explorer/taskbar/desktopbar.cpp 2005-10-05 19:47:28 UTC (rev 18277) +++ trunk/reactos/subsys/system/explorer/taskbar/desktopbar.cpp 2005-10-05 19:48:29 UTC (rev 18278) @@ -99,8 +99,11 @@
_taskbar_pos = start_btn_width + 6;
- new PictureButton(Button(_hwnd, start_str, 1, 1, start_btn_width, REBARBAND_HEIGHT, IDC_START, WS_VISIBLE|WS_CHILD|BS_OWNERDRAW), - SmallIcon(IDI_STARTMENU)/*, GetStockBrush(WHITE_BRUSH)*/); + // create "Start" button + HWND hwndStart = Button(_hwnd, start_str, 1, 1, start_btn_width, REBARBAND_HEIGHT, IDC_START, WS_VISIBLE|WS_CHILD|BS_OWNERDRAW); + new StartButton(hwndStart); + // disable double clicks + SetClassLong(hwndStart, GCL_STYLE, GetClassLong(hwndStart, GCL_STYLE) & ~CS_DBLCLKS);
// create task bar _hwndTaskBar = TaskBar::Create(_hwnd); @@ -164,6 +167,71 @@ }
+StartButton::StartButton(HWND hwnd) + : PictureButton(hwnd, SmallIcon(IDI_STARTMENU), GetSysColorBrush(COLOR_BTNFACE)) +{ +} + +LRESULT StartButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + // one click activation: handle button-down message, don't wait for button-up + case WM_LBUTTONDOWN: + if (!Button_GetState(_hwnd)) { + Button_SetState(_hwnd, TRUE); + + SetCapture(_hwnd); + + SendMessage(GetParent(_hwnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(_hwnd),0), 0); + } + + Button_SetState(_hwnd, FALSE); + break; + + // re-target mouse move messages while moving the mouse cursor through the start menu + case WM_MOUSEMOVE: + if (GetCapture() == _hwnd) { + POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)}; + + ClientToScreen(_hwnd, &pt); + HWND hwnd = WindowFromPoint(pt); + + if (hwnd && hwnd!=_hwnd) { + ScreenToClient(hwnd, &pt); + SendMessage(hwnd, WM_MOUSEMOVE, 0, MAKELPARAM(pt.x, pt.y)); + } + } + break; + + case WM_LBUTTONUP: + if (GetCapture() == _hwnd) { + ReleaseCapture(); + + POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)}; + + ClientToScreen(_hwnd, &pt); + HWND hwnd = WindowFromPoint(pt); + + if (hwnd && hwnd!=_hwnd) { + ScreenToClient(hwnd, &pt); + PostMessage(hwnd, WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y)); + PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(pt.x, pt.y)); + } + } + break; + + case WM_CANCELMODE: + ReleaseCapture(); + break; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + + void DesktopBar::RegisterHotkeys() { // register hotkey WIN+E opening explorer @@ -323,7 +391,7 @@ int DesktopBar::Command(int id, int code) { switch(id) { - case IDC_START: ///@todo startmenu should popup for WM_LBUTTONDOWN, not for WM_COMMAND + case IDC_START: ShowStartMenu(); break;
_____
Modified: trunk/reactos/subsys/system/explorer/taskbar/desktopbar.h --- trunk/reactos/subsys/system/explorer/taskbar/desktopbar.h 2005-10-05 19:47:28 UTC (rev 18277) +++ trunk/reactos/subsys/system/explorer/taskbar/desktopbar.h 2005-10-05 19:48:29 UTC (rev 18278) @@ -117,3 +117,15 @@
const UINT WM_TASKBARCREATED; #endif }; + + + /// special "Start" button with one click activation +struct StartButton : public PictureButton +{ + typedef PictureButton super; + + StartButton(HWND hwnd); + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); +};