Windows编程设备描述表的概念和在客户区绘制、在窗口标题栏绘制、在桌面绘制图解
設(shè)備描述表
設(shè)備描述表是一個(gè)定義一組圖形對象及其屬性、影響輸出的圖形方式(數(shù)據(jù))結(jié)構(gòu)。windows提供設(shè)備描述表,用于應(yīng)用程序和物理設(shè)備之間進(jìn)行交互,從而提供了應(yīng)用程序設(shè)計(jì)的平臺無關(guān)性。設(shè)備描述表又稱為設(shè)備上下文,或者設(shè)備環(huán)境。
設(shè)備描述表是一種數(shù)據(jù)結(jié)構(gòu),它包括了一個(gè)設(shè)備(如顯示器和打印機(jī))的繪制屬性相關(guān)的信息。所有的繪制操作通過設(shè)備描述表進(jìn)行。設(shè)備描述表與大多 WIN32結(jié)構(gòu)不同,應(yīng)用程序不能直接訪問設(shè)備描述表,只能由各種相關(guān)API函數(shù)通過設(shè)備描述表的句柄間接訪問該結(jié)構(gòu)。
設(shè)備描述表總是與某種系統(tǒng)硬件設(shè)備相關(guān)。比如屏幕設(shè)備描述表與顯示設(shè)備相關(guān),打印機(jī)設(shè)備描述表與打印設(shè)備相關(guān)等等。
屏幕設(shè)備描述表,一般我們簡單地稱其為設(shè)備描述表。它與顯示設(shè)備具有一定的對應(yīng)關(guān)系,在windows GDI界面下,它總是相關(guān)于某個(gè)窗口或這窗口上的某個(gè)顯示區(qū)域。通常意義上窗口的設(shè)備描述表,一般指的是窗口的客戶區(qū),不包括標(biāo)題欄、菜單欄所占有的區(qū)域,而對于整個(gè)窗口來說,其設(shè)備描述表嚴(yán)格意義上來講應(yīng)該稱為窗口設(shè)備描述表,它包含窗口的全部顯示區(qū)域。二者的操作方法完全一致,所不同的僅僅是可操作的范圍不同而已。
簡單來說設(shè)備描述表就是繪圖和輸出文字的區(qū)域,其默認(rèn)坐標(biāo)系,左上角為(0,0);
在C#這些語言里面此概念已經(jīng)被封裝了,可以不用管;
下面來分別在窗口客戶區(qū)、標(biāo)題欄、桌面上,輸出文字,通過獲取不同的設(shè)備描述表;
#include <windows.h> #include "resource.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst; TCHAR szClassName[] = TEXT("dcDemo");int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) {HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_DCDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("設(shè)備描述表 Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,500,100,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam; }LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {PAINTSTRUCT ps;HDC hdc, hdcbt,hdcdesk;RECT rt; char szBuffer[100]; switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_dc: hdc=GetDC(hwnd);hdcbt=GetWindowDC(hwnd);hdcdesk=GetWindowDC(GetDesktopWindow());TextOut(hdc, 200,10,"在窗口客戶區(qū)繪制",16);TextOut(hdcbt, 200,10,"在整個(gè)窗口繪制",14);TextOut(hdcdesk, 200,10,"在桌面繪制",10);break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("dcDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("設(shè)備描述表Demo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam); }break;case WM_CREATE:break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rt); EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0; }啟動程序,在桌面上,如下;未執(zhí)行繪制代碼;
當(dāng)執(zhí)行了繪制代碼之后,如下;分別在三個(gè)地方,窗口客戶區(qū)、窗口標(biāo)題欄、計(jì)算機(jī)桌面上,進(jìn)行了繪制;?
如果應(yīng)用需要在計(jì)算機(jī)桌面輸出內(nèi)容,可考慮此功能;
下面三句分別是,獲取窗口客戶區(qū)設(shè)備描述表,獲取整個(gè)窗口設(shè)備描述表,獲取桌面設(shè)備描述表;
hdc=GetDC(hwnd);
hdcbt=GetWindowDC(hwnd);
hdcdesk=GetWindowDC(GetDesktopWindow());
工程;?
資源和頭文件;?
#include "resource.h" #include <windows.h>/ // // Menu //IDC_DCDEMO MENU BEGINPOPUP "&File"BEGINMENUITEM "設(shè)備描述表 Demo", IDM_dcMENUITEM "E&xit", IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...", IDM_ABOUTEND END #define IDM_EXIT 10001 #define IDM_ABOUT 10002#define IDC_DCDEMO 10101 #define IDD_ABOUTBOX 10102 #define IDM_dc 40001?
總結(jié)
以上是生活随笔為你收集整理的Windows编程设备描述表的概念和在客户区绘制、在窗口标题栏绘制、在桌面绘制图解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离散余弦变换和C语言实现-win32版本
- 下一篇: powerdesigner使用vba脚本