1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_ 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_WIN_SCOPED_GDI_OBJECT_H_ 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <windows.h> 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 10cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/scoped_generic.h" 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace win { 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 15cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkonamespace internal { 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 17cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkotemplate <class T> 18cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostruct ScopedGDIObjectTraits { 19cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko static T InvalidValue() { return nullptr; } 20cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko static void Free(T object) { DeleteObject(object); } 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// An explicit specialization for HICON because we have to call DestroyIcon() 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// instead of DeleteObject() for HICON. 25cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkotemplate <> 26cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkovoid inline ScopedGDIObjectTraits<HICON>::Free(HICON icon) { 27cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko DestroyIcon(icon); 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 30cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko} // namespace internal 31cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 32cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko// Like ScopedHandle but for GDI objects. 33cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkotemplate <class T> 34cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkousing ScopedGDIObject = ScopedGeneric<T, internal::ScopedGDIObjectTraits<T>>; 35cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Typedefs for some common use cases. 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef ScopedGDIObject<HBITMAP> ScopedBitmap; 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef ScopedGDIObject<HRGN> ScopedRegion; 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef ScopedGDIObject<HFONT> ScopedHFONT; 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef ScopedGDIObject<HICON> ScopedHICON; 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace win 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // BASE_WIN_SCOPED_GDI_OBJECT_H_ 46