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 13namespace base { 14namespace win { 15 16// Like ScopedHandle but for GDI objects. 17template<class T> 18class 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. 62template<> 63void inline ScopedGDIObject<HICON>::Close() { 64 if (object_) 65 DestroyIcon(object_); 66} 67 68// Typedefs for some common use cases. 69typedef ScopedGDIObject<HBITMAP> ScopedBitmap; 70typedef ScopedGDIObject<HRGN> ScopedRegion; 71typedef ScopedGDIObject<HFONT> ScopedHFONT; 72typedef ScopedGDIObject<HICON> ScopedHICON; 73 74} // namespace win 75} // namespace base 76 77#endif // BASE_WIN_SCOPED_GDI_OBJECT_H_ 78