Add a templatized scoped GDI handle object. Use this to implement ScopedBitmap and ScopedHRGN.
Review URL: http://codereview.chromium.org/7275 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@3305 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
@ -133,61 +133,50 @@ class ScopedHDC {
|
|||||||
DISALLOW_EVIL_CONSTRUCTORS(ScopedHDC);
|
DISALLOW_EVIL_CONSTRUCTORS(ScopedHDC);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Like ScopedHandle but for HBITMAP.
|
// Like ScopedHandle but for GDI objects.
|
||||||
class ScopedBitmap {
|
template<class T>
|
||||||
|
class ScopedGDIObject {
|
||||||
public:
|
public:
|
||||||
ScopedBitmap() : hbitmap_(NULL) { }
|
ScopedGDIObject() : object_(NULL) {}
|
||||||
explicit ScopedBitmap(HBITMAP h) : hbitmap_(h) { }
|
explicit ScopedGDIObject(T object) : object_(object) {}
|
||||||
|
|
||||||
~ScopedBitmap() {
|
~ScopedGDIObject() {
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
HBITMAP Get() {
|
T Get() {
|
||||||
return hbitmap_;
|
return object_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Set(HBITMAP h) {
|
void Set(T object) {
|
||||||
Close();
|
if (object_ && object != object_)
|
||||||
hbitmap_ = h;
|
Close();
|
||||||
|
object_ = object;
|
||||||
}
|
}
|
||||||
|
|
||||||
operator HBITMAP() { return hbitmap_; }
|
ScopedGDIObject& operator=(T object) {
|
||||||
|
Set(object);
|
||||||
private:
|
|
||||||
void Close() {
|
|
||||||
if (hbitmap_)
|
|
||||||
DeleteObject(hbitmap_);
|
|
||||||
}
|
|
||||||
|
|
||||||
HBITMAP hbitmap_;
|
|
||||||
DISALLOW_EVIL_CONSTRUCTORS(ScopedBitmap);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Like ScopedHandle but for HRGN.
|
|
||||||
class ScopedHRGN {
|
|
||||||
public:
|
|
||||||
explicit ScopedHRGN(HRGN h) : hrgn_(h) { }
|
|
||||||
|
|
||||||
~ScopedHRGN() {
|
|
||||||
if (hrgn_)
|
|
||||||
DeleteObject(hrgn_);
|
|
||||||
}
|
|
||||||
|
|
||||||
operator HRGN() { return hrgn_; }
|
|
||||||
|
|
||||||
ScopedHRGN& operator=(HRGN hrgn) {
|
|
||||||
if (hrgn_ && hrgn != hrgn_)
|
|
||||||
DeleteObject(hrgn_);
|
|
||||||
hrgn_ = hrgn;
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
operator T() { return object_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
HRGN hrgn_;
|
void Close() {
|
||||||
DISALLOW_EVIL_CONSTRUCTORS(ScopedHRGN);
|
if (object_)
|
||||||
|
DeleteObject(object_);
|
||||||
|
}
|
||||||
|
|
||||||
|
T object_;
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Typedefs for some common use cases.
|
||||||
|
typedef ScopedGDIObject<HBITMAP> ScopedBitmap;
|
||||||
|
typedef ScopedGDIObject<HRGN> ScopedHRGN;
|
||||||
|
typedef ScopedGDIObject<HFONT> ScopedHFONT;
|
||||||
|
|
||||||
|
|
||||||
// Like ScopedHandle except for HGLOBAL.
|
// Like ScopedHandle except for HGLOBAL.
|
||||||
template<class T>
|
template<class T>
|
||||||
class ScopedHGlobal {
|
class ScopedHGlobal {
|
||||||
|
Reference in New Issue
Block a user