前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MFC控件第一讲.DC编程

MFC控件第一讲.DC编程

作者头像
IBinary
发布于 2019-05-25 08:21:18
发布于 2019-05-25 08:21:18
1.2K00
代码可运行
举报
文章被收录于专栏:逆向技术逆向技术
运行总次数:0
代码可运行

            MFC控件第一讲.DC编程

一丶简介

  什么是DC,DC有什么用.

  DC成为设备描述符表. DC的作用就是可以进行绘制. 比如我们的窗口都是绘制出来的. DC可以简单理解为.没一个窗口程序都有一块内存用于绘制.我们只需要获取这块内存即可.

MFC 中 的CDC类 就是封装了HDC 跟GDI函数. 并且派生出了四个不同场景下的类.

注意HDC 则是windows中真正的DC. 配合GDI函数进行操作绘制的. MFC只不过封装了一下.

派生出来的类常用的有三个.

1.CPaintDc 用户在窗口的客户区画图. 仅限与OnPaint处理程序. OnPaint 就是一个消息处理函数.

2.CClieentDC 用户在窗口客户区画图.除了 OnPaint外的任何处理程序. 除了消息处理函数都可以进行操作

3.CWindowsDc 用于在窗口内任意地方画图.包括非客户区. 任何一个地方都可以编写代码操作.

二丶CPaintDc用法

比如我们的MFC框架中已经给我们写好了这个处理函数.

代码如下.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void CCDCDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

我们也可以自己写一个.比如使用Win32的知识画一段字.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    HDC hdc = ::GetDC(m_hWnd);              //用于绘制的DC
    PAINTSTRUCT ps;       //保存DC的信息结构体
    ::BeginPaint(m_hWnd, &ps);

    ::DrawText(hdc, TEXT("Hello"), wcslen(TEXT("Hello")), CRect(200, 200, 200, 200), DT_SINGLELINE);//单行显示

    ::EndPaint(m_hWnd, &ps);

如果是MFC下.则用CpaIntDc 传入this即可.

三丶CClientDc用法

CClientDc则是可以不用再OnPaint中使用.我们可以按钮点击就使用了.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void CCDCDlg::OnBnClickedButton1()
{
    CClientDC dc(this);
    dc.Ellipse(0, 0, 100, 100); 画个圆
}

上方代码则是我们在客户区画个圆. 在我们点击之后.

我们的CWindowsDc是一样的.只不过比CClientDc用的更广一点.

关于GDI函数.我们可以下一个MFC类库详解. 有中文版的.或者你查询MSDN都可以.输入你想用的DC类.则会出现对应函数.

四丶DC中常见的属性

常见的属性可以用下图表示.并且有对应的方法

我们可以通过这些方法设置跟获取.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VC++6.0中改变窗口背景颜色和控件背景颜色,CDC,我的感觉
1.改变对话框的背景色 在C…App类中的InitInstance()里添加 SetDialogBkColor(RGB(0,192,0),RGB(0,0,0)); 2.如果想改变静态文本或单选按钮的背景色可以用你说的那个获得控件ID,然后设置背景色,具体步骤: (1)响应对话框类的WM_CTLCOLOR消息生成OnCtlColor函数 (2)为对话框类添加成员变量CBrush m_brush; 并在初始化函数中初始化m_brush.CreateSolidBrush(RGB(0,255,0)); (3)在OnCtlColor函数中添加代码以改变控件的文字颜色和背景色 switch(pWnd->GetDlgCtrlID()) { case(IDC_INPUT):   pDC->SetTextColor(RGB(255,0,192));   pDC->SetBkMode(TRANSPARENT);   return m_brush;   break; case(IDC_EDIT1):   pDC->SetTextColor(RGB(255,0,0));   pDC->SetBkMode(TRANSPARENT);   return m_brush;   break; case(IDC_CHOICE):   pDC->SetTextColor(RGB(255,128,0));   pDC->SetBkMode(TRANSPARENT);   return m_brush;   break; case(IDC_RADIO1):   pDC->SetTextColor(RGB(255,0,20));   pDC->SetBkMode(TRANSPARENT);   return m_brush;   break; default:   break; } 3.如果想改变按钮的背景色,简直太难了,你要重写两个类,还需要在网上下,孙鑫的视频教程中也简单介绍了这个,可只是改变按钮的文字颜色
阳光岛主
2019/02/19
3.5K0
图像处理程序框架—MFC相关知识点
CDC:Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 。
流川疯
2019/01/18
1.5K0
2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题
第一步:首先建立一个MFC工程,成功后会跳出一个对话框,直接在对话框上点击右键-》点击插入ACTIVAE控件-》选择MicrosoftCommunications Control, version 6.0
徐飞机
2018/08/30
3.1K0
2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片   解决串口接收数据丢字节丢包问题
MFC 调用静态链接 MFC 的规则 DLL
最近学习了生成静态链接的dll及其调用,写一下笔录和大家分享,有错误的地方欢迎大家指出来
包子388321
2020/06/16
2.7K0
opencv:image->imageData+image->widthStep*i)[j]表达式含义
image->imageData+image->widthStep*i)[j] 就是得到image图像中第i行第j列的像素值。
全栈程序员站长
2022/08/31
2780
opencv:image->imageData+image->widthStep*i)[j]表达式含义
MFC控件GDI编程
PolyLine这个函数.则是给一个数组. 这个数组里面保存着x y坐标. 然后它会遍历数组.以你给定的点来画线.
IBinary
2019/05/25
1.3K0
MFC控件编程之鼠标跟键盘消息
学习过MFC原理的应该知道.这里可以添加消息. 自己可以手动添加.我们也可以使用向导来添加.
IBinary
2019/05/25
1.6K0
VC++6.0入门——第四讲 简单绘图
文章链接:https://cloud.tencent.com/developer/article/2465870
Arya
2024/11/18
1330
VC++6.0入门——第四讲 简单绘图
VC++6.0入门——第九讲 定制应用功能程序外观
好事文章地址:https://cloud.tencent.com/developer/article/2470499
Arya
2024/12/03
1200
VC++6.0入门——第九讲 定制应用功能程序外观
MFC的自定义控件之消息机制
MFC是使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。 当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理。SDK编程时需要在窗口过程中一一判断消息值进行相应的处理,相比之下MFC的消息映射机制要方便好用的多。
包子388321
2020/06/16
1.7K0
Windows平台RTMP|RTSP播放器为什么要兼容GDI绘制
先说结论,Windows平台播放渲染这块,一般来说99%以上的机器都是支持D3D的,实现GDI模式绘制,除了为了好的兼容性外,在远程连接的场景下,D3D创建不成功,需要使用GDI模式。
音视频牛哥
2021/05/13
6050
Win32知识之窗口绘制.窗口第一讲
  在学习Win32的时候. 很多操作都是窗口进行操作的.那么今天就说一下窗口的本质是什么. 
