Home | History | Annotate | Download | only in win
      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:
     20   ScopedGDIObject() : object_(NULL) {}
     21   explicit ScopedGDIObject(T object) : object_(object) {}
     22 
     23   ~ScopedGDIObject() {
     24     Close();
     25   }
     26 
     27   T Get() {
     28     return object_;
     29   }
     30 
     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 
     42   T release() {
     43     T object = object_;
     44     object_ = NULL;
     45     return object;
     46   }
     47 
     48   operator T() { return object_; }
     49 
     50  private:
     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<>
     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