bool TUI_CustomControl::End (TShiftState _Shift){ switch(action){ case etaSelect: return SelectEnd(_Shift); case etaAdd: return AddEnd(_Shift); case etaMove: return MovingEnd(_Shift); case etaRotate: return RotateEnd(_Shift); case etaScale: return ScaleEnd(_Shift); } return false; }
LOCAL void ListBox_DoSpecialSelect(HWND hWindow, BOOL fDoubleClick, int x, int y, UINT keyFlags) /***********************************************************************/ { // get the listbox data pointer LPLISTBOXDATA lpData = ListBox_GetData(hWindow); if (!lpData) { FORWARD_WM_LBUTTONDOWN(hWindow, fDoubleClick, x, y, keyFlags, ListBox_CallWindowProc); return; } // give us focus on a mouse down SetFocus(hWindow); // initialize the dragging SelectBegin(hWindow, x, y); // start as if we had a mouse move Select_OnMouseMove(hWindow, x, y, keyFlags); // dragging loop while (lpData->fCapture) { MSG msg; // Look for mouse, keyboard, and timer messages. // keystroke messages are retrieved to avoid the message // queue from getting full while ( !PeekMessage(&msg, NULL, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) && !PeekMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) && !PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_REMOVE)) WaitMessage(); switch(msg.message) { case WM_MOUSEMOVE: HANDLE_WM_MOUSEMOVE(msg.hwnd, msg.wParam, msg.lParam, Select_OnMouseMove); break; case WM_TIMER: HANDLE_WM_TIMER(msg.hwnd, msg.wParam, msg.lParam, Select_OnTimer); break; case WM_LBUTTONUP: HANDLE_WM_LBUTTONUP(msg.hwnd, msg.wParam, msg.lParam, Select_OnLButtonUp); break; default: // Process messages we don't handle TranslateMessage(&msg); DispatchMessage(&msg); break; } } // process the drag and cleanup SelectEnd(hWindow); }