日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Win32 API CreateCompatibleDC 函数的相关应用

發(fā)布時間:2025/4/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Win32 API CreateCompatibleDC 函数的相关应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)于 CreateCompatibleDC 函數(shù)的用法的說明如下;
Windows不允許程序員直接訪問硬件,它對屏幕的操作是通過環(huán)境設(shè)備,也就是DC來完成的。屏幕上的每一個窗口都對應(yīng)一個DC,可以把DC想象成一個視頻緩沖區(qū),對這這個緩沖區(qū)的操作,會表現(xiàn)在這個緩沖區(qū)對應(yīng)的屏幕窗口上。
在窗口的DC之外,可以建立自己的DC,就是說它不對應(yīng)窗口,這個方法就是CreateCompatibleDC,這個DC就是一個內(nèi)存緩沖區(qū),通過這個DC你可以把和它兼容的窗口DC保存到這個DC中,就是說你可以通過它在不同的DC之間拷貝數(shù)據(jù)。例如:你先在這個DC中建立好數(shù)據(jù),然后在拷貝到窗口的DC就是完成了這個窗口的刷新。

下面來看一下,創(chuàng)建兼容DC,在兼容DC中繪制,然后把兼容DC拷貝到原來DC的效果;

可以在DC間進行拷貝的函數(shù)如下;

StretchBlt函數(shù),該函數(shù)從源矩形中復制一個位圖到目標矩形,必要時按目標設(shè)備設(shè)置的模式進行圖像的拉伸或壓縮。
BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);
hdcDest:指向目標設(shè)備環(huán)境的句柄。
nXOriginDest:指定目標矩形左上角的X軸坐標,按邏輯單位表示坐標。
nYOriginDest:指定目標矩形左上角的Y軸坐標,按邏輯單位表示坐標。
nWidthDest:指定目標矩形的寬度,按邏輯單位表示寬度。
nHeightDest:指定目標矩形的高度,按邏輯單位表示高度。
hdcSrc:指向源設(shè)備環(huán)境的句柄。
nXOriginSrc:指向源矩形區(qū)域左上角的X軸坐標,按邏輯單位表示坐標。
nYOriginSrc:指向源矩形區(qū)域左上角的Y軸坐標,按邏輯單位表示坐標。
nWidthSrc:指定源矩形的寬度,按邏輯單位表示寬度。
nHeightSrc:指定源矩形的高度,按邏輯單位表示高度。
dwRop:指定要進行的光柵操作。光柵操作碼定義了系統(tǒng)如何在輸出操作中組合顏色,這些操作包括刷子、源位圖和目標位圖等對象。參考BitBlt可了解常用的光柵操作碼列表。

BitBlt函數(shù)參數(shù)類似;

使用 CFree;

#include <windows.h> #include "resource.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst; TCHAR szClassName[] = TEXT("comdcDemo");void drawline2(POINT ,POINT ,COLORREF , HDC );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_COMDCDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("comdc Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,300,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, hdcMem ;RECT rt; char szBuffer[100]; switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_comdc: hdc=GetDC(hwnd);TextOut(hdc, 1,1,"AAA",3);TextOut(hdc, 1,21,"BBB",3);TextOut(hdc, 1,41,"CCC",3);hdcMem = CreateCompatibleDC (hdc) ;wsprintf(szBuffer, "%x",hdc);TextOut(hdc,1,61,szBuffer,8);wsprintf(szBuffer, "%x",hdcMem);TextOut(hdc,1,81,szBuffer,8);TextOut(hdcMem, 101,1,"XXX",3);TextOut(hdcMem, 101,21,"YYY",3);TextOut(hdcMem, 101,41,"ZZZ",3);StretchBlt(hdc,100,0, 60,60, hdcMem, 100,0,60,60,SRCCOPY);//BitBlt (hdc, 0,0, 300, 300,hdcMem, 0, 0, SRCCOPY) ; break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("comdcDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("comdcDemo"), 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; }

先在窗口DC上輸出幾行文字;然后創(chuàng)建兼容DC;輸出兩個DC的句柄,看創(chuàng)建兼容DC是否成功;

然后在兼容DC中繪制文字;然后把兼容DC拷貝到原來DC;

代碼不會出錯;但是DC的拷貝沒有效果;不顯示兼容DC中的內(nèi)容;

從輸出的句柄看到創(chuàng)建兼容DC成功;?

StretchBlt(hdc,100,0, 60,60, hdcMem, 100,0,60,60,SRCCOPY);
BitBlt (hdc, 0,0, 300, 300,hdcMem, 0, 0, SRCCOPY) ;

? ? 這兩句執(zhí)行沒有效果;

hdc是原來DC,hdcMem是兼容DC;主要的代碼是在?case IDM_comdc 處理分支中;

那么這幾個函數(shù)(CreateCompatibleDC, StretchBlt, BitBlt)的實際使用情況要更復雜些;下回再看;

資源和頭文件;

#include "resource.h" #include <windows.h>/ // // Menu //IDC_COMDCDEMO MENU BEGINPOPUP "&File"BEGINMENUITEM "comdc demo", IDM_comdcMENUITEM "E&xit", IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...", IDM_ABOUTEND END #define IDM_EXIT 10001 #define IDM_ABOUT 10002#define IDC_COMDCDEMO 10101 #define IDD_ABOUTBOX 10102 #define IDM_comdc 40001


?

總結(jié)

以上是生活随笔為你收集整理的Win32 API CreateCompatibleDC 函数的相关应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。