最近在做一個功能,要使用GDI進行簡單繪圖。
首先GDI是什么?
英文為:GraphicsDeviceInterface
GDI是Graphics Device Interface的縮寫,含義是圖形設備接口,它的主要任務是負責系統與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。
在Windows操作系統下,絕大多數具備圖形界面的應用程序都離不開GDI,我們利用GDI所提供的眾多函數就可以方便的在屏幕、打印機及其它輸出設備上輸出圖形,文本等操作。
如果希望在圖形輸出設備上繪圖,必須首先獲取設備環境(即DC)的句柄。
那么DC又是什么?
HDC設備上下文是一種包含有關某個設備(如顯示器或打印機)的繪制屬性信息的 Windows 數據結構。所有繪制調用都通過設備上下文對象進行,這些對象封裝了用于繪制線條、形狀和文本的 Windows API。
那么接下來重要的工作就是如何獲得設備環境呢?
獲取設備環境句柄,我只說在工作中遇到的問題。
第一種方法就是我首先想到的使用BeginPaint和EndPaint函數,
代碼是這樣的:
~~~
HDC hdc;
hdc = BeginPaint(hwnd, &ps);
// ...
EndPaint(hwnd, &ps);
~~~
這時候就遇到坑兒了,完全是能力不足引發的坑兒。
因為只知道BeginPaint和EndPaint可以獲得設備環境句柄,但是忽略了使用的場合。
千萬記住了只能在WM_PAINT消息中才可以使用BeginPaint和EndPaint,更可怕的是在其他條件下使用BeginPaint和EndPaint編譯器完全不會報錯,只是達不到自己想要的結果而已。
那么對于非WM_PAINT消息我們可以這么辦:
~~~
HDC hdc;
hdc = GetDC(hwnd);
//....
ReleaseDC(hwnd, hdc);
~~~
上述代碼解決了我的問題。
windows程序設計 繼續!!!
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- string中的c_str()陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常