IBinary
2018/09/28
1.6K0
Win32知识之窗口绘制.窗口第一讲
C/C++ 如何来自动优雅的涮别银家的贴子
  被涮屏涮烦了,就分享一下如何用低调的c/c++来涮别人家的屏吧! 此处埋下三颗雷! 这不是啥新知识,也不是什么浅显的代码。下面,来淘淘这份经验,呼呼 我们要了解Web browser 这个控件,因为到目前为止,很少有浏览器能够被调用内核API,而Web browser 提供了IE的内核内容,就是我们可以用Ie提供的内核来自己设计一个简单的浏览器  当然,我们这儿并不是扯这个蛋。 但是为了后面说起来比较合理些 ,就只能翻山越岭的开始介绍了! 首先创建一个dlg,然后点击Acx control ,如果看见了
Gxjun
2018/03/26
1.3K0
C/C++ 如何来自动优雅的涮别银家的贴子
【大三操作系统实验】 请求页式管理中的置换算法
(1)FIFO算法总是选择在内存驻留时间最长的一页将其淘汰。FIFO算法认为调入内存的页不再被可能性要比其他页大,因而选择最先调入内存的页换出。
用户7886150
2020/12/29
5620
【读书笔记】Windows程序设计5
与从BeginPaint函数返回的设备句柄不同,从GetDC返回的设备句柄中的裁剪区域是整个客户区,而不仅仅
zhang_derek
2022/12/21
2.5K0
MFC自定义控件
需要在MFC实现自定义控件功能,网上搜集找的如下方法实现: 以下是步骤说明。 一、自定义一个空白控件  1、先创建一个MFC工程        NEW Project-->MFC-->MFC Application-->name:  “CustomCtr”-->Application Type选择“Dialog based”。  2、在窗口中添加一个自定义控件        Toolbox-->“Custom Control”-->属性-->class随便填写一个控件类名“CMyWin”, 这个名字用
_gongluck
2018/03/08
1.9K0
VC2008中如何为MFC应用程序添加和删除消息响应函数
      最近重温《MFC Windows应用程序设计》第二版这本书,里面的代码全部是使用VC6.0写的,我Win7下安装的是VS2008开发环境。
ccf19881030
2019/04/23
2K0
VC2008中如何为MFC应用程序添加和删除消息响应函数
MFc界面添加滚动条笔记
2.The Fingerprint Contrast and Analysis System
流川疯
2019/01/18
1.3K0
MFC Windows 程序设计->取消对GDI对象的选定
It's important to delete the GDI objects you create, but it's equally important to never delete a GDI object while it's selected into a device context. Code that attempts to paint with a deleted object is buggy code. The only reason it doesn't crash is that the Windows GDI is sprinkled with error-checking code to prevent such crashes from occurring.
井九
2024/10/12
1080
UDP即时通信
编写一个基于某种I/O方法的UDP应用程序:能够实现模拟C/S模型的通信方 式,接收方负责信息的接收,并能够返回给客户端相应的消息;发送方负
沁溪源
2020/09/03
1.6K0
相关推荐
VC++6.0中改变窗口背景颜色和控件背景颜色,CDC,我的感觉
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验