1 // Copyright (c) 2012 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_HDC_H_ 6 #define BASE_WIN_SCOPED_HDC_H_ 7 8 #include <windows.h> 9 10 #include "base/basictypes.h" 11 #include "base/logging.h" 12 #include "base/win/scoped_handle.h" 13 14 namespace base { 15 namespace win { 16 17 // Like ScopedHandle but for HDC. Only use this on HDCs returned from 18 // GetDC. 19 class ScopedGetDC { 20 public: ScopedGetDC(HWND hwnd)21 explicit ScopedGetDC(HWND hwnd) 22 : hwnd_(hwnd), 23 hdc_(GetDC(hwnd)) { 24 if (hwnd_) { 25 DCHECK(IsWindow(hwnd_)); 26 DCHECK(hdc_); 27 } else { 28 // If GetDC(NULL) returns NULL, something really bad has happened, like 29 // GDI handle exhaustion. In this case Chrome is going to behave badly no 30 // matter what, so we may as well just force a crash now. 31 CHECK(hdc_); 32 } 33 } 34 ~ScopedGetDC()35 ~ScopedGetDC() { 36 if (hdc_) 37 ReleaseDC(hwnd_, hdc_); 38 } 39 HDC()40 operator HDC() { return hdc_; } 41 42 private: 43 HWND hwnd_; 44 HDC hdc_; 45 46 DISALLOW_COPY_AND_ASSIGN(ScopedGetDC); 47 }; 48 49 // Like ScopedHandle but for HDC. Only use this on HDCs returned from 50 // CreateCompatibleDC, CreateDC and CreateIC. 51 class CreateDCTraits { 52 public: 53 typedef HDC Handle; 54 CloseHandle(HDC handle)55 static bool CloseHandle(HDC handle) { 56 return ::DeleteDC(handle) != FALSE; 57 } 58 IsHandleValid(HDC handle)59 static bool IsHandleValid(HDC handle) { 60 return handle != NULL; 61 } 62 NullHandle()63 static HDC NullHandle() { 64 return NULL; 65 } 66 67 private: 68 DISALLOW_IMPLICIT_CONSTRUCTORS(CreateDCTraits); 69 }; 70 71 typedef GenericScopedHandle<CreateDCTraits, VerifierTraits> ScopedCreateDC; 72 73 } // namespace win 74 } // namespace base 75 76 #endif // BASE_WIN_SCOPED_HDC_H_ 77