From 994a3786b974a2c5b8dfce631193ae0031e7da3f Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 23 Feb 2002 21:32:45 +0000 Subject: [PATCH] implemented wxWindowDC and wxClientDC::GetSize() properly (fixes bug #503022) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14372 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/msw/dcclient.h | 6 ++++++ src/msw/dc.cpp | 26 ++++++++++++++++++++++++-- src/msw/dcclient.cpp | 14 ++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 36a00a6cc1..9d5f89ae37 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -123,6 +123,7 @@ wxMSW: - showing a dialog from EVT_RADIOBUTTON handler doesn't lead to an infinite recursion any more - wxTextCtrl with wxTE_RICH flag scrolls to the end when text is appended to it +- wxWindowDC and wxClientDC::GetSize() works correctly now wxGTK: diff --git a/include/wx/msw/dcclient.h b/include/wx/msw/dcclient.h index 0c2cca0585..ccf5927bf2 100644 --- a/include/wx/msw/dcclient.h +++ b/include/wx/msw/dcclient.h @@ -49,6 +49,9 @@ protected: // intiialize the newly created DC void InitDC(); + // override some base class virtuals + virtual void DoGetSize(int *width, int *height) const; + private: DECLARE_DYNAMIC_CLASS(wxWindowDC) }; @@ -67,6 +70,9 @@ public: protected: void InitDC(); + // override some base class virtuals + virtual void DoGetSize(int *width, int *height) const; + private: DECLARE_DYNAMIC_CLASS(wxClientDC) }; diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 0a75fced54..09d21ad3d0 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -1923,8 +1923,30 @@ void wxDC::DoGetSizeMM(int *w, int *h) const if (!GetHDC()) return; #endif - if ( w ) *w = ::GetDeviceCaps(GetHdc(), HORZSIZE); - if ( h ) *h = ::GetDeviceCaps(GetHdc(), VERTSIZE); + // if we implement it in terms of DoGetSize() instead of directly using the + // results returned by GetDeviceCaps(HORZ/VERTSIZE) as was done before, it + // will also work for wxWindowDC and wxClientDC even though their size is + // not the same as the total size of the screen + int wPixels, hPixels; + DoGetSize(&wPixels, &hPixels); + + if ( w ) + { + int wTotal = ::GetDeviceCaps(GetHdc(), HORZRES); + + wxCHECK_RET( wTotal, _T("0 width device?") ); + + *w = (wPixels * ::GetDeviceCaps(GetHdc(), HORZSIZE)) / wTotal; + } + + if ( h ) + { + int hTotal = ::GetDeviceCaps(GetHdc(), VERTRES); + + wxCHECK_RET( hTotal, _T("0 height device?") ); + + *h = (hPixels * ::GetDeviceCaps(GetHdc(), VERTSIZE)) / hTotal; + } } wxSize wxDC::GetPPI() const diff --git a/src/msw/dcclient.cpp b/src/msw/dcclient.cpp index 6d5df17f48..720398ea5d 100644 --- a/src/msw/dcclient.cpp +++ b/src/msw/dcclient.cpp @@ -120,6 +120,13 @@ void wxWindowDC::InitDC() #endif } +void wxWindowDC::DoGetSize(int *width, int *height) const +{ + wxCHECK_RET( m_canvas, _T("wxWindowDC without a window?") ); + + m_canvas->GetSize(width, height); +} + // ---------------------------------------------------------------------------- // wxClientDC // ---------------------------------------------------------------------------- @@ -165,6 +172,13 @@ wxClientDC::~wxClientDC() { } +void wxClientDC::DoGetSize(int *width, int *height) const +{ + wxCHECK_RET( m_canvas, _T("wxClientDC without a window?") ); + + m_canvas->GetClientSize(width, height); +} + // ---------------------------------------------------------------------------- // wxPaintDC // ---------------------------------------------------------------------------- -- 2.45.2