关于 CreateCompatibleDC 函数的用法的说明如下;
Windows不允许程序员直接访问硬件,它对屏幕的操作是通过环境设备,也就是DC来完成的。屏幕上的每一个窗口都对应一个DC,可以把DC想象成一个视频缓冲区,对这这个缓冲区的操作,会表现在这个缓冲区对应的屏幕窗口上。
在窗口的DC之外,可以建立自己的DC,就是说它不对应窗口,这个方法就是CreateCompatibleDC,这个DC就是一个内存缓冲区,通过这个DC你可以把和它兼容的窗口DC保存到这个DC中,就是说你可以通过它在不同的DC之间拷贝数据。例如:你先在这个DC中建立好数据,然后在拷贝到窗口的DC就是完成了这个窗口的刷新。

下面来看一下,创建兼容DC,在兼容DC中绘制,然后把兼容DC拷贝到原来DC的效果;

可以在DC间进行拷贝的函数如下;

StretchBlt函数,该函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。
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:指向目标设备环境的句柄。
nXOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。
nYOriginDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。
nWidthDest:指定目标矩形的宽度,按逻辑单位表示宽度。
nHeightDest:指定目标矩形的高度,按逻辑单位表示高度。
hdcSrc:指向源设备环境的句柄。
nXOriginSrc:指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。
nYOriginSrc:指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。
nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度。
nHeightSrc:指定源矩形的高度,按逻辑单位表示高度。
dwRop:指定要进行的光栅操作。光栅操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源位图和目标位图等对象。参考BitBlt可了解常用的光栅操作码列表。

BitBlt函数参数类似;

使用 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上输出几行文字;然后创建兼容DC;输出两个DC的句柄,看创建兼容DC是否成功;

然后在兼容DC中绘制文字;然后把兼容DC拷贝到原来DC;

代码不会出错;但是DC的拷贝没有效果;不显示兼容DC中的内容;

从输出的句柄看到创建兼容DC成功;

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

这两句执行没有效果;

hdc是原来DC,hdcMem是兼容DC;主要的代码是在 case IDM_comdc 处理分支中;

那么这几个函数(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

Win32 API CreateCompatibleDC 函数的相关应用相关推荐

  1. WIN32 API:绘图函数

    二.创建GDI绘图对象 今天我们要讨论的是Win32 API中最有有趣的部分───用绘图函数完成图形输出.可以说,所有前面讲的内容都是本课程的前期准备.当时,我们在一些试例程序中偶尔用了一些绘图函数, ...

  2. Win32 API消息函数:GetMessagePos

    函数功能:该函数返回表示屏幕坐标下光标位置的长整数值.此位置表示当上一消息由GetMessage取得时鼠标占用的点. 函数原型:DWORD GetMessagePos(VOID) 参数:无. 返回值: ...

  3. Java Win32 API FindWindow函数找不到窗口问题

    在使用openface的时候,打开了主窗口(窗口名字为tracking result)后,想进行窗口位置的设定 WinDef.HWND trackingResult = instance.FindWi ...

  4. c#调用win32 API函数修改系统时间

    一般来说,系统时间的修改可以通过win32 API函数库中的SetLocalTime函数进行设置.对于C#语言来说,虽然win32 API大部分函数都已经封装在了.NET Framework类库中,但 ...

  5. C#调用Win32 api学习总结

    转载:https://blog.csdn.net/bcbobo21cn/article/details/50930221 从.NET平台调用Win32 API Win32 API可以直接控制Micro ...

  6. 暴强贴:从.NET平台调用Win32 API

    作者:刘铁猛 日期:2005-12-20 关键字:C# .NET Win32 API 版权声明:本文章受知识产权法保护,如果阁下想转载,在转载的时候烦劳阁下连同在下的姓名一起转载,并向bladey@t ...

  7. win32 api中的Beep,PlaySound,MessageBeep等一系列函数编译通过但是没有声音的原因

    1.win32 api是基于x86架构的应用接口,也就是32位的,如果使用了x64的架构这几个函数就无法发出声音. 2.如果出现了链接错误一般是你的项目中没有包含相关的库文件,Beep,Message ...

  8. Win32 API、VC++、C# 文件操作函数的初步比较

    一 C# File.ReadAllText(FilePath) : 一次将文本内容全部读完, File.ReadAllLines: 该方法返回一个字符串数组.每一行都是一个数组元素. string[] ...

  9. C++ 纯WIN32 API编程 悦读器实战示例

    /* 最后修改:2020-09-21 14:04 <C++编程示例大全> 作者:张国鹏 本例功能:C++ 纯WIN32 API编程 悦读器实战示例 软件下载:http://lovegp.c ...

最新文章

  1. 嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得
  2. 当前linux环境做出镜像,把当前ubuntu系统做成镜像
  3. Everest 0.6 设置ADSL上网
  4. Atitit.css 规范 bem  项目中 CSS 的组织和管理
  5. 创建型模式——工厂模式
  6. 关于gitgithub的操作
  7. 2019计算机开机号003期,2019年011期福彩中心开机号(附汇总)
  8. 《软件项目管理(第二版)》第 5 章——项目进度和成本管理 重点部分总结
  9. orm2 中文文档 3.3 模型钩子
  10. 二、服务器优化(3)服务器端优化措施
  11. android自定义ViewPager之——处理与ScrollView的事件冲突
  12. VC6.0(VC++6.0)下载地址和安装教程(图解)
  13. android 如何调用 无线投影,无线投影仪怎么连接?答案在此,效率快得没话说
  14. 高等数学学习笔记——第九十五讲——函数的幂级数展开
  15. GPS在无人驾驶中的定位作用与不足
  16. centos freeradius mysql_CentOS 5.7安装FreeRADIUS 1.1.3+MySQL 5.0.77结合RouteOS
  17. vscode连接服务器不用每次都输入密码
  18. c51单片机矩阵键盘1602计算器_基于矩阵键盘1602液晶屏的简易计算器的设计系统-电子信息科学与技术课程设计说明书.doc...
  19. 链家网页爬虫_链家房源爬虫(含源码)
  20. 【导数术】6.端点效应

热门文章

  1. ext2和ext3文件系统知识
  2. set class_ x set fid_ x
  3. Choose the Right Search Solution
  4. redis的通用命令 || redis持久化机制:(RDB  ||  AOF)
  5. java的知识点34——线程通信 || 生产者与消费者问题
  6. 自定义取值距离的javascript random()函数
  7. linux服务器oracle数据库导出dmp文件功能演示,备份数据库命令。exp命令显示command not found解决方法,EXP-00028: 无法打开dmp进行写入问题解决
  8. SDUT_2122 数据结构实验之链表七:单链表中重复元素的删除
  9. C++ STL算法之accumulate函数
  10. flask读取数据库(mysql)并展示表格(讲解获取表头的方法)【附上flask好看点的helloworld】