Skip to content

Commit ff59235

Browse files
committed
fixed #24 region rectangle not working as expected on machines which have the 2e monitor as main desktop.
1 parent 69da6dd commit ff59235

File tree

13 files changed

+53
-28
lines changed

13 files changed

+53
-28
lines changed

CamCapture/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ set(ANNOTATIONS_SOURCE
2424

2525
set(CAPTURE_SOURCE
2626
src/cam_capture.cpp
27+
src/cam_virtual_screen_info.cpp
2728
)
2829

2930
set(CAPTURE_INCLUDE
@@ -38,6 +39,7 @@ set(CAPTURE_INCLUDE
3839
include/CamCapture/cam_point.h
3940
include/CamCapture/cam_size.h
4041
include/CamCapture/cam_stop_watch.h
42+
include/CamCapture/cam_virtual_screen_info.h
4143
)
4244

4345
source_group(src FILES

CamCapture/include/CamCapture/cam_capture.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include "cam_rect.h"
2121
#include "cam_annotarion.h"
22+
#include "cam_virtual_screen_info.h"
2223

2324
#include <windows.h>
2425
#include <memory>
@@ -58,6 +59,7 @@ class cam_capture_source
5859

5960
protected:
6061
void _draw_annotations(const cam::rect<int> &capture_rect);
62+
auto _translate_from_virtual(const POINT &mouse_position) -> point<int>;
6163

6264
private:
6365
BITMAPINFO bitmap_info_;
@@ -66,6 +68,7 @@ class cam_capture_source
6668
HDC desktop_dc_;
6769
HDC memory_dc_;
6870
cam::rect<int> src_rect_;
71+
cam::virtual_screen_info virtual_screen_info_;
6972

7073
unsigned char *bitmap_data_{nullptr};
7174
cam_frame frame_;

CamCapture/include/CamCapture/cam_point.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,26 @@ class point
2828
{
2929
}
3030

31-
constexpr T x() const noexcept
31+
constexpr auto x() const noexcept -> T
3232
{
3333
return x_;
3434
}
3535

36-
constexpr T y() const noexcept
36+
constexpr void x(const T new_x) noexcept
37+
{
38+
x_ = new_x;
39+
}
40+
41+
constexpr auto y() const noexcept -> T
3742
{
3843
return y_;
3944
}
4045

46+
constexpr void y(const T new_y) noexcept
47+
{
48+
y_ = new_y;
49+
}
50+
4151
private:
4252
T x_{ static_cast<T>(0) };
4353
T y_{ static_cast<T>(0) };

CamStudioRecorder/virtual_screen_info.h renamed to CamCapture/include/CamCapture/cam_virtual_screen_info.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#include <CamCapture/cam_rect.h>
44

5+
namespace cam
6+
{
57
struct virtual_screen_info
68
{
79
// the virtual screen rect
@@ -13,3 +15,4 @@ struct virtual_screen_info
1315
};
1416

1517
virtual_screen_info get_virtual_screen_info();
18+
} // namespace cam

CamCapture/src/cam_capture.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,11 @@ cam_capture_source::cam_capture_source(HWND hwnd, const cam::rect<int> & /*view*
3939
, src_rect_()
4040
, annotations_()
4141
, stopwatch_(std::make_unique<cam::stop_watch>())
42+
, virtual_screen_info_(cam::get_virtual_screen_info())
4243
{
4344
if (hwnd == nullptr)
4445
{
45-
src_rect_.left_ = ::GetSystemMetrics(SM_XVIRTUALSCREEN);
46-
src_rect_.top_ = ::GetSystemMetrics(SM_YVIRTUALSCREEN);
47-
src_rect_.right_ = src_rect_.left_ + ::GetSystemMetrics(SM_CXVIRTUALSCREEN);
48-
src_rect_.bottom_ = src_rect_.top_ + ::GetSystemMetrics(SM_CYVIRTUALSCREEN);
46+
src_rect_ = virtual_screen_info_.size;
4947
}
5048
else
5149
{
@@ -137,12 +135,11 @@ void cam_capture_source::_draw_annotations(const cam::rect<int> &capture_rect)
137135
{
138136
POINT pt;
139137
::GetCursorPos(&pt);
138+
const auto mouse_point = _translate_from_virtual(pt);
140139

141140
Gdiplus::Graphics canvas(memory_dc_);
142141
canvas.SetSmoothingMode(Gdiplus::SmoothingMode::SmoothingModeAntiAlias);
143142

144-
point<int> mouse_point(pt.x, pt.y);
145-
146143
const auto mouse_event_count = mouse_hook::get().get_mouse_events_count();
147144
if (mouse_event_count > 0)
148145
{
@@ -184,3 +181,14 @@ void cam_capture_source::_draw_annotations(const cam::rect<int> &capture_rect)
184181
annotation->draw(canvas, draw_data);
185182
}
186183
}
184+
185+
auto cam_capture_source::_translate_from_virtual(const POINT &mouse_position) -> point<int>
186+
{
187+
// virtual dataspace can be negative, but the target dataspace is always positive.
188+
const auto screen_rect = virtual_screen_info_.size;
189+
auto result = point<int>(mouse_position.x, mouse_position.y);
190+
result.x(result.x() - screen_rect.left());
191+
result.y(result.y() - screen_rect.top());
192+
193+
return result;
194+
}

CamStudioRecorder/virtual_screen_info.cpp renamed to CamCapture/src/cam_virtual_screen_info.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
#include "stdafx.h"
2-
#include "virtual_screen_info.h"
1+
#include "cam_virtual_screen_info.h"
2+
#define WIN32_LEAN_AND_MEAN
33
#include <windows.h>
44

5+
namespace cam
6+
{
7+
58
virtual_screen_info get_virtual_screen_info()
69
{
710
virtual_screen_info result{};
@@ -20,4 +23,6 @@ virtual_screen_info get_virtual_screen_info()
2023
result.size = { min_x, min_y, min_x + max_x, min_y + max_y };
2124
result.monitor_count = monitor_count;
2225
return result;
23-
}
26+
}
27+
28+
} // namespace cam

CamStudioRecorder/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ set(RECORDER_NEW_SOURCE
5656
settings_model.h
5757
settings_model.cpp
5858
settings_table.h
59-
virtual_screen_info.cpp
60-
virtual_screen_info.h
6159
)
6260

6361
set(RECORDER_UTILITY_SOURCE

CamStudioRecorder/FixedRegionDlg.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
IMPLEMENT_DYNAMIC(CFixedRegionDlg, CDialog)
1818

19-
CFixedRegionDlg::CFixedRegionDlg(CWnd *pParent, virtual_screen_info screen_info, settings_model &settings)
19+
CFixedRegionDlg::CFixedRegionDlg(CWnd *pParent, cam::virtual_screen_info screen_info, settings_model &settings)
2020
: CDialog(CFixedRegionDlg::IDD, pParent)
2121
, capture_rect_(0, 0, 0, 0)
2222
, settings_(settings)
@@ -286,6 +286,3 @@ void CFixedRegionDlg::OnEnKillfocusHeight()
286286
set_window_text(height_text_edit_ctrl_, std::to_wstring(capture_rect_.height()));
287287
}
288288
}
289-
290-
291-

CamStudioRecorder/FixedRegionDlg.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "virtual_screen_info.h"
3+
#include <CamCapture/cam_virtual_screen_info.h>
44
#include <CamCapture/cam_rect.h>
55
#include <memory>
66

@@ -11,7 +11,7 @@ class CFixedRegionDlg : public CDialog
1111
{
1212
DECLARE_DYNAMIC(CFixedRegionDlg)
1313
public:
14-
explicit CFixedRegionDlg(CWnd *pParent, virtual_screen_info screen_info, settings_model &settings);
14+
explicit CFixedRegionDlg(CWnd *pParent, cam::virtual_screen_info screen_info, settings_model &settings);
1515

1616
enum
1717
{
@@ -35,7 +35,7 @@ class CFixedRegionDlg : public CDialog
3535
cam::rect<int> capture_rect_;
3636

3737
settings_model &settings_;
38-
virtual_screen_info screen_info_;
38+
cam::virtual_screen_info screen_info_;
3939

4040
std::unique_ptr<mouse_capture_ui> capture_;
4141

CamStudioRecorder/RecorderView.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ END_EVENTSINK_MAP()
108108
CRecorderView::CRecorderView()
109109
: CView()
110110
{
111-
virtual_screen_info_ = get_virtual_screen_info();
111+
virtual_screen_info_ = cam::get_virtual_screen_info();
112112
mouse_hook_ = std::make_unique<mouse_hook>();
113113

114114
video_settings_model_ = std::make_unique<video_settings_model>();

0 commit comments

Comments
 (0)