78 lines
1.5 KiB
C++
78 lines
1.5 KiB
C++
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_
|
|
#define BASE_WIN_SCOPED_GDI_OBJECT_H_
|
|
|
|
#include <windows.h>
|
|
|
|
#include "base/basictypes.h"
|
|
#include "base/logging.h"
|
|
|
|
namespace base {
|
|
namespace win {
|
|
|
|
// Like ScopedHandle but for GDI objects.
|
|
template<class T>
|
|
class ScopedGDIObject {
|
|
public:
|
|
ScopedGDIObject() : object_(NULL) {}
|
|
explicit ScopedGDIObject(T object) : object_(object) {}
|
|
|
|
~ScopedGDIObject() {
|
|
Close();
|
|
}
|
|
|
|
T Get() {
|
|
return object_;
|
|
}
|
|
|
|
void Set(T object) {
|
|
if (object_ && object != object_)
|
|
Close();
|
|
object_ = object;
|
|
}
|
|
|
|
ScopedGDIObject& operator=(T object) {
|
|
Set(object);
|
|
return *this;
|
|
}
|
|
|
|
T release() {
|
|
T object = object_;
|
|
object_ = NULL;
|
|
return object;
|
|
}
|
|
|
|
operator T() { return object_; }
|
|
|
|
private:
|
|
void Close() {
|
|
if (object_)
|
|
DeleteObject(object_);
|
|
}
|
|
|
|
T object_;
|
|
DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject);
|
|
};
|
|
|
|
// An explicit specialization for HICON because we have to call DestroyIcon()
|
|
// instead of DeleteObject() for HICON.
|
|
template<>
|
|
void ScopedGDIObject<HICON>::Close() {
|
|
if (object_)
|
|
DestroyIcon(object_);
|
|
}
|
|
|
|
// Typedefs for some common use cases.
|
|
typedef ScopedGDIObject<HBITMAP> ScopedBitmap;
|
|
typedef ScopedGDIObject<HRGN> ScopedRegion;
|
|
typedef ScopedGDIObject<HFONT> ScopedHFONT;
|
|
typedef ScopedGDIObject<HICON> ScopedHICON;
|
|
|
|
} // namespace win
|
|
} // namespace base
|
|
|
|
#endif // BASE_WIN_SCOPED_GDI_OBJECT_H_
|