Added Snap-to-Screen Edge feature in the case of multiple monitors (patch by Adi Shavit)
This commit is contained in:
parent
5f9e295adf
commit
00c30681bc
@ -54,6 +54,9 @@
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#define COMPILE_MULTIMON_STUBS // Required for multi-monitor support
|
||||
#include <multimon.h>
|
||||
|
||||
#ifdef HAVE_OPENGL
|
||||
#include <memory>
|
||||
#include <algorithm>
|
||||
@ -1065,7 +1068,7 @@ CV_IMPL int cvNamedWindow( const char* name, int flags )
|
||||
icvSetWindowLongPtr( hWnd, CV_USERDATA, window );
|
||||
icvSetWindowLongPtr( mainhWnd, CV_USERDATA, window );
|
||||
|
||||
// Recalculate window position
|
||||
// Recalculate window pos
|
||||
icvUpdateWindowPos( window );
|
||||
|
||||
result = 1;
|
||||
@ -1633,7 +1636,7 @@ MainWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
WINDOWPOS* pos = (WINDOWPOS*)lParam;
|
||||
|
||||
// Update the toolbar position/size
|
||||
// Update the toolbar pos/size
|
||||
if(window->toolbar.toolbar)
|
||||
{
|
||||
RECT rect;
|
||||
@ -1647,6 +1650,36 @@ MainWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
||||
break;
|
||||
}
|
||||
|
||||
case WM_WINDOWPOSCHANGING:
|
||||
{
|
||||
// Snap window to screen edges with multi-monitor support. // Adi Shavit
|
||||
LPWINDOWPOS pos = (LPWINDOWPOS)lParam;
|
||||
|
||||
RECT rect;
|
||||
GetWindowRect(window->frame, &rect);
|
||||
|
||||
HMONITOR hMonitor;
|
||||
hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST);
|
||||
|
||||
MONITORINFO mi;
|
||||
mi.cbSize = sizeof(mi);
|
||||
GetMonitorInfo(hMonitor, &mi);
|
||||
|
||||
const int SNAP_DISTANCE = 15;
|
||||
|
||||
if (abs(pos->x - mi.rcMonitor.left) <= SNAP_DISTANCE)
|
||||
pos->x = mi.rcMonitor.left; // snap to left edge
|
||||
else
|
||||
if (abs(pos->x + pos->cx - mi.rcMonitor.right) <= SNAP_DISTANCE)
|
||||
pos->x = mi.rcMonitor.right - pos->cx; // snap to right edge
|
||||
|
||||
if (abs(pos->y - mi.rcMonitor.top) <= SNAP_DISTANCE)
|
||||
pos->y = mi.rcMonitor.top; // snap to top edge
|
||||
else
|
||||
if (abs(pos->y + pos->cy - mi.rcMonitor.bottom) <= SNAP_DISTANCE)
|
||||
pos->y = mi.rcMonitor.bottom - pos->cy; // snap to bottom edge
|
||||
}
|
||||
|
||||
case WM_ACTIVATE:
|
||||
if(LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE)
|
||||
SetFocus(window->hwnd);
|
||||
@ -2199,7 +2232,7 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name,
|
||||
SendMessage(window->toolbar.toolbar, TB_SETBUTTONINFO,
|
||||
(WPARAM)tbs.idCommand, (LPARAM)&tbis);
|
||||
|
||||
/* Get button position */
|
||||
/* Get button pos */
|
||||
SendMessage(window->toolbar.toolbar, TB_GETITEMRECT,
|
||||
(WPARAM)tbs.idCommand, (LPARAM)&rect);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user