scoped_gdi_object.h revision 731df977c0511bca2206b5f333555b1205ff1f43
1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_
6#define BASE_WIN_SCOPED_GDI_OBJECT_H_
7#pragma once
8
9#include <windows.h>
10
11#include "base/basictypes.h"
12#include "base/logging.h"
13
14namespace base {
15namespace win {
16
17// Like ScopedHandle but for GDI objects.
18template<class T>
19class ScopedGDIObject {
20 public:
21  ScopedGDIObject() : object_(NULL) {}
22  explicit ScopedGDIObject(T object) : object_(object) {}
23
24  ~ScopedGDIObject() {
25    Close();
26  }
27
28  T Get() {
29    return object_;
30  }
31
32  void Set(T object) {
33    if (object_ && object != object_)
34      Close();
35    object_ = object;
36  }
37
38  ScopedGDIObject& operator=(T object) {
39    Set(object);
40    return *this;
41  }
42
43  T release() {
44    T object = object_;
45    object_ = NULL;
46    return object;
47  }
48
49  operator T() { return object_; }
50
51 private:
52  void Close() {
53    if (object_)
54      DeleteObject(object_);
55  }
56
57  T object_;
58  DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject);
59};
60
61// An explicit specialization for HICON because we have to call DestroyIcon()
62// instead of DeleteObject() for HICON.
63template<>
64void ScopedGDIObject<HICON>::Close() {
65  if (object_)
66    DestroyIcon(object_);
67}
68
69// Typedefs for some common use cases.
70typedef ScopedGDIObject<HBITMAP> ScopedBitmap;
71typedef ScopedGDIObject<HRGN> ScopedRegion;
72typedef ScopedGDIObject<HFONT> ScopedHFONT;
73typedef ScopedGDIObject<HICON> ScopedHICON;
74
75}  // namespace win
76}  // namespace base
77
78#endif  // BASE_WIN_SCOPED_GDI_OBJECT_H_
79