//-------------------------------------------------------------------- // Function: WaitDialogExProc // // Description: // // Input: hwnd - // uMsg - // wParam - // lParam - // // Modifies: // // Returns: // //-------------------------------------------------------------------- DLL_EXPORT(BOOL) APIENTRY WaitDialogExProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //---------------------------------------------------------------- // Display the hourglass //---------------------------------------------------------------- SetCursor(LoadCursor(NULL, IDC_WAIT)); switch (uMsg) { case WM_TIMER: HANDLE_WM_TIMER(hwnd, wParam, lParam, Cls_OnTimer); break; case WM_INITDIALOG: return (BOOL)HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, Cls_OnInitDialog); case WM_DESTROY: HANDLE_WM_DESTROY(hwnd, wParam, lParam, Cls_OnDestroy); break; default: return FALSE; } return TRUE; }
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); }
LOCAL void ListBox_DoDrag(HWND hWindow, BOOL fDoubleClick, int x, int y, UINT keyFlags) /***********************************************************************/ { // Let the listbox control handle the mouse down so a selection can happen FORWARD_WM_LBUTTONDOWN(hWindow, fDoubleClick, x, y, keyFlags, ListBox_CallWindowProc); // see if it's cool for us to try to drag LPLISTBOXDATA lpData = DragOK(hWindow); if (!lpData) return; // make the listbox think it got a mouse up so we can take over FORWARD_WM_LBUTTONUP(hWindow, x, y, keyFlags, ListBox_CallWindowProc); // initialize the dragging DragBegin(hWindow, x, y); // 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, Drag_OnMouseMove); break; case WM_TIMER: HANDLE_WM_TIMER(msg.hwnd, msg.wParam, msg.lParam, Drag_OnTimer); break; case WM_LBUTTONUP: HANDLE_WM_LBUTTONUP(msg.hwnd, msg.wParam, msg.lParam, Drag_OnLButtonUp); break; default: // Process messages we don't handle TranslateMessage(&msg); DispatchMessage(&msg); break; } } // process the drag and cleanup DragEnd(hWindow); }