mirror of
https://github.com/opencv/opencv.git
synced 2025-01-18 14:13:15 +08:00
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 <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
#define COMPILE_MULTIMON_STUBS // Required for multi-monitor support
|
||||||
|
#include <multimon.h>
|
||||||
|
|
||||||
#ifdef HAVE_OPENGL
|
#ifdef HAVE_OPENGL
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -1065,7 +1068,7 @@ CV_IMPL int cvNamedWindow( const char* name, int flags )
|
|||||||
icvSetWindowLongPtr( hWnd, CV_USERDATA, window );
|
icvSetWindowLongPtr( hWnd, CV_USERDATA, window );
|
||||||
icvSetWindowLongPtr( mainhWnd, CV_USERDATA, window );
|
icvSetWindowLongPtr( mainhWnd, CV_USERDATA, window );
|
||||||
|
|
||||||
// Recalculate window position
|
// Recalculate window pos
|
||||||
icvUpdateWindowPos( window );
|
icvUpdateWindowPos( window );
|
||||||
|
|
||||||
result = 1;
|
result = 1;
|
||||||
@ -1633,7 +1636,7 @@ MainWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|||||||
{
|
{
|
||||||
WINDOWPOS* pos = (WINDOWPOS*)lParam;
|
WINDOWPOS* pos = (WINDOWPOS*)lParam;
|
||||||
|
|
||||||
// Update the toolbar position/size
|
// Update the toolbar pos/size
|
||||||
if(window->toolbar.toolbar)
|
if(window->toolbar.toolbar)
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
@ -1647,6 +1650,36 @@ MainWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|||||||
break;
|
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:
|
case WM_ACTIVATE:
|
||||||
if(LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE)
|
if(LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE)
|
||||||
SetFocus(window->hwnd);
|
SetFocus(window->hwnd);
|
||||||
@ -2199,7 +2232,7 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name,
|
|||||||
SendMessage(window->toolbar.toolbar, TB_SETBUTTONINFO,
|
SendMessage(window->toolbar.toolbar, TB_SETBUTTONINFO,
|
||||||
(WPARAM)tbs.idCommand, (LPARAM)&tbis);
|
(WPARAM)tbs.idCommand, (LPARAM)&tbis);
|
||||||
|
|
||||||
/* Get button position */
|
/* Get button pos */
|
||||||
SendMessage(window->toolbar.toolbar, TB_GETITEMRECT,
|
SendMessage(window->toolbar.toolbar, TB_GETITEMRECT,
|
||||||
(WPARAM)tbs.idCommand, (LPARAM)&rect);
|
(WPARAM)tbs.idCommand, (LPARAM)&rect);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user