| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #include "stdafx.h"
- #include "SnapWindow.h"
- SnapWindow::SnapWindow()
- {
- snap_ModifierKey = VK_SHIFT;
- NONCLIENTMETRICS ncm = { 0 };
- ncm.cbSize = sizeof ncm;
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
- snap_Margin = ncm.iCaptionHeight;
- snap_cur_pos.x = 0;
- snap_cur_pos.y = 0;
- snap_rcWindow.bottom = 0;
- snap_rcWindow.left = 0;
- snap_rcWindow.right = 0;
- snap_rcWindow.top = 0;
- snap_x = 0;
- snap_y = 0;
- }
- SnapWindow::~SnapWindow()
- {
- }
- BOOL SnapWindow::isSnapClose(int a, int b)
- {
- return (abs(a - b) < snap_Margin);
- }
- LRESULT SnapWindow::OnSnapEnterSizeMove(HWND hWnd)
- {
- snap_cur_pos.x = 0;
- snap_cur_pos.y = 0;
- snap_rcWindow.bottom = 0;
- snap_rcWindow.left = 0;
- snap_rcWindow.right = 0;
- snap_rcWindow.top = 0;
- GetWindowRect(hWnd, &snap_rcWindow);
- GetCursorPos(&snap_cur_pos);
- snap_x = snap_cur_pos.x - snap_rcWindow.left;
- snap_y = snap_cur_pos.y - snap_rcWindow.top;
- return 0;
- }
- LRESULT SnapWindow::OnSnapMoving(HWND hWnd, LPRECT snap_prc)
- {
- //no snap if shift key pressed
- if (GetAsyncKeyState(snap_ModifierKey) < 0)
- return FALSE;
-
- snap_cur_pos.x = 0;
- snap_cur_pos.y = 0;
- snap_rcWindow.bottom = 0;
- snap_rcWindow.left = 0;
- snap_rcWindow.right = 0;
- snap_rcWindow.top = 0;
- GetCursorPos(&snap_cur_pos);
- OffsetRect(snap_prc,
- snap_cur_pos.x - (snap_prc->left + snap_x),
- snap_cur_pos.y - (snap_prc->top + snap_y));
- //it may change during app lifetime
- SystemParametersInfo(SPI_GETWORKAREA, 0, &snap_wa, 0);
- MONITORINFO mi;
- HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
- mi.cbSize = sizeof(mi);
- GetMonitorInfo(hMonitor, &mi);
- snap_wa = mi.rcWork;
- if (isSnapClose(snap_prc->left, snap_wa.left))
- {
- OffsetRect(snap_prc, snap_wa.left - snap_prc->left, 0);
- }
- else
- {
- if (isSnapClose(snap_wa.right, snap_prc->right))
- {
- OffsetRect(snap_prc, snap_wa.right - snap_prc->right, 0);
- }
- }
- if (isSnapClose(snap_prc->top, snap_wa.top))
- {
- OffsetRect(snap_prc, 0, snap_wa.top - snap_prc->top);
- }
- else
- {
- if (isSnapClose(snap_wa.bottom, snap_prc->bottom))
- {
- OffsetRect(snap_prc, 0, snap_wa.bottom - snap_prc->bottom);
- }
- }
- return TRUE;
- }
|