• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
8 #include <windows.h>
9 
10 #include "base/basictypes.h"
11 #include "base/logging.h"
12 
13 namespace base {
14 namespace win {
15 
16 // Like ScopedHandle but for GDI objects.
17 template<class T>
18 class ScopedGDIObject {
19  public:
ScopedGDIObject()20   ScopedGDIObject() : object_(NULL) {}
ScopedGDIObject(T object)21   explicit ScopedGDIObject(T object) : object_(object) {}
22 
~ScopedGDIObject()23   ~ScopedGDIObject() {
24     Close();
25   }
26 
Get()27   T Get() {
28     return object_;
29   }
30 
Set(T object)31   void Set(T object) {
32     if (object_ && object != object_)
33       Close();
34     object_ = object;
35   }
36 
37   ScopedGDIObject& operator=(T object) {
38     Set(object);
39     return *this;
40   }
41 
release()42   T release() {
43     T object = object_;
44     object_ = NULL;
45     return object;
46   }
47 
T()48   operator T() { return object_; }
49 
50  private:
Close()51   void Close() {
52     if (object_)
53       DeleteObject(object_);
54   }
55 
56   T object_;
57   DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject);
58 };
59 
60 // An explicit specialization for HICON because we have to call DestroyIcon()
61 // instead of DeleteObject() for HICON.
62 template<>
Close()63 void inline ScopedGDIObject<HICON>::Close() {
64   if (object_)
65     DestroyIcon(object_);
66 }
67 
68 // Typedefs for some common use cases.
69 typedef ScopedGDIObject<HBITMAP> ScopedBitmap;
70 typedef ScopedGDIObject<HRGN> ScopedRegion;
71 typedef ScopedGDIObject<HFONT> ScopedHFONT;
72 typedef ScopedGDIObject<HICON> ScopedHICON;
73 
74 }  // namespace win
75 }  // namespace base
76 
77 #endif  // BASE_WIN_SCOPED_GDI_OBJECT_H_
78