LRESULT CALLBACK NcAreaWndSubclassProc( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam, _In_ UINT_PTR uIdSubclass, _In_ ULONG_PTR dwRefData ) { PEDIT_CONTEXT context; context = (PEDIT_CONTEXT)GetProp(hWnd, L"EditSubclassContext"); switch (uMsg) { case WM_NCDESTROY: { NcAreaFreeTheme(context); if (context->ImageList) ImageList_Destroy(context->ImageList); if (context->WindowFont) DeleteObject(context->WindowFont); RemoveWindowSubclass(hWnd, NcAreaWndSubclassProc, uIdSubclass); RemoveProp(hWnd, L"EditSubclassContext"); PhFree(context); } break; case WM_ERASEBKGND: return 1; case WM_NCCALCSIZE: { LPNCCALCSIZE_PARAMS ncCalcSize = (NCCALCSIZE_PARAMS*)lParam; // Let Windows handle the non-client defaults. DefSubclassProc(hWnd, uMsg, wParam, lParam); // Deflate the client area to accommodate the custom button. ncCalcSize->rgrc[0].right -= context->CXWidth; } return 0; case WM_NCPAINT: { RECT windowRect; // Let Windows handle the non-client defaults. DefSubclassProc(hWnd, uMsg, wParam, lParam); // Get the screen coordinates of the window. GetWindowRect(hWnd, &windowRect); // Adjust the coordinates (start from 0,0). OffsetRect(&windowRect, -windowRect.left, -windowRect.top); // Get the position of the inserted button. NcAreaGetButtonRect(context, &windowRect); // Draw the button. NcAreaDrawButton(context, windowRect); } return 0; case WM_NCHITTEST: { POINT windowPoint; RECT windowRect; // Get the screen coordinates of the mouse. windowPoint.x = GET_X_LPARAM(lParam); windowPoint.y = GET_Y_LPARAM(lParam); // Get the position of the inserted button. GetWindowRect(hWnd, &windowRect); NcAreaGetButtonRect(context, &windowRect); // Check that the mouse is within the inserted button. if (PtInRect(&windowRect, windowPoint)) { return HTBORDER; } } break; case WM_NCLBUTTONDOWN: { POINT windowPoint; RECT windowRect; // Get the screen coordinates of the mouse. windowPoint.x = GET_X_LPARAM(lParam); windowPoint.y = GET_Y_LPARAM(lParam); // Get the position of the inserted button. GetWindowRect(hWnd, &windowRect); NcAreaGetButtonRect(context, &windowRect); // Check that the mouse is within the inserted button. if (PtInRect(&windowRect, windowPoint)) { context->Pushed = TRUE; SetCapture(hWnd); RedrawWindow(hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); } } break; case WM_LBUTTONUP: { POINT windowPoint; RECT windowRect; // Get the screen coordinates of the mouse. windowPoint.x = GET_X_LPARAM(lParam); windowPoint.y = GET_Y_LPARAM(lParam); // Get the screen coordinates of the window. GetWindowRect(hWnd, &windowRect); // Adjust the coordinates (start from 0,0). OffsetRect(&windowRect, -windowRect.left, -windowRect.top); // Get the position of the inserted button. NcAreaGetButtonRect(context, &windowRect); // Check that the mouse is within the inserted button. if (PtInRect(&windowRect, windowPoint)) { // Forward click notification. SendMessage(PhMainWndHandle, WM_COMMAND, MAKEWPARAM(context->CommandID, BN_CLICKED), 0); } if (GetCapture() == hWnd) { context->Pushed = FALSE; ReleaseCapture(); } RedrawWindow(hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); } break; case WM_KEYDOWN: { if (wParam == '\t' || wParam == '\r') { HWND tnHandle; tnHandle = GetCurrentTreeNewHandle(); if (tnHandle) { SetFocus(tnHandle); if (wParam == '\r') { if (TreeNew_GetFlatNodeCount(tnHandle) > 0) { TreeNew_DeselectRange(tnHandle, 0, -1); TreeNew_SelectRange(tnHandle, 0, 0); TreeNew_SetFocusNode(tnHandle, TreeNew_GetFlatNode(tnHandle, 0)); TreeNew_SetMarkNode(tnHandle, TreeNew_GetFlatNode(tnHandle, 0)); } } } else { PTOOLSTATUS_TAB_INFO tabInfo; if ((tabInfo = FindTabInfo(SelectedTabIndex)) && tabInfo->ActivateContent) tabInfo->ActivateContent(wParam == '\r'); } return FALSE; } // Handle CTRL+A below Vista. if (WindowsVersion < WINDOWS_VISTA && (GetKeyState(VK_CONTROL) & VK_LCONTROL) && wParam == 'A') { Edit_SetSel(hWnd, 0, -1); return FALSE; } } break; case WM_CHAR: if (wParam == '\t' || wParam == '\r') return FALSE; break; case WM_CUT: case WM_CLEAR: case WM_PASTE: case WM_UNDO: case WM_KEYUP: case WM_SETTEXT: case WM_KILLFOCUS: RedrawWindow(hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); break; case WM_SETTINGCHANGE: case WM_SYSCOLORCHANGE: case WM_THEMECHANGED: { NcAreaFreeTheme(context); NcAreaInitializeTheme(context); NcAreaInitializeFont(context); // Reset the client area margins. SendMessage(hWnd, EM_SETMARGINS, EC_LEFTMARGIN, MAKELPARAM(0, 0)); // Force the edit control to update its non-client area. RedrawWindow(hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); //SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); } break; case WM_SETFOCUS: { if (SearchBoxDisplayMode != SEARCHBOX_DISPLAY_MODE_HIDEINACTIVE) break; if (!RebarBandExists(REBAR_BAND_ID_SEARCHBOX)) { UINT height = (UINT)SendMessage(RebarHandle, RB_GETROWHEIGHT, 0, 0); RebarBandInsert(REBAR_BAND_ID_SEARCHBOX, SearchboxHandle, PhMultiplyDivide(180, PhGlobalDpi, 96), height - 2); } } break; case WM_NCMOUSEMOVE: { POINT windowPoint; RECT windowRect; // Get the screen coordinates of the mouse. windowPoint.x = GET_X_LPARAM(lParam); windowPoint.y = GET_Y_LPARAM(lParam); // Get the screen coordinates of the window. GetWindowRect(hWnd, &windowRect); // Get the position of the inserted button. NcAreaGetButtonRect(context, &windowRect); // Check that the mouse is within the inserted button. if (PtInRect(&windowRect, windowPoint)) { if (!context->Hot) { TRACKMOUSEEVENT trackMouseEvent = { sizeof(TRACKMOUSEEVENT) }; trackMouseEvent.dwFlags = TME_LEAVE | TME_NONCLIENT; trackMouseEvent.hwndTrack = hWnd; context->Hot = TRUE; RedrawWindow(hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); TrackMouseEvent(&trackMouseEvent); } } } break; case WM_NCMOUSELEAVE: { if (context->Hot) { context->Hot = FALSE; RedrawWindow(hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); } } break; case WM_MOUSEMOVE: { if ((wParam & MK_LBUTTON) && GetCapture() == hWnd) { POINT windowPoint; RECT windowRect; // Get the screen coordinates of the mouse. windowPoint.x = GET_X_LPARAM(lParam); windowPoint.y = GET_Y_LPARAM(lParam); // Get the screen coordinates of the window. GetWindowRect(hWnd, &windowRect); // Adjust the coordinates (start from 0,0). OffsetRect(&windowRect, -windowRect.left, -windowRect.top); // Get the position of the inserted button. NcAreaGetButtonRect(context, &windowRect); // Check that the mouse is within the inserted button. context->Pushed = PtInRect(&windowRect, windowPoint); RedrawWindow(hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); } } break; } return DefSubclassProc(hWnd, uMsg, wParam, lParam); }
// Window procedure override. LRESULT ClsSplitter::WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch ( uMsg ) { case WM_ERASEBKGND: { // Fill the entire client rectangle // with the same color as the button // background. ClsBrush b( ::GetSysColor( COLOR_BTNFACE )); ::FillRect(( HDC )wParam, GetClientRect(), b ); return 0; } case WM_LBUTTONDOWN: { // Obtain a device context and attach it. if ( m_pDC.Attach( ::GetDC( *GetParent()))) { // Snapshot the device context. m_nSaveDC = m_pDC.SaveDC(); // OK? if ( m_nSaveDC ) { // Mark the current position. m_nStartPosition = m_nPosition; // Setup DC. m_pDC.SetROP2( R2_NOTXORPEN ); m_pDC.SelectObject( m_HatchBrush ); m_pDC.SelectObject( ::GetStockObject( NULL_PEN )); m_pDC.SetTextColor( RGB( 0, 0, 0 )); // Capture the mouse. SetCapture(); // We are moving the splitter. m_bIsMoving = TRUE; // We want the keyboard focus. m_hFocus = ::SetFocus( *this ); // Show the track bar. DrawSplitterBar(); return 0; } // Failure... ::ReleaseDC( *GetParent(), m_pDC.Detach()); } return 0; } case WM_MOUSEMOVE: // Are we moving the splitter? if ( m_bIsMoving ) { // Get the current mouse position. ClsPoint p; GetCursorPos( p ); // Map the position to our parent. GetParent()->ScreenToClient(p); // Get position (Horizontal or vertical). int nPos = m_bIsHorizontal ? p.X() : p.Y(); // Set splitter position. SetSplitterPosition( nPos ); return 0; } break; case WM_GETDLGCODE: // We want them all. return DLGC_WANTALLKEYS; case WM_KEYDOWN: // Are we moving the splitter or was a key // pressed other than escape? if ( ! m_bIsMoving || wParam != VK_ESCAPE ) // Pass the message to the base class. break; // Erase the splitter if necessary. if ( m_bIsVisible ) DrawSplitterBar(); // Restore the old position. m_nPosition = m_nStartPosition; // Fall through which will stop the // mouse tracking etc. case WM_LBUTTONUP: // Are we moving? if ( m_bIsMoving ) { // Make sure we are invisible. if ( m_bIsVisible ) DrawSplitterBar(); // Restore DC snapshot. m_pDC.RestoreDC( m_nSaveDC ); // Release it and detach it from the object. ::ReleaseDC( *GetParent(), m_pDC.Detach()); // Release the mouse. ReleaseCapture(); // No longer moving. m_bIsMoving = FALSE; // Move the panes. MoveSplitter(); // Restore the focus. ::SetFocus( m_hFocus ); } return 0; case WM_SETCURSOR: // Setup the correct cursor. if ( m_bIsHorizontal ) SetCursor( m_hVert ); else SetCursor( m_hHorz ); return 0; } // Call the base class. return ClsWindow::WindowProc( uMsg, wParam, lParam ); }
LRESULT CALLBACK clViewport::MainWndProc( HWND Window, UINT Msg, WPARAM wParam, LPARAM lParam ) { // NOTE: check for this in WinUser.h #undef WM_MOUSEWHEEL #undef WM_XBUTTONDOWN #undef WM_XBUTTONUP const UINT WM_MOUSEWHEEL = 522; // WM_MOUSELAST+1; const UINT WM_XBUTTONDOWN = 523; // WM_MOUSELAST+2; const UINT WM_XBUTTONUP = 524; // WM_MOUSELAST+3; #ifndef XBUTTON1 const UINT XBUTTON1 = 1; #endif #ifndef XBUTTON2 const UINT XBUTTON2 = 2; #endif sEnvironment* Env = reinterpret_cast<sEnvironment*>( ( LONG_PTR )GetWindowLongPtr( Window, GWLP_USERDATA ) ); if ( Env ) { switch ( Msg ) { case WM_ACTIVATE: { bool Deactivated = wParam == WA_INACTIVE; if ( Deactivated ) { Env->SendSync( L_EVENT_ACTIVATE, LEventArgs( false ), false ); // this will switch all CVars binded to keys into false for ( int Key = 0; Key != 255; ++Key ) { Env->SendSync( L_EVENT_KEY, LEventArgs( Key, false ), false ); } } else { Env->SendSync( L_EVENT_ACTIVATE, LEventArgs( true ), false ); SetForegroundWindow( Window ); } // is a fullscreen window ? if ( !( GetWindowLong( Window, GWL_STYLE ) & WS_CAPTION ) ) { int Active = LOWORD( wParam ); if ( Active != WA_INACTIVE ) { // firts, restore fullscreen mode native to this window Env->Screen->RestoreDisplayMode(); // restore the window itself ShowWindow( Window, SW_RESTORE ); SetForegroundWindow( Window ); } if ( Active == WA_INACTIVE ) { // first, iconify the window ShowWindow( Window, SW_MINIMIZE ); // only after that reset display mode Env->Screen->ResetDisplayMode(); } } break; } case WM_HOTKEY: { return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_MOUSEWHEEL: { if ( static_cast<int>( wParam ) > 0 ) { Env->SendSync( L_EVENT_KEY, LEventArgs( LK_WHEELUP, true ), false ); } else { Env->SendSync( L_EVENT_KEY, LEventArgs( LK_WHEELDOWN, true ), false ); } break; } case WM_SYSCOMMAND: { if ( wParam == SC_SCREENSAVE ) { return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } break; } case WM_SIZE: { clViewport* Viewport = Env->Viewport; dynamic_cast<clViewport*>( Viewport )->ResizeViewport( 0, 0 ); Env->Renderer->RestoreViewport(); Env->SendSync( L_EVENT_VIEWPORTRESIZED, LEventArgs(), false ); break; } case WM_CLOSE: { PostQuitMessage( 0 ); break; } case WM_DEVICECHANGE: { break; } case WM_MOUSEMOVE: { int X = GET_X_LPARAM( lParam ); int Y = GET_Y_LPARAM( lParam ); Env->Viewport->MoveMouse( X, Y ); /* Env->SendSync( L_EVENT_MOTION, LEventArgs( -1, 0, 0, false ), false ); Env->SendSync( L_EVENT_MOTION, LEventArgs( 0, Pos.x, Pos.y, Env->Console->IsKeyPressed( LK_LBUTTON ) ), false ); Env->SendSync( L_EVENT_MOTION, LEventArgs( -2, 0, 0, false ), false ); */ LVector2 Pos = Env->Viewport->GetMousePosition(); LEventArgs Args( 0, Pos.x, Pos.y, false ); Args.FObjArg = (iObject*)L_MOTION_MOVE; Args.FBoolArg = Env->Console->IsKeyPressed( LK_LBUTTON ); // make the gestures' handlers happy Env->SendSync( L_EVENT_MOTION, LEventArgs( -1, 0, 0, false ), false ); Env->SendSync( L_EVENT_MOTION, Args, false ); Env->SendSync( L_EVENT_MOTION, LEventArgs( -2, 0, 0, false ), false ); break; } case WM_XBUTTONDOWN: { SetCapture( Window ); int Key = LK_XBUTTON1; switch HIWORD( wParam ) { case XBUTTON1: Key = LK_XBUTTON1; break; case XBUTTON2: Key = LK_XBUTTON2; break; default: Env->Logger->Log( L_WARNING, "Unknown wParam in WM_XBUTTONDOWN: " + LStr::ToStr( LOWORD( wParam ) ) ); } Env->SendSync( L_EVENT_KEY, LEventArgs( Key, true ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 1; } case WM_XBUTTONUP: { ReleaseCapture(); int Key = LK_XBUTTON1; switch HIWORD( wParam ) { case XBUTTON1: Key = LK_XBUTTON1; break; case XBUTTON2: Key = LK_XBUTTON2; break; default: Env->Logger->Log( L_WARNING, "Unknown wParam in WM_XBUTTONUP: " + LStr::ToStr( LOWORD( wParam ) ) ); } Env->SendSync( L_EVENT_KEY, LEventArgs( Key, false ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 1; } case WM_LBUTTONDOWN: { SetForegroundWindow( Window ); SetFocus( Window ); SetCapture( Window ); Env->SendSync( L_EVENT_KEY, LEventArgs( LK_LBUTTON, true ), false ); LVector2 Pos = Env->Viewport->GetMousePosition(); LEventArgs Args( 0, Pos.x, Pos.y, false ); Args.FObjArg = (iObject*)L_MOTION_DOWN; Args.FBoolArg = true; // make the gestures' handlers happy Env->SendSync( L_EVENT_MOTION, LEventArgs( -1, 0, 0, false ), false ); Env->SendSync( L_EVENT_MOTION, Args, false ); Env->SendSync( L_EVENT_MOTION, LEventArgs( -2, 0, 0, false ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_LBUTTONUP: { ReleaseCapture(); Env->SendSync( L_EVENT_KEY, LEventArgs( LK_LBUTTON, false ), false ); LVector2 Pos = Env->Viewport->GetMousePosition(); LEventArgs Args( 0, Pos.x, Pos.y, false ); Args.FObjArg = (iObject*)L_MOTION_UP; Args.FBoolArg = false; // make the gestures' handlers happy Env->SendSync( L_EVENT_MOTION, LEventArgs( -1, 0, 0, false ), false ); Env->SendSync( L_EVENT_MOTION, Args, false ); Env->SendSync( L_EVENT_MOTION, LEventArgs( -2, 0, 0, false ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_RBUTTONDOWN: { SetCapture( Window ); Env->SendSync( L_EVENT_KEY, LEventArgs( LK_RBUTTON, true ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_RBUTTONUP: { ReleaseCapture(); Env->SendSync( L_EVENT_KEY, LEventArgs( LK_RBUTTON, false ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_MBUTTONDOWN: { SetCapture( Window ); Env->SendSync( L_EVENT_KEY, LEventArgs( LK_MBUTTON, true ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_MBUTTONUP: { ReleaseCapture(); Env->SendSync( L_EVENT_KEY, LEventArgs( LK_MBUTTON, false ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_LBUTTONDBLCLK: { Env->SendSync( L_EVENT_KEY, LEventArgs( LK_LBUTTONDB, true ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_RBUTTONDBLCLK: { Env->SendSync( L_EVENT_KEY, LEventArgs( LK_RBUTTONDB, true ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_SYSKEYUP: case WM_KEYUP: { Env->SendSync( L_EVENT_KEY, LEventArgs( static_cast<int>( wParam ), false ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } case WM_SYSKEYDOWN: { if ( wParam == 13 ) { TODO( "toggle fullscreen here" ) } } case WM_KEYDOWN: { Env->SendSync( L_EVENT_KEY, LEventArgs( static_cast<int>( wParam ), true ), false ); return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : 0; } } } return FOriginalWndProc ? CallWindowProc( FOriginalWndProc, Window, Msg, wParam, lParam ) : DefWindowProc( Window, Msg, wParam, lParam ); }
/* ============ CameraWndProc ============ */ LONG WINAPI WCam_WndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { int fwKeys, xPos, yPos; RECT rect; GetClientRect(hWnd, &rect); switch (uMsg) { case WM_CREATE: { HFONT hfont; g_qeglobals.d_hdcBase = GetDC(hWnd); QEW_SetupPixelFormat(g_qeglobals.d_hdcBase, true); if ( ( g_qeglobals.d_hglrcBase = wglCreateContext( g_qeglobals.d_hdcBase ) ) == 0 ) Error ("wglCreateContext failed"); if (!wglMakeCurrent( g_qeglobals.d_hdcBase, g_qeglobals.d_hglrcBase )) Error ("wglMakeCurrent failed"); Texture_SetMode(g_qeglobals.d_savedinfo.iTexMenu); // // create GL font // hfont = CreateFont( 10, // logical height of font 7, // logical average character width 0, // angle of escapement 0, // base-line orientation angle 0, // font weight 0, // italic attribute flag 0, // underline attribute flag 0, // strikeout attribute flag 0, // character set identifier 0, // output precision 0, // clipping precision 0, // output quality 0, // pitch and family 0 // pointer to typeface name string ); if ( !hfont ) Error( "couldn't create font" ); SelectObject (g_qeglobals.d_hdcBase, hfont); if ( ( g_qeglobals.d_font_list = glGenLists (256) ) == 0 ) Error( "couldn't create font dlists" ); // create the bitmap display lists // we're making images of glyphs 0 thru 255 if ( !wglUseFontBitmaps (g_qeglobals.d_hdcBase, 1, 255, g_qeglobals.d_font_list) ) Error( "wglUseFontBitmaps faileD" ); // indicate start of glyph display lists glListBase (g_qeglobals.d_font_list); // report OpenGL information Sys_Printf ("GL_VENDOR: %s\n", glGetString (GL_VENDOR)); Sys_Printf ("GL_RENDERER: %s\n", glGetString (GL_RENDERER)); Sys_Printf ("GL_VERSION: %s\n", glGetString (GL_VERSION)); Sys_Printf ("GL_EXTENSIONS: %s\n", glGetString (GL_EXTENSIONS)); } return 0; case WM_PAINT: { PAINTSTRUCT ps; if (!wglMakeCurrent( g_qeglobals.d_hdcBase, g_qeglobals.d_hglrcBase )) Error ("wglMakeCurrent failed"); if ( BeginPaint(hWnd, &ps) ) { QE_CheckOpenGLForErrors(); Cam_Draw (); QE_CheckOpenGLForErrors(); EndPaint(hWnd, &ps); SwapBuffers(g_qeglobals.d_hdcBase); } } return 0; case WM_USER+267: // benchmark { PAINTSTRUCT ps; WINDOWPLACEMENT wp; double start, end; int i; memset( &wp, 0, sizeof( wp ) ); wp.length = sizeof( wp ); GetWindowPlacement( g_qeglobals.d_hwndCamera, &wp ); MoveWindow( g_qeglobals.d_hwndCamera, 30, 30, 400, 400, TRUE ); BeginPaint(hWnd, &ps); if (!wglMakeCurrent( g_qeglobals.d_hdcBase, g_qeglobals.d_hglrcBase)) Error ("wglMakeCurrent failed"); glDrawBuffer (GL_FRONT); start = Sys_DoubleTime (); for (i=0 ; i<100 ; i++) { camera.angles[YAW] = i*4; Cam_Draw (); } wglSwapBuffers(g_qeglobals.d_hdcBase); glDrawBuffer (GL_BACK); end = Sys_DoubleTime (); EndPaint(hWnd, &ps); Sys_Printf ("%5.2f seconds\n", end-start); SetWindowPlacement( g_qeglobals.d_hwndCamera, &wp ); } break; case WM_KEYDOWN: if ( QE_KeyDown (wParam) ) return 0; else return DefWindowProc( hWnd, uMsg, wParam, lParam ); case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: if (GetTopWindow(g_qeglobals.d_hwndMain) != hWnd) BringWindowToTop(hWnd); SetFocus (g_qeglobals.d_hwndCamera); SetCapture (g_qeglobals.d_hwndCamera); fwKeys = wParam; // key flags xPos = (short)LOWORD(lParam); // horizontal position of cursor yPos = (short)HIWORD(lParam); // vertical position of cursor yPos = (int)rect.bottom - 1 - yPos; Cam_MouseDown (xPos, yPos, fwKeys); return 0; case WM_MBUTTONUP: case WM_RBUTTONUP: case WM_LBUTTONUP: fwKeys = wParam; // key flags xPos = (short)LOWORD(lParam); // horizontal position of cursor yPos = (short)HIWORD(lParam); // vertical position of cursor yPos = (int)rect.bottom - 1 - yPos; Cam_MouseUp (xPos, yPos, fwKeys); if (! (fwKeys & (MK_LBUTTON|MK_RBUTTON|MK_MBUTTON))) ReleaseCapture (); return 0; case WM_MOUSEMOVE: fwKeys = wParam; // key flags xPos = (short)LOWORD(lParam); // horizontal position of cursor yPos = (short)HIWORD(lParam); // vertical position of cursor yPos = (int)rect.bottom - 1 - yPos; Cam_MouseMoved (xPos, yPos, fwKeys); return 0; case WM_SIZE: camera.width = rect.right; camera.height = rect.bottom; InvalidateRect(g_qeglobals.d_hwndCamera, NULL, false); return 0; case WM_KILLFOCUS: case WM_SETFOCUS: SendMessage( hWnd, WM_NCACTIVATE, uMsg == WM_SETFOCUS, 0 ); return 0; case WM_NCCALCSIZE:// don't let windows copy pixels DefWindowProc (hWnd, uMsg, wParam, lParam); return WVR_REDRAW; case WM_CLOSE: DestroyWindow (hWnd); return 0; case WM_DESTROY: QEW_StopGL( hWnd, g_qeglobals.d_hglrcBase, g_qeglobals.d_hdcBase ); return 0; } return DefWindowProc( hWnd, uMsg, wParam, lParam ); }
BOOL CCCFrontEnd::OnInitDialog() { CDialog::OnInitDialog(); CString s; // // Default to no display of cancelled records // m_bDisplayCancelled = FALSE; // // Make all future memory pointers NULL // pCCFESORT = NULL; CCFE.pCCREFER = NULL; // // Set up the pointers to the controls // pButtonNEW = (CButton *)GetDlgItem(CCFE_NEW); pButtonEXISTING = (CButton *)GetDlgItem(CCFE_EXISTING); pListCtrlLIST = (CListCtrl *)GetDlgItem(CCFE_LIST); pButtonTHISISA = (CButton *)GetDlgItem(CCFE_THISISA); pWndDATETIME = GetDlgItem(CCFE_DATETIME); pWndRECEIVEDBY = GetDlgItem(CCFE_RECEIVEDBY); pButtonCOMPLAINT = (CButton *)GetDlgItem(CCFE_COMPLAINT); pButtonCOMMENDATION = (CButton *)GetDlgItem(CCFE_COMMENDATION); pButtonSERVICEREQUEST = (CButton *)GetDlgItem(CCFE_SERVICEREQUEST); pButtonMISCELLANEOUS = (CButton *)GetDlgItem(CCFE_MISCELLANEOUS); pStaticJUMPTO_TEXT = (CStatic *)GetDlgItem(CCFE_JUMPTO_TEXT); pEditJUMPTO = (CEdit *)GetDlgItem(CCFE_JUMPTO); pButtonDISPLAYCANCELLED = (CButton *)GetDlgItem(CCFE_DISPLAYCANCELLED); pButtonREOPEN = (CButton *)GetDlgItem(IDREOPEN); DWORD dwExStyles = pListCtrlLIST->GetExtendedStyle(); pListCtrlLIST->SetExtendedStyle(dwExStyles | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); // // Set up the characters that the "referenceNumber" is prefixed by // // Complaint, Commendation, or Service Request // strncpy(cPrefix, "CMSL", 4); // // Get the current date and time and put it on the group box // CTime time = CTime::GetCurrentTime(); CString strTime = time.Format(_T("%A, %B %d, %Y at %I:%M:%S%p")); // // Set up the timer to update the date/time // pWndDATETIME->SetWindowText(strTime); pWndDATETIME->SetTimer(0x1000, 1000, TimerProc); // // Display the user name // pWndRECEIVEDBY->SetWindowText(userName); // // Set up the list control // LVCOLUMN LVC; LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; LVC.fmt = LVCFMT_LEFT; LVC.cx = 100; LVC.pszText = "Number"; pListCtrlLIST->InsertColumn(0, &LVC); LVC.cx = 100; LVC.pszText = "Status"; pListCtrlLIST->InsertColumn(1, &LVC); LVC.cx = 300; LVC.pszText = "Name"; pListCtrlLIST->InsertColumn(2, &LVC); bSortForward[0] = TRUE; bSortForward[1] = TRUE; bSortForward[2] = TRUE; PopulateListCtrl(); // // Disable the list control for now // pListCtrlLIST->EnableWindow(FALSE); pStaticJUMPTO_TEXT->EnableWindow(FALSE); pEditJUMPTO->EnableWindow(FALSE); pButtonNEW->SetCheck(TRUE); pButtonCOMPLAINT->SetCheck(TRUE); pButtonCOMPLAINT->SetFocus(); // // Set up the referral structure // int nI; CCFE.numReferrals = m_numReferrals; if(m_numReferrals == 0) { CCFE.pCCREFER = NULL; } else { CCFE.pCCREFER = (CCREFERDef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CCREFERDef) * m_numReferrals); if(CCFE.pCCREFER == NULL) { AllocationError(__FILE__, __LINE__, FALSE); } else { for(nI = 0; nI < m_numReferrals; nI++) { strcpy(CCFE.pCCREFER[nI].szName, m_Referrals[nI].szName); strcpy(CCFE.pCCREFER[nI].szDepartment, m_Referrals[nI].szDepartment); strcpy(CCFE.pCCREFER[nI].szEmailAddress, m_Referrals[nI].szEmailAddress); CCFE.pCCREFER[nI].flags = 0; } } } ReleaseCapture(); return FALSE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
void CXTPTabManager::TrackClick(HWND hWnd, CPoint pt, CXTPTabManagerItem* pItem) { if (GetPaintManager()->m_bHotTracking) m_pHighlighted = pItem; m_pPressed = pItem; BOOL bHighlighted = TRUE; Reposition(); BOOL bAccept = FALSE; ::SetCapture(hWnd); while (::GetCapture() == hWnd) { MSG msg; VERIFY(::GetMessage(&msg, NULL, 0, 0)); if (::GetCapture() != hWnd) { DispatchMessage (&msg); break; } switch (msg.message) { case WM_MOUSEMOVE: { pt = CPoint((short signed)LOWORD(msg.lParam), (short signed)HIWORD(msg.lParam)); bHighlighted = pItem->GetRect().PtInRect(pt); if (GetPaintManager()->m_bHotTracking) { CXTPTabManagerItem* pHighlighted = bHighlighted ? pItem : NULL; if (pHighlighted != m_pHighlighted) { m_pHighlighted = pHighlighted; RedrawControl(pItem->GetRect(), TRUE); } } } break; case WM_KEYDOWN: if (msg.wParam != VK_ESCAPE) break; case WM_CANCELMODE: case WM_RBUTTONDOWN: goto ExitLoop; case WM_LBUTTONUP: bAccept = TRUE; goto ExitLoop; default: DispatchMessage (&msg); break; } } ExitLoop: ReleaseCapture(); m_pPressed = FALSE; PerformMouseMove(hWnd, pt); RedrawControl(NULL, FALSE); if (bAccept && bHighlighted) { OnItemClick(pItem); } }
void CXTPTabManagerNavigateButton::PerformClick(HWND hWnd, CPoint pt) { if ((::GetCapture() != NULL) || !m_bEnabled) return; ::SetCapture(hWnd); BOOL bClick = FALSE; DWORD dwStart = GetTickCount(); for (;;) { if (m_bEnabled && GetTickCount() - dwStart > 20) { dwStart = GetTickCount(); OnExecute(TRUE); } BOOL bPressed = m_rcButton.PtInRect(pt); if (bPressed != m_bPressed) { m_bPressed = bPressed; m_pManager->RedrawControl(m_rcButton, TRUE); } MSG msg; if (!::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE)) continue; VERIFY(::GetMessage(&msg, NULL, 0, 0)); if (::GetCapture() != hWnd) { DispatchMessage (&msg); goto ExitLoop; } switch (msg.message) { case WM_MOUSEMOVE: pt = CPoint((short signed)LOWORD(msg.lParam), (short signed)HIWORD(msg.lParam)); break; case WM_LBUTTONUP: bClick = m_bPressed; goto ExitLoop; case WM_KEYDOWN: if (msg.wParam != VK_ESCAPE) break; case WM_CANCELMODE: case WM_RBUTTONDOWN: goto ExitLoop; default: DispatchMessage (&msg); break; } } ExitLoop: ReleaseCapture(); m_bPressed = FALSE; m_pManager->PerformMouseMove(hWnd, pt); m_pManager->RedrawControl(NULL, FALSE); if (bClick) { OnExecute(FALSE); } }
// This seems pure front end LRESULT CALLBACK EngineOutputProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { static SnapData sd; switch (message) { case WM_INITDIALOG: if( engineOutputDialog == NULL ) { engineOutputDialog = hDlg; Translate(hDlg, DLG_EngineOutput); RestoreWindowPlacement( hDlg, &wpEngineOutput ); /* Restore window placement */ ResizeWindowControls( windowMode ); SendDlgItemMessage( hDlg, IDC_EngineMemo1, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS ); SendDlgItemMessage( hDlg, IDC_EngineMemo2, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS ); /* Set font */ SendDlgItemMessage( engineOutputDialog, IDC_EngineMemo1, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0 )); SendDlgItemMessage( engineOutputDialog, IDC_EngineMemo2, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0 )); SetEngineState( 0, STATE_IDLE, "" ); SetEngineState( 1, STATE_IDLE, "" ); } return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: break; } break; case WM_MOUSEMOVE: MovePV(LOWORD(lParam) - boardRect.left, HIWORD(lParam) - boardRect.top, boardRect.bottom - boardRect.top); break; case WM_RBUTTONUP: ReleaseCapture(); SendMessage( outputField[currentPV][nMemo], EM_SETSEL, 0, 0 ); highTextStart[currentPV] = highTextEnd[currentPV] = 0; UnLoadPV(); break; case WM_NOTIFY: if( wParam == IDC_EngineMemo1 || wParam == IDC_EngineMemo2 ) { MSGFILTER * lpMF = (MSGFILTER *) lParam; if( lpMF->msg == WM_RBUTTONDOWN && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 ) { currentPV = (wParam == IDC_EngineMemo2); GetMemoLine(hDlg, LOWORD(lpMF->lParam), HIWORD(lpMF->lParam)); } } break; case WM_GETMINMAXINFO: { MINMAXINFO * mmi = (MINMAXINFO *) lParam; mmi->ptMinTrackSize.x = 100; mmi->ptMinTrackSize.y = 160; } break; case WM_CLOSE: EngineOutputPopDown(); break; case WM_SIZE: ResizeWindowControls( windowMode ); break; case WM_ENTERSIZEMOVE: return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); case WM_SIZING: return OnSizing( &sd, hDlg, wParam, lParam ); case WM_MOVING: return OnMoving( &sd, hDlg, wParam, lParam ); case WM_EXITSIZEMOVE: return OnExitSizeMove( &sd, hDlg, wParam, lParam ); } return FALSE; }
LRESULT CCEGLView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; switch (message) { case WM_LBUTTONDOWN: if (m_pDelegate && m_pTouch && MK_LBUTTON == wParam) { POINT pt = {(short)LOWORD(lParam), (short)HIWORD(lParam)}; if (PtInRect(&m_rcViewPort, pt)) { m_bCaptured = true; SetCapture(m_hWnd); m_pTouch->SetTouchInfo(0, (float)(pt.x - m_rcViewPort.left) / m_fScreenScaleFactor, (float)(pt.y - m_rcViewPort.top) / m_fScreenScaleFactor); m_pSet->addObject(m_pTouch); m_pDelegate->touchesBegan(m_pSet, NULL); } } break; case WM_MOUSEMOVE: if (MK_LBUTTON == wParam && m_bCaptured) { m_pTouch->SetTouchInfo(0, (float)((short)LOWORD(lParam)- m_rcViewPort.left) / m_fScreenScaleFactor, (float)((short)HIWORD(lParam) - m_rcViewPort.top) / m_fScreenScaleFactor); m_pDelegate->touchesMoved(m_pSet, NULL); } break; case WM_LBUTTONUP: if (m_bCaptured) { m_pTouch->SetTouchInfo(0, (float)((short)LOWORD(lParam)- m_rcViewPort.left) / m_fScreenScaleFactor, (float)((short)HIWORD(lParam) - m_rcViewPort.top) / m_fScreenScaleFactor); m_pDelegate->touchesEnded(m_pSet, NULL); m_pSet->removeObject(m_pTouch); ReleaseCapture(); m_bCaptured = false; } break; case WM_SIZE: switch (wParam) { case SIZE_RESTORED: CCApplication::sharedApplication().applicationWillEnterForeground(); break; case SIZE_MINIMIZED: CCApplication::sharedApplication().applicationDidEnterBackground(); break; } break; case WM_KEYDOWN: if (wParam == VK_F1 || wParam == VK_F2) { if (GetKeyState(VK_LSHIFT) < 0 || GetKeyState(VK_RSHIFT) < 0 || GetKeyState(VK_SHIFT) < 0) CCKeypadDispatcher::sharedDispatcher()->dispatchKeypadMSG(wParam == VK_F1 ? kTypeBackClicked : kTypeMenuClicked); } if ( m_lpfnAccelerometerKeyHook!=NULL ) { (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam ); } break; case WM_KEYUP: if ( m_lpfnAccelerometerKeyHook!=NULL ) { (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam ); } break; case WM_CHAR: { if (wParam < 0x20) { if (VK_BACK == wParam) { CCIMEDispatcher::sharedDispatcher()->dispatchDeleteBackward(); } else if (VK_RETURN == wParam) { CCIMEDispatcher::sharedDispatcher()->dispatchInsertText("\n", 1); } else if (VK_TAB == wParam) { // tab input } else if (VK_ESCAPE == wParam) { // ESC input CCDirector::sharedDirector()->end(); } } else if (wParam < 128) { // ascii char CCIMEDispatcher::sharedDispatcher()->dispatchInsertText((const char *)&wParam, 1); } else { char szUtf8[8] = {0}; int nLen = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)&wParam, 1, szUtf8, sizeof(szUtf8), NULL, NULL); CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(szUtf8, nLen); } if ( m_lpfnAccelerometerKeyHook!=NULL ) { (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam ); } } break; case WM_PAINT: BeginPaint(m_hWnd, &ps); EndPaint(m_hWnd, &ps); break; case WM_CLOSE: CCDirector::sharedDirector()->end(); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(m_hWnd, message, wParam, lParam); } return 0; }
void release_mouse(DDContext *ctx, HWND hWnd, GF_VideoOutput *vout) { ReleaseCapture(); mouse_start_timer(ctx, hWnd, vout); }
void CXTPDockingPaneSplitterWnd::OnLButtonDown(UINT /*nFlags*/, CPoint point) { if (m_pContainer == 0) return; CXTPDockingPaneManager* pManager = GetDockingPaneManager(); if (pManager->IsSplittersLocked()) return; CXTPWindowRect rc(this); CRect rcAvail, rcUnion; if (!GetAvailableRect(rcAvail, rcUnion)) return; if (m_pContainer->OnAction(xtpPaneActionSplitterResizing)) return; m_pContainer->NormalizeDockingSize(); BOOL bHoriz = m_pContainer->m_bHoriz; //point = rc.TopLeft(); ClientToScreen(&point); if (pManager->IsSplitterTrackerUsed()) { CXTPSplitterTracker tracker; BOOL bAccept = tracker.Track(this, rcAvail, rc, point, bHoriz); if (bAccept) { Reposition(rc, rcUnion); pManager->RecalcFrameLayout(m_pContainer, TRUE); } } else { CPoint ptOffset = bHoriz ? CPoint(rc.left - point.x, 0) : CPoint(0, rc.top - point.y); SetCapture(); while (::GetCapture() == m_hWnd) { MSG msg; while (::PeekMessage(&msg, NULL, WM_PAINT, WM_PAINT, PM_REMOVE | PM_NOYIELD)) { DispatchMessage(&msg); } if (!GetMessage(&msg, NULL, 0, 0)) break; if (msg.message == WM_MOUSEMOVE) { point = CPoint(msg.lParam); ClientToScreen(&point); point += ptOffset; point.x = max(min(point.x, rcAvail.right), rcAvail.left); point.y = max(min(point.y, rcAvail.bottom), rcAvail.top); if (bHoriz) { if (rc.left == point.x) continue; rc.OffsetRect(point.x - rc.left, 0); } else { if (rc.top == point.y) continue; rc.OffsetRect(0, point.y - rc.top); } Reposition(rc, rcUnion); pManager->RecalcFrameLayout(m_pContainer); } else if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE) break; else if (msg.message == WM_LBUTTONUP) break; else ::DispatchMessage(&msg); } if (CWnd::GetCapture() == this) ReleaseCapture(); } m_pContainer->OnAction(xtpPaneActionSplitterResized); }
r3dKeyboard::~r3dKeyboard() { ReleaseCapture(); }
r3dMouse::~r3dMouse() { ReleaseCapture(); }
LRESULT CALLBACK CToolbarWnd::WndProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam ) { CToolbarWnd* pThis = NULL; if(IsWindow(hWnd)) { pThis = (CToolbarWnd*)GetProp(hWnd, TEXT("toolbar_this")); if(pThis && pThis->m_hWnd != hWnd) { pThis = NULL; } } if(pThis || uMessage == WM_CREATE) { switch (uMessage) { case WM_EDIT_CAPTURE: if (wParam) { SetCapture(hWnd); pThis->m_inCapture = TRUE; } else { ReleaseCapture(); pThis->m_inCapture = FALSE; } break; case WM_EDIT_ACTIONKEY: switch (wParam) { case VK_RETURN: { std::wstring url = pThis->m_omnibox->get_url(); pThis->m_omnibox->select_all(); pThis->m_parent->open(url.c_str()); } break; } return 0; case WM_OMNIBOX_CLICKED: pThis->OnOmniboxClicked(); break; case WM_UPDATE_CONTROL: { LPRECT rcDraw = (LPRECT)lParam; InvalidateRect(hWnd, rcDraw, FALSE); } break; case WM_SETCURSOR: pThis->update_cursor(); break; case WM_ERASEBKGND: return TRUE; case WM_CREATE: { LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; pThis = (CToolbarWnd*)(lpcs->lpCreateParams); SetProp(hWnd, TEXT("toolbar_this"), (HANDLE) pThis); pThis->m_hWnd = hWnd; pThis->OnCreate(); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); simpledib::dib dib; dib.beginPaint(hdc, &ps.rcPaint); pThis->OnPaint(&dib, &ps.rcPaint); dib.endPaint(); EndPaint(hWnd, &ps); } return 0; case WM_KILLFOCUS: if (pThis->m_omnibox && pThis->m_omnibox->have_focus()) { pThis->m_omnibox->KillFocus(); } break; case WM_SIZE: pThis->OnSize(LOWORD(lParam), HIWORD(lParam)); return 0; case WM_DESTROY: RemoveProp(hWnd, TEXT("toolbar_this")); pThis->OnDestroy(); delete pThis; return 0; case WM_MOUSEMOVE: { TRACKMOUSEEVENT tme; ZeroMemory(&tme, sizeof(TRACKMOUSEEVENT)); tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_QUERY; tme.hwndTrack = hWnd; TrackMouseEvent(&tme); if(!(tme.dwFlags & TME_LEAVE)) { tme.dwFlags = TME_LEAVE; tme.hwndTrack = hWnd; TrackMouseEvent(&tme); } pThis->OnMouseMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); } return 0; case WM_MOUSELEAVE: pThis->OnMouseLeave(); return 0; case WM_LBUTTONDOWN: pThis->OnLButtonDown(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return 0; case WM_LBUTTONUP: pThis->OnLButtonUp(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return 0; case WM_KEYDOWN: if (pThis->m_omnibox && pThis->m_omnibox->have_focus()) { if (pThis->m_omnibox->OnKeyDown(wParam, lParam)) { return 0; } } break; case WM_KEYUP: if (pThis->m_omnibox && pThis->m_omnibox->have_focus()) { if (pThis->m_omnibox->OnKeyUp(wParam, lParam)) { return 0; } } break; case WM_CHAR: if (pThis->m_omnibox && pThis->m_omnibox->have_focus()) { if (pThis->m_omnibox->OnChar(wParam, lParam)) { return 0; } } break; } } return DefWindowProc(hWnd, uMessage, wParam, lParam); }
//-------------------------------------------------------------------------------------- // Desc: //-------------------------------------------------------------------------------------- LRESULT CD3DArcBall::HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { // Current mouse position int iMouseX = (short)LOWORD(lParam); int iMouseY = (short)HIWORD(lParam); switch( uMsg ) { case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: SetCapture( hWnd ); OnBegin( iMouseX, iMouseY ); return TRUE; case WM_LBUTTONUP: ReleaseCapture(); OnEnd(); return TRUE; case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: SetCapture( hWnd ); // Store off the position of the cursor when the button is pressed m_ptLastMouse.x = iMouseX; m_ptLastMouse.y = iMouseY; return TRUE; case WM_RBUTTONUP: case WM_MBUTTONUP: ReleaseCapture(); return TRUE; case WM_MOUSEMOVE: if( MK_LBUTTON&wParam ) { OnMove( iMouseX, iMouseY ); g_bRequestRender = TRUE; } else if( (MK_RBUTTON&wParam) || (MK_MBUTTON&wParam) ) { // Normalize based on size of window and bounding sphere radius FLOAT fDeltaX = ( m_ptLastMouse.x-iMouseX ) * m_fRadiusTranslation / m_nWidth; FLOAT fDeltaY = ( m_ptLastMouse.y-iMouseY ) * m_fRadiusTranslation / m_nHeight; if( wParam & MK_RBUTTON ) { if ( GetKeyState(VK_LSHIFT) == 0 ) { D3DXMatrixTranslation( &m_mTranslationDelta, -1*fDeltaX, 1*fDeltaY, 0.0f ); D3DXMatrixMultiply( &m_mTranslation, &m_mTranslation, &m_mTranslationDelta ); } else { D3DXMatrixTranslation( &m_mTranslationDelta, 0.0f, 0.0f, 5*fDeltaY ); D3DXMatrixMultiply( &m_mTranslation, &m_mTranslation, &m_mTranslationDelta ); } } // Store mouse coordinate m_ptLastMouse.x = iMouseX; m_ptLastMouse.y = iMouseY; g_bRequestRender = TRUE; } return TRUE; } return FALSE; }
LRESULT CALLBACK Win32ScreenDevice::WindowProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) { STRICT_REQUIRE ( g_win32ScreenDev != 0 ); switch ( Msg ) { case XEVENT: break; case WM_SIZE: if ( g_win32ScreenDev->attached_ ) g_win32ScreenDev->OnResize(); break; case WM_CREATE: mouse_locked = false; ReleaseCapture(); break; case WM_ACTIVATE: if ( LOWORD(wParam) != WA_INACTIVE ) g_win32ScreenDev->isActive_ = true; else g_win32ScreenDev->isActive_ = false; g_win32ScreenDev->EnqueEvent(EVENT::MakeWindowActive(g_win32ScreenDev->isActive_)); break; case WM_CLOSE: if (!g_win32ScreenDev->attached_) { PostMessage(hWnd,XCLOSE,0,0); return 0; } break; case WM_SETCURSOR: if(HTCLIENT == LOWORD(lParam)) { if ( g_win32ScreenDev->enableCursor_ ) SetCursor(g_win32ScreenDev->cursor_); else SetCursor(0); return TRUE; } break; case WM_PAINT: g_win32ScreenDev->MakeRubbish(); if ( g_win32ScreenDev->attached_ ) g_win32ScreenDev->OnPaint(); break; case WM_GETDLGCODE: { if ( lParam && ((MSG*)lParam)->message == WM_KEYDOWN ) { EVENT e = g_win32ScreenDev->ProcessMessage(*(MSG*)lParam); if ( e.type != EVENT::NONE ) g_win32ScreenDev->EnqueEvent(e); return DLGC_WANTALLKEYS; } else return DLGC_WANTALLKEYS; } default: { MSG msg; msg.message = Msg; msg.lParam = lParam; msg.wParam = wParam; EVENT e = g_win32ScreenDev->ProcessMessage(msg); if ( e.type != EVENT::NONE ) g_win32ScreenDev->EnqueEvent(e); } } return (defproc_ ? defproc_ : DefWindowProc)(hWnd,Msg,wParam,lParam); }
//-------------------------------------------------------------------------------------- // Call this from your message proc so this class can handle window messages //-------------------------------------------------------------------------------------- LRESULT CBaseCamera::HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { UNREFERENCED_PARAMETER( hWnd ); UNREFERENCED_PARAMETER( lParam ); switch( uMsg ) { case WM_KEYDOWN: { // Map this key to a D3DUtil_CameraKeys enum and update the // state of m_aKeys[] by adding the KEY_WAS_DOWN_MASK|KEY_IS_DOWN_MASK mask // only if the key is not down D3DUtil_CameraKeys mappedKey = MapKey( (UINT)wParam ); if( mappedKey != CAM_UNKNOWN ) { if( FALSE == IsKeyDown(m_aKeys[mappedKey]) ) m_aKeys[ mappedKey ] = KEY_WAS_DOWN_MASK | KEY_IS_DOWN_MASK; } break; } case WM_KEYUP: { // Map this key to a D3DUtil_CameraKeys enum and update the // state of m_aKeys[] by removing the KEY_IS_DOWN_MASK mask. D3DUtil_CameraKeys mappedKey = MapKey( (UINT)wParam ); if( mappedKey != CAM_UNKNOWN ) m_aKeys[ mappedKey ] &= ~KEY_IS_DOWN_MASK; break; } case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: case WM_LBUTTONDOWN: case WM_RBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_LBUTTONDBLCLK: { // Compute the drag rectangle in screen coord. POINT ptCursor = { (short)LOWORD(lParam), (short)HIWORD(lParam) }; // Update member var state if( ( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) && PtInRect( &m_rcDrag, ptCursor ) ) { m_bMouseLButtonDown = true; m_nCurrentButtonMask |= MOUSE_LEFT_BUTTON; } if( ( uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONDBLCLK ) && PtInRect( &m_rcDrag, ptCursor ) ) { m_bMouseMButtonDown = true; m_nCurrentButtonMask |= MOUSE_MIDDLE_BUTTON; } if( ( uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONDBLCLK ) && PtInRect( &m_rcDrag, ptCursor ) ) { m_bMouseRButtonDown = true; m_nCurrentButtonMask |= MOUSE_RIGHT_BUTTON; } // Capture the mouse, so if the mouse button is // released outside the window, we'll get the WM_LBUTTONUP message SetCapture(hWnd); GetCursorPos( &m_ptLastMousePosition ); return TRUE; } case WM_RBUTTONUP: case WM_MBUTTONUP: case WM_LBUTTONUP: { // Update member var state if( uMsg == WM_LBUTTONUP ) { m_bMouseLButtonDown = false; m_nCurrentButtonMask &= ~MOUSE_LEFT_BUTTON; } if( uMsg == WM_MBUTTONUP ) { m_bMouseMButtonDown = false; m_nCurrentButtonMask &= ~MOUSE_MIDDLE_BUTTON; } if( uMsg == WM_RBUTTONUP ) { m_bMouseRButtonDown = false; m_nCurrentButtonMask &= ~MOUSE_RIGHT_BUTTON; } // Release the capture if no mouse buttons down if( !m_bMouseLButtonDown && !m_bMouseRButtonDown && !m_bMouseMButtonDown ) { ReleaseCapture(); } break; } case WM_MOUSEWHEEL: // Update member var state m_nMouseWheelDelta = (short)HIWORD(wParam) / 120; break; } return FALSE; }
void HillsApp::OnMouseUp(WPARAM btnState, int x, int y) { ReleaseCapture(); }
void CXTPTabManager::ReOrder(HWND hWnd, CPoint pt, CXTPTabManagerItem* pItem) { CXTPTabManagerItem* pSelected = m_pSelected; m_pSelected = pItem; if (GetPaintManager()->m_bHotTracking) m_pHighlighted = pItem; Reposition(); CArray<CRect, CRect&> arrRects; for (int j = 0; j < GetItemCount(); j++) { CRect rc = GetItem(j)->GetRect(); arrRects.Add(rc); } int nIndex = pItem->GetIndex(); ::SetCapture(hWnd); while (::GetCapture() == hWnd) { MSG msg; VERIFY(::GetMessage(&msg, NULL, 0, 0)); if (::GetCapture() != hWnd) { DispatchMessage (&msg); break; } switch (msg.message) { case WM_MOUSEMOVE: { pt = CPoint((short signed)LOWORD(msg.lParam), (short signed)HIWORD(msg.lParam)); for (int i = 0; i < arrRects.GetSize(); i++) { if (i != pItem->GetIndex() && arrRects[i].PtInRect(pt)) { while (i != pItem->GetIndex()) { int j = i < pItem->GetIndex() ? pItem->GetIndex() - 1 : pItem->GetIndex() + 1; CXTPTabManagerItem* p1 = pItem; CXTPTabManagerItem* p2 = m_arrItems[pItem->GetIndex()] = m_arrItems[j]; m_arrItems[j] = p1; OnItemsChanged(); OnSwitchItem(p1, p2); } break; } } } break; case WM_KEYDOWN: if (msg.wParam != VK_ESCAPE) break; case WM_CANCELMODE: case WM_LBUTTONUP: case WM_RBUTTONDOWN: goto ExitLoop; default: DispatchMessage (&msg); break; } } ExitLoop: ReleaseCapture(); PerformMouseMove(hWnd, pt); m_pSelected = pSelected; OnItemClick(pItem); if (nIndex != pItem->GetIndex()) { OnItemOrderChanged(pItem, nIndex, pItem->GetIndex()); } }
//用于拖动 LRESULT CChooseUninstallDialog::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){ ReleaseCapture(); SendMessage(m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); return 0; }
void CMy3D_view_FPbody_modelView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CMy3D_view_FPbody_modelDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); wglMakeCurrent(m_pDC->GetSafeHdc(), NULL); OPRT->Set_LBD(FALSE); if(pDoc->BP_xy[xyLineIndex][xyPointIndex].Catch==TRUE) { pDoc->BP_xy[xyLineIndex][xyPointIndex].Catch=FALSE; } if(pDoc->BP_yz[yzLineIndex][yzPointIndex].Catch==TRUE) { pDoc->BP_yz[yzLineIndex][yzPointIndex].Catch=FALSE; } if(pDoc->BP_xz[xzLineIndex][xzPointIndex].Catch==TRUE) { pDoc->BP_xz[xzLineIndex][xzPointIndex].Catch=FALSE; } /* int i, index; for(index=0;index<pDoc->XYLNum;index++) { for(i=0;i<pDoc->XYLINE[index].Get_BP();i++) { if(pDoc->BP_xy[index][i].Catch==TRUE) { pDoc->BP_xy[index][i].Catch=FALSE; break; } } } for(index=0;index<pDoc->YZLNum;index++) { for(i=0;i<pDoc->YZLINE[index].Get_BP();i++) { if(pDoc->BP_yz[index][i].Catch==TRUE) { pDoc->BP_yz[index][i].Catch=FALSE; break; } } } for(index=0;index<pDoc->XZLNum;index++) { for(i=0;i<pDoc->XZLINE[index].Get_BP();i++) { if(pDoc->BP_xz[index][i].Catch==TRUE) { pDoc->BP_xz[index][i].Catch=FALSE; break; } } }*/ InvalidateRect(NULL,FALSE); ReleaseCapture(); CView::OnLButtonUp(nFlags, point); }
LRESULT CALLBACK SharedDesktopArea::BmpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HBITMAP hNewImage, hOldImage; HCURSOR hNewCursor, hOldCursor; SharedDesktopArea* pDialog = (SharedDesktopArea*) GetWindowLong(hWnd, GWL_USERDATA); switch (message) { case WM_SETCURSOR : if (HIWORD(lParam) == WM_LBUTTONDOWN) { SetCapture(hWnd); hNewImage = LoadBitmap(hAppInstance, MAKEINTRESOURCE(IDB_BITMAP2)); hOldImage = (HBITMAP)::SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hNewImage); DeleteObject(hOldImage); hNewCursor = (HCURSOR)LoadImage(hAppInstance, MAKEINTRESOURCE(IDC_CURSOR1), IMAGE_CURSOR, 32, 32, LR_DEFAULTCOLOR); hOldCursor = SetCursor(hNewCursor); DestroyCursor(hOldCursor); pDialog->m_bCaptured = TRUE; } break; case WM_LBUTTONUP: ReleaseCapture(); if (pDialog->m_KeepHandle != NULL) { // We need to remove frame DrawFrameAroundWindow(pDialog->m_KeepHandle); pDialog->m_hwndShared = pDialog->m_KeepHandle; // No more need pDialog->m_KeepHandle = NULL; } else { pDialog->m_hwndShared = NULL; } hNewImage = LoadBitmap(hAppInstance, MAKEINTRESOURCE(IDB_BITMAP1)); hOldImage = (HBITMAP)::SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hNewImage); DeleteObject(hOldImage); hNewCursor = LoadCursor(hAppInstance, MAKEINTRESOURCE(IDC_ARROW)); hOldCursor = SetCursor(hNewCursor); DestroyCursor(hOldCursor); pDialog->m_bCaptured = FALSE; break; case WM_MOUSEMOVE: if (pDialog->m_bCaptured) { HWND hParent = ::GetParent(hWnd); POINTS pnt; POINT pnt1; pnt = MAKEPOINTS(lParam); pnt1.x = pnt.x; pnt1.y = pnt.y; ClientToScreen(hWnd, &pnt1); HWND hMouseWnd=::WindowFromPoint(pnt1); if (pDialog->m_KeepHandle != hMouseWnd) { // New Windows Handle // Was KeepHandle A Real Window ? if (pDialog->m_KeepHandle != NULL) { // We need to remove frame SharedDesktopArea::DrawFrameAroundWindow(pDialog->m_KeepHandle); } pDialog->m_KeepHandle = hMouseWnd; if (!IsChild(hParent, hMouseWnd) && hMouseWnd != hParent) { pDialog->SetWindowCaption(hMouseWnd); SharedDesktopArea::DrawFrameAroundWindow(hMouseWnd); } else { // My Window pDialog->m_KeepHandle = NULL; pDialog->SetWindowCaption(NULL); } } } break; case WM_PAINT: case STM_SETIMAGE: return CallWindowProc((WNDPROC)pDialog->m_OldBmpWndProc, hWnd, message, wParam, lParam); default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
BOOL CALLBACK NavDialog::run_dlgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { long yPos; int LineStart; int LineVisible; int Delta; switch (Message) { case WM_INITDIALOG: { // Here, I modify window styles (set H and V redraw) SetClassLong(hWnd, GCL_STYLE, CS_HREDRAW | CS_VREDRAW); m_hWnd = hWnd; ReadyToDraw = FALSE; break; } case WM_PAINT: { ReadyToDraw = TRUE; return OnPaint(hWnd); } case WM_NOTIFY: { //return DockingDlgInterface::run_dlgProc(hWnd, Message, wParam, lParam); break; } case WM_DESTROY: { // Delete objects DeleteDC(m_hMemDC1); DeleteDC(m_hMemDC2); DeleteDC(m_hMemDCView); DeleteObject(m_hMemBMP1); DeleteObject(m_hMemBMP2); DeleteObject(m_hMemBMPView); PostQuitMessage(0); break; } case WM_LBUTTONDOWN: POINT pt; SetCapture(hWnd); yPos = HIWORD(lParam); current_line = yPos * m_ScaleFactor; LineVisible = SendMessageA(_nppData._scintillaMainHandle, SCI_LINESONSCREEN, 0, 0); LineStart = SendMessageA(_nppData._scintillaMainHandle, SCI_GETFIRSTVISIBLELINE, 0, 0); Delta = current_line - LineVisible/2 - LineStart; SendMessageA(_nppData._scintillaMainHandle, SCI_LINESCROLL, 0, (LPARAM)Delta); SendMessageA(_nppData._scintillaMainHandle, SCI_GOTOLINE, (WPARAM)current_line, 0); break; case WM_LBUTTONUP: ReleaseCapture(); break; case WM_MOUSEMOVE: long start; long next_line; int LineStart; int LineVisible; if (GetCapture() == hWnd) { yPos = HIWORD(lParam); next_line = yPos * m_ScaleFactor; Delta = next_line - current_line; SendMessageA(_nppData._scintillaMainHandle, SCI_LINESCROLL, 0, (LPARAM)Delta); SendMessageA(_nppData._scintillaMainHandle, SCI_GOTOLINE, (WPARAM)next_line, 0); current_line = next_line; } break; default: return DockingDlgInterface::run_dlgProc(hWnd, Message, wParam, lParam); } return FALSE; }
long CPixelBufferView::OnLeftButtonUp(int x, int y) { m_dragging = false; ReleaseCapture(); return CDirectXControl::OnLeftButtonUp(x, y); }
LRESULT CMainWindow::Splitter_OnLButtonUp(HWND hwnd, UINT /*iMsg*/, WPARAM /*wParam*/, LPARAM lParam) { HDC hdc; RECT rect; RECT clientrect; POINT pt; pt.x = (short)LOWORD(lParam); // horizontal position of cursor pt.y = (short)HIWORD(lParam); if (bDragMode == FALSE) return 0; GetClientRect(hwnd, &clientrect); GetWindowRect(hwnd, &rect); POINT zero = {0,0}; ClientToScreen(hwnd, &zero); OffsetRect(&clientrect, zero.x-rect.left, zero.y-rect.top); ClientToScreen(hwnd, &pt); pt.x -= rect.left; pt.y -= rect.top; OffsetRect(&rect, -rect.left, -rect.top); if (pt.x < 0) pt.x = 0; if (pt.x > rect.right-4) pt.x = rect.right-4; if (pt.y < 0) pt.y = 0; if (pt.y > rect.bottom-4) pt.y = rect.bottom-4; hdc = GetWindowDC(hwnd); if (bVertical) DrawXorBar(hdc, clientrect.left, oldy+2, clientrect.right-clientrect.left-2, 4); else DrawXorBar(hdc, oldx+2, clientrect.top, 4, clientrect.bottom-clientrect.top-2); ReleaseDC(hwnd, hdc); oldx = pt.x; oldy = pt.y; bDragMode = false; //convert the splitter position back to screen coords. GetWindowRect(hwnd, &rect); pt.x += rect.left; pt.y += rect.top; //now convert into CLIENT coordinates ScreenToClient(hwnd, &pt); GetClientRect(hwnd, &rect); #define MINWINSIZE 10 if (bVertical) { if (bDrag2) { if (pt.y < (nSplitterPos+MINWINSIZE)) pt.y = nSplitterPos+MINWINSIZE; nSplitterPos2 = pt.y; } else { if (pt.y > (nSplitterPos2-MINWINSIZE)) pt.y = nSplitterPos2-MINWINSIZE; nSplitterPos = pt.y; } } else { if (bDrag2) { if (pt.x < (nSplitterPos+MINWINSIZE)) pt.x = nSplitterPos+MINWINSIZE; nSplitterPos2 = pt.x; } else { if (pt.x > (nSplitterPos2-MINWINSIZE)) pt.x = nSplitterPos2-MINWINSIZE; nSplitterPos = pt.x; } } ReleaseCapture(); //position the child controls PositionChildren(&rect); return 0; }
BOOL CALLBACK DlgProcParentWindow(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DWORD ws; struct ParentWindowData *dat; dat = (struct ParentWindowData *) GetWindowLong(hwndDlg, GWL_USERDATA); if (!dat && msg!=WM_INITDIALOG) return FALSE; switch (msg) { case WM_INITDIALOG: { struct NewMessageWindowLParam *newData = (struct NewMessageWindowLParam *) lParam; dat = (struct ParentWindowData *) malloc(sizeof(struct ParentWindowData)); dat->hContact = newData->hContact; dat->nFlash = 0; dat->nFlashMax = DBGetContactSettingByte(NULL, SRMMMOD, SRMSGSET_FLASHCOUNT, SRMSGDEFSET_FLASHCOUNT); dat->childrenCount = 0; dat->children = NULL; dat->hwnd = hwndDlg; dat->flags = g_dat->flags;// | SMF_SHOWTITLEBAR; dat->mouseLBDown = 0; dat->windowWasCascaded = 0; dat->hwndStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0, hwndDlg, NULL, g_hInst, NULL); { int statwidths[4]; RECT rc; SendMessage(dat->hwndStatus, SB_SETMINHEIGHT, GetSystemMetrics(SM_CYSMICON), 0); GetWindowRect(dat->hwndStatus, &rc); /* statwidths[0] = rc.right - rc.left - SB_CHAR_WIDTH - SB_TYPING_WIDTH - SB_SENDING_WIDTH; statwidths[1] = rc.right - rc.left - SB_TYPING_WIDTH - SB_SENDING_WIDTH; //rc.right - rc.left - SB_CHAR_WIDTH; statwidths[2] = rc.right - rc.left - SB_TYPING_WIDTH; //rc.right - rc.left - SB_CHAR_WIDTH; statwidths[3] = -1; SendMessage(dat->hwndStatus, SB_SETPARTS, 4, (LPARAM) statwidths); */ statwidths[0] = rc.right - rc.left - SB_CHAR_WIDTH - SB_TYPING_WIDTH; statwidths[1] = rc.right - rc.left - SB_TYPING_WIDTH; statwidths[2] = -1; SendMessage(dat->hwndStatus, SB_SETPARTS, 3, (LPARAM) statwidths); } dat->hwndTabs = GetDlgItem(hwndDlg, IDC_TABS); dat->hwndActive = NULL; SetWindowLong(hwndDlg, GWL_USERDATA, (LONG) dat); if (g_dat->hIconList != NULL) { TabCtrl_SetImageList(dat->hwndTabs, g_dat->hIconList); } WindowList_Add(g_dat->hParentWindowList, hwndDlg, 0); dat->tabCtrlDat = (struct TabCtrlData *) malloc(sizeof(struct TabCtrlData)); dat->tabCtrlDat->bDragging = FALSE; SetWindowLong(dat->hwndTabs, GWL_USERDATA, (LONG) dat->tabCtrlDat); OldTabCtrlProc = (WNDPROC) SetWindowLong(dat->hwndTabs, GWL_WNDPROC, (LONG) TabCtrlProc); ws = GetWindowLong(dat->hwndTabs, GWL_STYLE) & ~(TCS_BOTTOM); if (dat->flags & SMF_TABSATBOTTOM) { ws |= TCS_BOTTOM; } SetWindowLong(dat->hwndTabs, GWL_STYLE, ws); ws = GetWindowLong(hwndDlg, GWL_STYLE) & ~(WS_CAPTION); if (dat->flags & SMF_SHOWTITLEBAR) { ws |= WS_CAPTION; SetWindowLong(hwndDlg, GWL_STYLE, ws); } else { RECT rc; SetWindowLong(hwndDlg, GWL_STYLE, ws); GetWindowRect(hwndDlg, &rc); SetWindowPos(hwndDlg, 0, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOSENDCHANGING); } ws = GetWindowLong(hwndDlg, GWL_EXSTYLE) & ~WS_EX_LAYERED; ws |= dat->flags & SMF_USETRANSPARENCY ? WS_EX_LAYERED : 0; SetWindowLong(hwndDlg , GWL_EXSTYLE , ws); if (dat->flags & SMF_USETRANSPARENCY) { pSetLayeredWindowAttributes(hwndDlg, RGB(255,255,255), (BYTE)(255-g_dat->inactiveAlpha), LWA_ALPHA); // RedrawWindow(hwndDlg, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); } //SetWindowPos(dat->hwndTabs, 0, 0, -10, 0, 0, SWP_NOSIZE | SWP_NOZORDER); if (!(dat->flags & SMF_SHOWSTATUSBAR)) { ShowWindow(dat->hwndStatus, SW_HIDE); } if (dat->flags & SMF_USETABS) { if (ScriverRestoreWindowPosition(hwndDlg, NULL, SRMMMOD, "", 0, SW_HIDE)) { SetWindowPos(hwndDlg, 0, 0, 0, 450, 300, SWP_NOZORDER | SWP_NOMOVE | SWP_HIDEWINDOW); } } else { int savePerContact = DBGetContactSettingByte(NULL, SRMMMOD, SRMSGSET_SAVEPERCONTACT, SRMSGDEFSET_SAVEPERCONTACT); if (ScriverRestoreWindowPosition(hwndDlg, savePerContact ? dat->hContact : NULL, SRMMMOD, "", 0, SW_HIDE)) { //if (Utils_RestoreWindowPosition(GetParent(hwndDlg), savePerContact ? dat->hContact : NULL, SRMMMOD, "")) { if (savePerContact) { if (ScriverRestoreWindowPosition(hwndDlg, NULL, SRMMMOD, "", RWPF_NOSIZE, SW_HIDE)) // if (Utils_RestoreWindowPositionNoMove(GetParent(hwndDlg), NULL, SRMMMOD, "")) SetWindowPos(GetParent(hwndDlg), 0, 0, 0, 450, 300, SWP_NOZORDER | SWP_NOMOVE); } else SetWindowPos(hwndDlg, 0, 0, 0, 450, 300, SWP_NOZORDER | SWP_NOMOVE); } if (!savePerContact && DBGetContactSettingByte(NULL, SRMMMOD, SRMSGSET_CASCADE, SRMSGDEFSET_CASCADE)) WindowList_Broadcast(g_dat->hParentWindowList, DM_CASCADENEWWINDOW, (WPARAM) hwndDlg, (LPARAM) & dat->windowWasCascaded); } } return TRUE; case WM_GETMINMAXINFO: { MINMAXINFO *mmi = (MINMAXINFO *) lParam; SIZE size; GetMinimunWindowSize(dat, &size); mmi->ptMinTrackSize.x = size.cx; mmi->ptMinTrackSize.y = size.cy; return FALSE; } case WM_SIZE: if (wParam == SIZE_MINIMIZED) { dat->bMinimized = 1; } if (IsIconic(hwndDlg)) { MoveWindow(dat->hwndActive, dat->childRect.left, dat->childRect.top, dat->childRect.right-dat->childRect.left, dat->childRect.bottom - dat->childRect.top, TRUE); } else { // } // if (!IsIconic(hwndDlg)) { int i; RECT rc, rcStatus, rcChild, rcWindow; SIZE size; dat->bMinimized = 0; GetClientRect(hwndDlg, &rc); GetWindowRect(hwndDlg, &rcWindow); rcStatus.top = rcStatus.bottom = 0; if (dat->flags & SMF_SHOWSTATUSBAR) { int statwidths[4]; GetWindowRect(dat->hwndStatus, &rcStatus); statwidths[0] = rc.right - rc.left - SB_CHAR_WIDTH - SB_TYPING_WIDTH; statwidths[1] = rc.right - rc.left - SB_TYPING_WIDTH; statwidths[2] = -1; SendMessage(dat->hwndStatus, SB_SETPARTS, 3, (LPARAM) statwidths); SendMessage(dat->hwndStatus, WM_SIZE, 0, 0); } MoveWindow(dat->hwndTabs, 0, 2, (rc.right - rc.left), (rc.bottom - rc.top) - (rcStatus.bottom - rcStatus.top) - 2, FALSE); RedrawWindow(dat->hwndTabs, NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_ERASE); GetMinimunWindowSize(dat, &size); if ((rcWindow.bottom-rcWindow.top) < size.cy || (rcWindow.right-rcWindow.left) < size.cx) { if ((rcWindow.bottom-rcWindow.top) < size.cy) { rcWindow.bottom = rcWindow.top + size.cy; } if ((rcWindow.right-rcWindow.left) < size.cx) { rcWindow.right = rcWindow.left + size.cx; } MoveWindow(hwndDlg, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE); } GetChildWindowRect(dat, &rcChild); memcpy(&dat->childRect, &rcChild, sizeof(RECT)); for (i=0;i<dat->childrenCount;i++) { if (dat->children[i] == dat->hwndActive) { MoveWindow(dat->children[i], rcChild.left, rcChild.top, rcChild.right-rcChild.left, rcChild.bottom - rcChild.top, TRUE); RedrawWindow(GetDlgItem(dat->children[i], IDC_LOG), NULL, NULL, RDW_INVALIDATE); } } if (dat->flags & SMF_SHOWSTATUSBAR) { RedrawWindow(dat->hwndStatus, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE); } } return FALSE; case WM_SETFOCUS: SetFocus(dat->hwndActive); return TRUE; case WM_CLOSE: DestroyWindow(hwndDlg); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: //DestroyWindow(hwndDlg); return TRUE; } case WM_NOTIFY: { NMHDR* pNMHDR = (NMHDR*) lParam; if (pNMHDR->hwndFrom == dat->hwndTabs) { switch (pNMHDR->code) { case TCN_SELCHANGE: { TCITEM tci = {0}; int iSel = TabCtrl_GetCurSel(dat->hwndTabs); tci.mask = TCIF_PARAM; if (TabCtrl_GetItem(dat->hwndTabs, iSel, &tci)) { struct MessageWindowData * mdat = (struct MessageWindowData *) tci.lParam; ActivateChild(dat, mdat->hwnd); } } break; case NM_RCLICK: { TCHITTESTINFO thinfo; int tabId, x, y; GetCursorPos(&thinfo.pt); x = thinfo.pt.x; y = thinfo.pt.y; ScreenToClient(dat->hwndTabs, &thinfo.pt); tabId = TabCtrl_HitTest(dat->hwndTabs, &thinfo); if (tabId != -1) { struct MessageWindowData * mwd = GetChildFromTab(dat->hwndTabs, tabId); //CallService(MS_USERINFO_SHOWDIALOG, (WPARAM) mwd->hContact, 0); HMENU hMenu = (HMENU) CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM) mwd->hContact, 0); TrackPopupMenu(hMenu, 0, x, y, 0, mwd->hwnd, NULL); DestroyMenu(hMenu); } } break; } } else if (pNMHDR->hwndFrom == dat->hwndStatus) { switch (pNMHDR->code) { case NM_CLICK: { NMMOUSE *nm=(NMMOUSE*)lParam; RECT rc; SendMessage(dat->hwndStatus, SB_GETRECT, SendMessage(dat->hwndStatus, SB_GETPARTS, 0, 0) - 1, (LPARAM)&rc); if (nm->pt.x >= rc.left) SendMessage(dat->hwndActive, DM_SWITCHUNICODE, 0, 0); } } break; } } break; case WM_DROPFILES: SendMessage(dat->hwndActive, WM_DROPFILES, wParam, lParam); break; case WM_TIMER: if (wParam == TIMERID_FLASHWND) { if ((dat->nFlash > dat->nFlashMax)) {// || ((GetActiveWindow() == hwndDlg) && (GetForegroundWindow() == hwndDlg))) { KillTimer(hwndDlg, TIMERID_FLASHWND); FlashWindow(hwndDlg, FALSE); } else if (dat->nFlash < dat->nFlashMax) { FlashWindow(hwndDlg, TRUE); dat->nFlash++; } } break; case WM_CONTEXTMENU: { if (dat->hwndStatus && dat->hwndStatus == (HWND) wParam) { RECT rc; POINT pt, pt2; GetCursorPos(&pt); pt2.x = pt.x; pt2.y = pt.y; ScreenToClient(dat->hwndStatus, &pt); SendMessage(dat->hwndStatus, SB_GETRECT, SendMessage(dat->hwndStatus, SB_GETPARTS, 0, 0) - 1, (LPARAM)&rc); if (pt.x >= rc.left && dat->hwndActive != NULL) { int codePage = (int) SendMessage(dat->hwndActive, DM_GETCODEPAGE, 0, 0); int i, iSel; for(i = 0; i < GetMenuItemCount(g_dat->hMenuANSIEncoding); i++) { CheckMenuItem (g_dat->hMenuANSIEncoding, i, MF_BYPOSITION | MF_UNCHECKED); } if(codePage == CP_ACP) { CheckMenuItem(g_dat->hMenuANSIEncoding, 0, MF_BYPOSITION | MF_CHECKED); } else { CheckMenuItem(g_dat->hMenuANSIEncoding, codePage, MF_BYCOMMAND | MF_CHECKED); } iSel = TrackPopupMenu(g_dat->hMenuANSIEncoding, TPM_RETURNCMD, pt2.x, pt2.y, 0, hwndDlg, NULL); if (iSel >= 500) { if (iSel == 500) iSel = CP_ACP; SendMessage(dat->hwndActive, DM_SETCODEPAGE, 0, iSel); } } else SendMessage(dat->hwndActive, WM_CONTEXTMENU, (WPARAM)hwndDlg, 0); } break; } case WM_ACTIVATE: if (LOWORD(wParam) == WA_INACTIVE) { ws = GetWindowLong(hwndDlg, GWL_EXSTYLE) & ~WS_EX_LAYERED; ws |= dat->flags & SMF_USETRANSPARENCY ? WS_EX_LAYERED : 0; SetWindowLong(hwndDlg , GWL_EXSTYLE , ws); if (dat->flags & SMF_USETRANSPARENCY) { pSetLayeredWindowAttributes(hwndDlg, RGB(255,255,255), (BYTE)(255-g_dat->inactiveAlpha), LWA_ALPHA); // RedrawWindow(hwndDlg, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); } } if (LOWORD(wParam) != WA_ACTIVE) break; case WM_MOUSEACTIVATE: if (KillTimer(hwndDlg, TIMERID_FLASHWND)) { FlashWindow(hwndDlg, FALSE); dat->nFlash = 0; } ws = GetWindowLong(hwndDlg, GWL_EXSTYLE) & ~WS_EX_LAYERED; ws |= dat->flags & SMF_USETRANSPARENCY ? WS_EX_LAYERED : 0; SetWindowLong(hwndDlg , GWL_EXSTYLE , ws); if (dat->flags & SMF_USETRANSPARENCY) { pSetLayeredWindowAttributes(hwndDlg, RGB(255,255,255), (BYTE)(255-g_dat->activeAlpha), LWA_ALPHA); // RedrawWindow(hwndDlg, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); } SendMessage(dat->hwndActive, WM_ACTIVATE, WA_ACTIVE, 0); break; case WM_LBUTTONDOWN: dat->mouseLBDown = 1; GetCursorPos(&dat->mouseLBDownPos); SetCapture(hwndDlg); break; case WM_LBUTTONUP: dat->mouseLBDown = 0; ReleaseCapture(); break; case WM_MOUSEMOVE: if (dat->mouseLBDown) { POINT pt; RECT rc; GetCursorPos(&pt); GetWindowRect(hwndDlg, &rc); SetWindowPos(hwndDlg, 0, rc.left - (dat->mouseLBDownPos.x - pt.x), rc.top - (dat->mouseLBDownPos.y - pt.y), 0, 0, SWP_NOZORDER | SWP_NOSIZE); dat->mouseLBDownPos = pt; } break; case WM_DESTROY: { g_dat->hParent = NULL; SetWindowLong(hwndDlg, GWL_USERDATA, 0); WindowList_Remove(g_dat->hParentWindowList, hwndDlg); if (dat->children!=NULL) free (dat->children); free(dat->tabCtrlDat); free(dat); if (dat->flags & SMF_USETABS) { WINDOWPLACEMENT wp = { 0 }; wp.length = sizeof(wp); GetWindowPlacement(hwndDlg, &wp); DBWriteContactSettingDword(NULL, SRMMMOD, "x", wp.rcNormalPosition.left); DBWriteContactSettingDword(NULL, SRMMMOD, "y", wp.rcNormalPosition.top); DBWriteContactSettingDword(NULL, SRMMMOD, "width", wp.rcNormalPosition.right - wp.rcNormalPosition.left); DBWriteContactSettingDword(NULL, SRMMMOD, "height", wp.rcNormalPosition.bottom - wp.rcNormalPosition.top); } else { WINDOWPLACEMENT wp = { 0 }; HANDLE hContact; if (DBGetContactSettingByte(NULL, SRMMMOD, SRMSGSET_SAVEPERCONTACT, SRMSGDEFSET_SAVEPERCONTACT)) hContact = dat->hContact; else hContact = NULL; wp.length = sizeof(wp); GetWindowPlacement(hwndDlg, &wp); if (!dat->windowWasCascaded) { DBWriteContactSettingDword(hContact, SRMMMOD, "x", wp.rcNormalPosition.left); DBWriteContactSettingDword(hContact, SRMMMOD, "y", wp.rcNormalPosition.top); } DBWriteContactSettingDword(hContact, SRMMMOD, "width", wp.rcNormalPosition.right - wp.rcNormalPosition.left); DBWriteContactSettingDword(hContact, SRMMMOD, "height", wp.rcNormalPosition.bottom - wp.rcNormalPosition.top); } } break; case DM_ERRORDECIDED: break; case DM_STARTFLASHING: if (GetActiveWindow() != hwndDlg || GetForegroundWindow() != hwndDlg) { dat->nFlash = 0; SetTimer(hwndDlg, TIMERID_FLASHWND, TIMEOUT_FLASHWND, NULL); } break; case DM_REMOVECHILD: { RemoveChild(dat, (HWND) lParam); if (dat->childrenCount == 0) { DestroyWindow(hwndDlg); } else { } } return TRUE; case DM_ADDCHILD: { struct MessageWindowData * mdat = (struct MessageWindowData *) lParam; AddChild(dat, mdat); } return TRUE; case DM_ACTIVATECHILD: if((HWND) lParam != dat->hwndActive) { ActivateChild(dat, (HWND) lParam); } return TRUE; case DM_ACTIVATEPREV: ActivatePrevChild(dat, (HWND) lParam); return TRUE; case DM_ACTIVATENEXT: ActivateNextChild(dat, (HWND) lParam); return TRUE; case DM_SENDMESSAGE: { int i; for (i=0;i<dat->childrenCount;i++) { SendMessage(dat->children[i], DM_SENDMESSAGE, wParam, lParam); } } break; case DM_OPTIONSAPPLIED: { RECT rc; dat->flags = g_dat->flags; if (!(dat->flags & SMF_SHOWSTATUSBAR)) { ShowWindow(dat->hwndStatus, SW_HIDE); } else { ShowWindow(dat->hwndStatus, SW_SHOW); } ws = GetWindowLong(hwndDlg, GWL_STYLE) & ~(WS_CAPTION); if (dat->flags & SMF_SHOWTITLEBAR) { ws |= WS_CAPTION; } SetWindowLong(hwndDlg, GWL_STYLE, ws); ws = GetWindowLong(hwndDlg, GWL_EXSTYLE)& ~WS_EX_LAYERED; ws |= dat->flags & SMF_USETRANSPARENCY ? WS_EX_LAYERED : 0; SetWindowLong(hwndDlg , GWL_EXSTYLE , ws); if (dat->flags & SMF_USETRANSPARENCY) { pSetLayeredWindowAttributes(hwndDlg, RGB(255,255,255), (BYTE)(255-g_dat->inactiveAlpha), LWA_ALPHA); // RedrawWindow(hwndDlg, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); } ws = GetWindowLong(dat->hwndTabs, GWL_STYLE) & ~(TCS_BOTTOM); if (dat->flags & SMF_TABSATBOTTOM) { ws |= TCS_BOTTOM; } SetWindowLong(dat->hwndTabs, GWL_STYLE, ws); RedrawWindow(dat->hwndTabs, NULL, NULL, RDW_INVALIDATE); GetWindowRect(hwndDlg, &rc); SetWindowPos(hwndDlg, 0, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOSENDCHANGING); SendMessage(hwndDlg, WM_SIZE, 0, 0); //RedrawWindow(hwndDlg, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); break; } case DM_UPDATETITLE: { struct MessageWindowData * mdat = (struct MessageWindowData *) lParam; TCITEM tci; int tabId; char newtitle[256], oldtitle[256]; char *szStatus, *contactName, *pszNewTitleEnd; TCHAR *tContactName; if (mdat && mdat->hwnd == dat->hwndActive) { pszNewTitleEnd = "Message Session"; if (mdat->hContact) { if (mdat->szProto) { CONTACTINFO ci; char buf[128]; int statusIcon = DBGetContactSettingByte(NULL, SRMMMOD, SRMSGSET_STATUSICON, SRMSGDEFSET_STATUSICON); buf[0] = 0; mdat->wStatus = DBGetContactSettingWord(mdat->hContact, mdat->szProto, "Status", ID_STATUS_OFFLINE); contactName = (char *) CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM) mdat->hContact, 0); ZeroMemory(&ci, sizeof(ci)); ci.cbSize = sizeof(ci); ci.hContact = mdat->hContact; ci.szProto = mdat->szProto; ci.dwFlag = CNF_UNIQUEID; if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) { switch (ci.type) { case CNFT_ASCIIZ: mir_snprintf(buf, sizeof(buf), "%s", ci.pszVal); miranda_sys_free(ci.pszVal); break; case CNFT_DWORD: mir_snprintf(buf, sizeof(buf), "%u", ci.dVal); break; } } szStatus = (char *) CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, mdat->szProto == NULL ? ID_STATUS_OFFLINE : DBGetContactSettingWord(mdat->hContact, mdat->szProto, "Status", ID_STATUS_OFFLINE), 0); if (statusIcon) mir_snprintf(newtitle, sizeof(newtitle), "%s - %s", contactName, Translate(pszNewTitleEnd)); else mir_snprintf(newtitle, sizeof(newtitle), "%s (%s): %s", contactName, szStatus, Translate(pszNewTitleEnd)); } } else lstrcpynA(newtitle, pszNewTitleEnd, sizeof(newtitle)); GetWindowTextA(hwndDlg, oldtitle, sizeof(oldtitle)); if (lstrcmpA(newtitle, oldtitle)) { //swt() flickers even if the title hasn't actually changed SetWindowTextA(hwndDlg, newtitle); //SendMessage(hwndDlg, WM_SIZE, 0, 0); } } tabId = GetTabFromHWND(dat, mdat->hwnd); tContactName = GetTabName(mdat->hContact); tci.mask = TCIF_TEXT; tci.pszText = tContactName; TabCtrl_SetItem(dat->hwndTabs, tabId, &tci); free(tContactName); break; } case DM_UPDATEWINICON: { struct MessageWindowData * mdat = (struct MessageWindowData *) lParam; if (mdat) { if (mdat->szProto) { int i, icoIdx = 0; WORD wStatus; wStatus = DBGetContactSettingWord(mdat->hContact, mdat->szProto, "Status", ID_STATUS_OFFLINE); if (mdat->hwnd == dat->hwndActive) { if (DBGetContactSettingByte(NULL, SRMMMOD, SRMSGSET_STATUSICON, SRMSGDEFSET_STATUSICON)) { if (mdat->showTyping && (dat->flags&SMF_SHOWTYPINGWIN)) { SendMessage(hwndDlg, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) g_dat->hIcons[SMF_ICON_TYPING]); } else if (mdat->showUnread && (GetActiveWindow() != hwndDlg || GetForegroundWindow() != hwndDlg)) { SendMessage(hwndDlg, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) LoadSkinnedIcon(SKINICON_EVENT_MESSAGE)); } else { SendMessage(hwndDlg, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) LoadSkinnedProtoIcon(mdat->szProto, wStatus)); } } else { SendMessage(hwndDlg, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) LoadSkinnedIcon(SKINICON_EVENT_MESSAGE)); } } icoIdx = 0; for (i = 0; i < g_dat->protoNum; i++) { if (!strcmp(g_dat->protoNames[i], mdat->szProto)) { icoIdx = wStatus - ID_STATUS_OFFLINE + (ID_STATUS_OUTTOLUNCH - ID_STATUS_OFFLINE + 1) * (i +1) + 2; break; } } if (mdat->hwnd != dat->hwndActive) { if (mdat->showTyping) { icoIdx = 1; } else if (mdat->showUnread & 1) { icoIdx = 0; } } i = GetTabFromHWND(dat, mdat->hwnd); if (i>=0) { TCITEM tci; tci.mask = TCIF_IMAGE; tci.iImage = icoIdx; TabCtrl_SetItem(dat->hwndTabs, i, &tci); } } } break; } case DM_UPDATESTATUSBAR: break; case DM_SWITCHSTATUSBAR: dat->flags ^= SMF_SHOWSTATUSBAR; if (!(dat->flags & SMF_SHOWSTATUSBAR)) { ShowWindow(dat->hwndStatus, SW_HIDE); } else { ShowWindow(dat->hwndStatus, SW_SHOW); } SendMessage(hwndDlg, WM_SIZE, 0, 0); break; case DM_SWITCHTOOLBAR: { int i; dat->flags ^= SMF_SHOWBTNS; for (i=0;i<dat->childrenCount;i++) { SendMessage(dat->children[i], DM_SWITCHTOOLBAR, 0, 0); } SendMessage(hwndDlg, WM_SIZE, 0, 0); } break; case DM_SWITCHTITLEBAR: { RECT rc; dat->flags ^= SMF_SHOWTITLEBAR; ws = GetWindowLong(hwndDlg, GWL_STYLE) & ~(WS_CAPTION); if (dat->flags & SMF_SHOWTITLEBAR) { ws |= WS_CAPTION; } SetWindowLong(hwndDlg, GWL_STYLE, ws); GetWindowRect(hwndDlg, &rc); SetWindowPos(hwndDlg, 0, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOSENDCHANGING); // SendMessage(hwndDlg, WM_SIZE, 0, 0); RedrawWindow(hwndDlg, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); } break; case DM_CASCADENEWWINDOW: if ((HWND) wParam == hwndDlg) break; { RECT rcThis, rcNew; GetWindowRect(hwndDlg, &rcThis); GetWindowRect((HWND) wParam, &rcNew); if (abs(rcThis.left - rcNew.left) < 3 && abs(rcThis.top - rcNew.top) < 3) { int offset = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); SetWindowPos((HWND) wParam, 0, rcNew.left + offset, rcNew.top + offset, 0, 0, SWP_NOZORDER | SWP_NOSIZE); *(int *) lParam = 1; } } break; //case DM_MESSAGESENDING: // dat->messagesInProgress += wParam ? -1 : 1; // if (dat->messagesInProgress < 0) dat->messagesInProgress = 0; // break; } return FALSE; }
LRESULT WinWindow::WndProc(UINT message, WPARAM wParam, LPARAM lParam) { SetFocus(mWindowHandle); switch (message) { case WM_PAINT: { PAINTSTRUCT ps; BeginPaint(mWindowHandle, &ps); EndPaint(mWindowHandle, &ps); } break; case WM_DESTROY: //DestroyWindow(hWnd); PostQuitMessage(0); break; case WM_LBUTTONDOWN: if (MK_LBUTTON == wParam) { SetCapture(mWindowHandle); short xi = Math::ClampAboveZero((short)LOWORD(lParam)); short yi = Math::ClampAboveZero((short)HIWORD(lParam)); float x = Math::Clamp((float)xi, 0.f, mSize.Width); float y = mSize.Height - Math::Clamp((float)yi, 0.f, mSize.Height); double timeStamp = Application::Instance().TimeStamp(); Touch touch(TouchPhase::Began, 0, timeStamp, mpp(x, y), Point2F::Zero); TouchEventArg e(TouchPhase::Began, touch); InputManager::Instance().TouchesBegan(e); mPrevMouseTouch = touch; } break; case WM_MOUSEMOVE: if (MK_LBUTTON == wParam) { short xi = Math::ClampAboveZero((short)LOWORD(lParam)); short yi = Math::ClampAboveZero((short)HIWORD(lParam)); float x = Math::Clamp((float)xi, 0.f, mSize.Width); float y = mSize.Height - Math::Clamp((float)yi, 0.f, mSize.Height); double timeStamp = Application::Instance().TimeStamp(); Touch touch(TouchPhase::Moved, 0, timeStamp, mpp(x, y), mPrevMouseTouch.Pos); TouchEventArg e(TouchPhase::Moved, touch); InputManager::Instance().TouchesMoved(e); mPrevMouseTouch = touch; } else { short xi = Math::ClampAboveZero((short)LOWORD(lParam)); short yi = Math::ClampAboveZero((short)HIWORD(lParam)); float x = Math::Clamp((float)xi, 0.f, mSize.Width); float y = mSize.Height - Math::Clamp((float)yi, 0.f, mSize.Height); ApplicationStatics::Instance().SetDebugTouch(mpp(x, y)); } break; case WM_LBUTTONUP: { short xi = Math::ClampAboveZero((short)LOWORD(lParam)); short yi = Math::ClampAboveZero((short)HIWORD(lParam)); float x = Math::Clamp((float)xi, 0.f, mSize.Width); float y = mSize.Height - Math::Clamp((float)yi, 0.f, mSize.Height); double timeStamp = Application::Instance().TimeStamp(); Touch touch(TouchPhase::Ended, 0, timeStamp, mpp(x, y), mPrevMouseTouch.Pos); TouchEventArg e(TouchPhase::Ended, touch); InputManager::Instance().TouchesEnded(e); ReleaseCapture(); mPrevMouseTouch = Touch::Zero; } break; case WM_TOUCH: { unsigned int numInputs = (unsigned int)wParam; TOUCHINPUT* ti = new TOUCHINPUT[numInputs]; if (GetTouchInputInfo((HTOUCHINPUT)lParam, numInputs, ti, sizeof(TOUCHINPUT))) { // Handle each contact point for (unsigned int i = 0; i < numInputs; ++i) { /* handle ti[i] */ } } CloseTouchInputHandle((HTOUCHINPUT)lParam); delete[] ti; } break; case WM_GESTURE: { GESTUREINFO gi; ZeroMemory(&gi, sizeof(GESTUREINFO)); gi.cbSize = sizeof(gi); BOOL bResult = GetGestureInfo((HGESTUREINFO)lParam, &gi); bool isHandled = false; if (bResult) { switch (gi.dwID) { case GID_BEGIN: break; case GID_END: break; case GID_ZOOM: // Code for zooming goes here isHandled = true; break; case GID_PAN: // Code for panning goes here isHandled = true; break; case GID_ROTATE: // Code for rotation goes here isHandled = true; break; case GID_TWOFINGERTAP: // Code for two-finger tap goes here isHandled = true; break; case GID_PRESSANDTAP: // Code for roll over goes here isHandled = true; break; default: // A gesture was not recognized break; } } else { DWORD dwErr = GetLastError(); if (dwErr > 0) { MessageBoxW(mWindowHandle, L"Error!", L"Could not retrieve a GESTUREINFO structure.", MB_OK); } } CloseGestureInfoHandle((HGESTUREINFO)lParam); if (isHandled) { return 0; } else { return DefWindowProc(mWindowHandle, message, wParam, lParam); } } break; case WM_SIZE: switch (wParam) { case SIZE_RESTORED: case SIZE_MAXIMIZED: { Size2F newSize; newSize.Width = (float)LOWORD(lParam); newSize.Height = (float)HIWORD(lParam); OnResize(newSize); Application::Instance().Wakeup(); Application::Instance().Resume(); } break; case SIZE_MINIMIZED: Application::Instance().Pause(); Application::Instance().Sleep(); break; } break; case WM_KEYDOWN: { KeyDownEventArg e((uint)wParam, (uint)lParam); InputManager::Instance().KeyDown(e); } break; case WM_KEYUP: { KeyUpEventArg e((uint)wParam, (uint)lParam); InputManager::Instance().KeyUp(e); } break; case WM_CHAR: { CharInputEventArg e((uint)wParam, (uint)lParam); InputManager::Instance().CharInput(e); } break; case WM_MOUSEWHEEL: { short scrollPos = (short)HIWORD(wParam); short key = (short)LOWORD(wParam); ScrollEventArg e(scrollPos, key); InputManager::Instance().Scroll(e); } break; default: return DefWindowProc(mWindowHandle, message, wParam, lParam); } return 0; }
BOOL CALLBACK TabCtrlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { struct TabCtrlData *dat; dat = (struct TabCtrlData *) GetWindowLong(hwnd, GWL_USERDATA); switch(msg) { case WM_MBUTTONDOWN: { TCITEM tci; int tabId; struct MessageWindowData *mwd; TCHITTESTINFO thinfo; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; tabId = TabCtrl_HitTest(hwnd, &thinfo); if (tabId >= 0) { tci.mask = TCIF_PARAM; TabCtrl_GetItem(hwnd, tabId, &tci); mwd = (struct MessageWindowData *) tci.lParam; if (mwd != NULL) { SendMessage(mwd->hwnd, WM_CLOSE, 0, 0); } } return TRUE; } case WM_LBUTTONDBLCLK: { TCHITTESTINFO thinfo; int tabId; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; tabId = TabCtrl_HitTest(hwnd, &thinfo); if (tabId >=0 ) { void * clickChild = GetChildFromTab(hwnd, tabId)->hwnd; if (clickChild == dat->lastClickChild) { SendMessage(clickChild, WM_CLOSE, 0, 0); } } dat->lastClickChild = NULL; } break; case WM_LBUTTONDOWN: { if (!dat->bDragging) { TCHITTESTINFO thinfo; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; dat->srcTab = dat->destTab = TabCtrl_HitTest(hwnd, &thinfo); if (dat->srcTab >=0 ) { dat->lastClickChild = GetChildFromTab(hwnd, dat->srcTab)->hwnd; } else { dat->lastClickChild = NULL; } dat->bDragging = TRUE; dat->bDragged = FALSE; dat->mouseLBDownPos.x = thinfo.pt.x; dat->mouseLBDownPos.y = thinfo.pt.y; SetCapture(hwnd); return 0; } } break; case WM_CAPTURECHANGED: case WM_LBUTTONUP: if (dat->bDragging) { TCHITTESTINFO thinfo; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; if (dat->bDragged) { ImageList_DragLeave(GetDesktopWindow()); ImageList_EndDrag(); ImageList_Destroy(dat->hDragImageList); SetCursor(LoadCursor(NULL, IDC_ARROW)); dat->destTab = TabCtrl_HitTest(hwnd, &thinfo); if (thinfo.flags != TCHT_NOWHERE && dat->destTab != dat->srcTab) { NMHDR nmh; TCHAR sBuffer[501]; TCITEM item; int curSel; curSel = TabCtrl_GetCurSel(hwnd); item.mask = TCIF_IMAGE | TCIF_PARAM | TCIF_TEXT; item.pszText = sBuffer; item.cchTextMax = sizeof(sBuffer)/sizeof(TCHAR); TabCtrl_GetItem(hwnd, dat->srcTab, &item); sBuffer[sizeof(sBuffer)/sizeof(TCHAR)-1] = '\0'; if (curSel == dat->srcTab) { curSel = dat->destTab; } else { if (curSel > dat->srcTab && curSel <= dat->destTab) { curSel--; } else if (curSel < dat->srcTab && curSel >= dat->destTab) { curSel++; } } TabCtrl_DeleteItem(hwnd, dat->srcTab); TabCtrl_InsertItem(hwnd, dat->destTab, &item ); TabCtrl_SetCurSel(hwnd, curSel); nmh.hwndFrom = hwnd; nmh.idFrom = GetDlgCtrlID(hwnd); nmh.code = TCN_SELCHANGE; SendMessage(GetParent(hwnd), WM_NOTIFY, nmh.idFrom, (LPARAM)&nmh); UpdateWindow(hwnd); } } else { SendMessage(hwnd, WM_LBUTTONDOWN, wParam, lParam); } dat->bDragged = FALSE; dat->bDragging = FALSE; ReleaseCapture(); }
static void guiOnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags) { ReleaseCapture(); gui.mode &= ~(MODE_HDIVIDE|MODE_VDIVIDE); }
/* * Function CHyperLink::_HyperlinkProc * * Note: Processed messages are not passed back to the static control * procedure. It does work fine but be aware that it could cause * some problems if the static control is already subclassed. * Consider the example where the static control would be already * subclassed with the ToolTip control that needs to process mouse * messages. In that situation, the ToolTip control would not work * as expected. */ LRESULT CALLBACK CHyperLink::_HyperlinkProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { CHyperLink *pHyperLink = (CHyperLink *)GetProp(hwnd, PROP_OBJECT_PTR); switch (message) { case WM_MOUSEMOVE: { if ( pHyperLink->m_bOverControl ) { // This is the most common case for static branch prediction // optimization RECT rect; GetClientRect(hwnd,&rect); POINT pt = { LOWORD(lParam), HIWORD(lParam) }; if (!PTINRECT(&rect,pt)) { ReleaseCapture(); } } else { pHyperLink->m_bOverControl = TRUE; SendMessage(hwnd, WM_SETFONT, (WPARAM)CHyperLink::g_UnderlineFont, FALSE); InvalidateRect(hwnd, NULL, FALSE); pHyperLink->OnSelect(); SetCapture(hwnd); } return 0; } case WM_SETCURSOR: { SetCursor(CHyperLink::g_hLinkCursor); return TRUE; } case WM_CAPTURECHANGED: { pHyperLink->m_bOverControl = FALSE; pHyperLink->OnDeselect(); SendMessage(hwnd, WM_SETFONT, (WPARAM)pHyperLink->m_StdFont, FALSE); InvalidateRect(hwnd, NULL, FALSE); return 0; } case WM_KEYUP: { if( wParam != VK_SPACE ) { break; } } // Fall through case WM_LBUTTONUP: { pHyperLink->Navigate(); return 0; } case WM_SETFOCUS: // Fall through case WM_KILLFOCUS: { if( message == WM_SETFOCUS ) { pHyperLink->OnSelect(); } else // WM_KILLFOCUS { pHyperLink->OnDeselect(); } CHyperLink::DrawFocusRect(hwnd); return 0; } case WM_DESTROY: { SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) pHyperLink->m_pfnOrigCtlProc); SendMessage(hwnd, WM_SETFONT, (WPARAM) pHyperLink->m_StdFont, 0); if( --CHyperLink::g_counter <= 0 ) { destroyGlobalResources(); } RemoveProp(hwnd, PROP_OBJECT_PTR); break; } } return CallWindowProc(pHyperLink->m_pfnOrigCtlProc, hwnd, message, wParam, lParam); }