| Index: base/win/scoped_hdc.h
|
| ===================================================================
|
| --- base/win/scoped_hdc.h (revision 121842)
|
| +++ base/win/scoped_hdc.h (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| @@ -9,92 +9,70 @@
|
| #include <windows.h>
|
|
|
| #include "base/basictypes.h"
|
| -#include "base/compiler_specific.h"
|
| +#include "base/logging.h"
|
|
|
| namespace base {
|
| namespace win {
|
|
|
| -// The ScopedGetDC and ScopedCreateDC classes manage the default GDI objects
|
| -// that are initially selected into a DC. They help you avoid the following
|
| -// common mistake:
|
| -//
|
| -// HDC hdc = GetDC(NULL);
|
| -// SelectObject(hdc, new_bitmap);
|
| -// .. drawing code here ..
|
| -// ReleaseDC(hdc); <--- error: the DC has a custom object still selected!
|
| -//
|
| -// This code should be:
|
| -//
|
| -// HDC hdc = GetDC(NULL);
|
| -// HGDIOBJ old_obj = SelectObject(hdc, new_bitmap);
|
| -// .. drawing code here ..
|
| -// SelectObject(hdc, old_obj);
|
| -// ReleaseDC(hdc); <--- ok to release now.
|
| -//
|
| -// But why work so hard? Use our handy classes:
|
| -//
|
| -// ScopedGetDC dc(NULL);
|
| -// dc.SelectBitmap(hdc, new_bitmap);
|
| -// .. drawing here
|
| -// .. when dc goes out of scope it will select the original object before
|
| -// .. being released.
|
| -//
|
| -class ScopedDC {
|
| +// Like ScopedHandle but for HDC. Only use this on HDCs returned from
|
| +// GetDC.
|
| +class ScopedGetDC {
|
| public:
|
| - virtual ~ScopedDC();
|
| + explicit ScopedGetDC(HWND hwnd)
|
| + : hwnd_(hwnd),
|
| + hdc_(GetDC(hwnd)) {
|
| + DCHECK(!hwnd_ || IsWindow(hwnd_));
|
| + DCHECK(hdc_);
|
| + }
|
|
|
| - virtual void DisposeDC(HDC hdc) = 0;
|
| + ~ScopedGetDC() {
|
| + if (hdc_)
|
| + ReleaseDC(hwnd_, hdc_);
|
| + }
|
|
|
| - HDC get() { return hdc_; }
|
| + operator HDC() { return hdc_; }
|
|
|
| - void SelectBitmap(HBITMAP bitmap);
|
| - void SelectFont(HFONT font);
|
| - void SelectBrush(HBRUSH brush);
|
| - void SelectPen(HPEN pen);
|
| - void SelectRegion(HRGN region);
|
| -
|
| - protected:
|
| - ScopedDC(HDC hdc);
|
| - void Close();
|
| - void Reset(HDC hdc);
|
| -
|
| private:
|
| - void ResetObjects();
|
| - void Select(HGDIOBJ object, HGDIOBJ* holder);
|
| -
|
| + HWND hwnd_;
|
| HDC hdc_;
|
| - HGDIOBJ bitmap_;
|
| - HGDIOBJ font_;
|
| - HGDIOBJ brush_;
|
| - HGDIOBJ pen_;
|
| - HGDIOBJ region_;
|
| -};
|
|
|
| -// Creates and manages an HDC obtained by GetDC.
|
| -class ScopedGetDC : public ScopedDC {
|
| - public:
|
| - explicit ScopedGetDC(HWND hwnd);
|
| - virtual ~ScopedGetDC();
|
| -
|
| - private:
|
| - virtual void DisposeDC(HDC hdc) OVERRIDE;
|
| -
|
| - HWND hwnd_;
|
| DISALLOW_COPY_AND_ASSIGN(ScopedGetDC);
|
| };
|
|
|
| // Like ScopedHandle but for HDC. Only use this on HDCs returned from
|
| // CreateCompatibleDC, CreateDC and CreateIC.
|
| -class ScopedCreateDC : public ScopedDC {
|
| +class ScopedCreateDC {
|
| public:
|
| - ScopedCreateDC();
|
| - explicit ScopedCreateDC(HDC hdc);
|
| - virtual ~ScopedCreateDC();
|
| - void Set(HDC hdc);
|
| + ScopedCreateDC() : hdc_(NULL) { }
|
| + explicit ScopedCreateDC(HDC h) : hdc_(h) { }
|
|
|
| + ~ScopedCreateDC() {
|
| + Close();
|
| + }
|
| +
|
| + HDC Get() {
|
| + return hdc_;
|
| + }
|
| +
|
| + void Set(HDC h) {
|
| + Close();
|
| + hdc_ = h;
|
| + }
|
| +
|
| + operator HDC() { return hdc_; }
|
| +
|
| private:
|
| - virtual void DisposeDC(HDC hdc) OVERRIDE;
|
| + void Close() {
|
| +#ifdef NOGDI
|
| + assert(false);
|
| +#else
|
| + if (hdc_)
|
| + DeleteDC(hdc_);
|
| +#endif // NOGDI
|
| + }
|
|
|
| + HDC hdc_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(ScopedCreateDC);
|
| };
|
|
|
|
|