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