1.输出文本


// 输出文本


 1 COLORREF clrOldTextColor = SetTextColor(hDC, RGB(,,));   //设置字体颜色,但最后都要返回原来的字体格式

    COLORREF clrBackColor = SetBkColor(hDC, RGB(,,));           //设置背景颜色,仅仅指的是文本区域的颜色

    HFONT hFont = CreateFont(           // nHeight                          //创造一个字体格式,其中包含14个参数,前两个是字体的大小,其他的详见MSDN

                                                    ,       // nWidth   

                                                  ,       // nEscapement     

                                                    ,       // nOrientation     

                                                       ,       // nWeight     

                                                     , FALSE     // nItalic     

                                                  , FALSE     // nUnderline    

                                           ,       // cStrikeOut    

                                          ,      ANSI_CHARSET   // nTCHARSet    

                                          , OUT_DEFAULT_PRECIS // nOutPrecision    

                                             , CLIP_DEFAULT_PRECIS // nClipPrecision   

                                          , DEFAULT_QUALITY  // nQuality 

                                           , DEFAULT_PITCH|FF_SWISS// nPitchAndFamily   

                                          , _T("arial") );        // lpszFacename

    HFONT hOldFont = (HFONT)::SelectObject(hDC, (HGDIOBJ)hFont);                 //设置字体

   {  

     DrawText(hDC, _T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")), &rcClient,    DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS |           DT_SINGLELINE);                                                                     //最后一个参数表示输出格式,其中 DT_WORD_ELLIPSIS  在本本区域不够时输出省略号

                                                                                               可以指定输出的格式 比TextOut灵活  

    // TextOut(hDC, 0, 0,_T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")));  

   }   

                //SetTextAlign(hDC,TA_RIGHT|TA_TOP);       //显示文本的对齐方式,右对齐

               //SetTextAlign(hDC,TA_LEFT|TA_TOP);          //显示文本的对齐方式,左对齐

    ::SelectObject(hDC, (HGDIOBJ)hOldFont);      //返回原来的字体     

      DeleteObject((HGDIOBJ)hFont);                   //删除掉所创建的字体,不然可能会出现内存泄露

        SetBkColor(hDC, clrBackColor);                 // 返回原来的背景颜色

      SetTextColor(hDC, clrOldTextColor);           //f返回原来的字体颜色

2. 输出点

因为一个点不是很明显,所以用输出矩形的方式。

SetPixel表示输出点,有四个参数,第一表示设备句柄,我们所说的画家,第二和第三分别表示点画的位置,最后一个是像素点的颜色。

 for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
SetPixel(hDC,i,j,RGB(,,));
}
}

3.绘制线条函数

  HPEN hPen = CreatePen(PS_DASH,,RGB(,,));       // 产生画笔,设置线条格式
HPEN hOldPen = (HPEN)::SelectObject(hDC,hPen); MoveToEx(hDC,rcClient.left,rcClient.top,NULL); //画线函数
LineTo(hDC,rcClient.right,rcClient.bottom); ::SelectObject(hDC,hOldPen);
DeleteObject(hPen);

4.绘制面

 //HPEN hPen =(HPEN) ::GetStockObject(NULL_PEN);   //设置为没有颜色的边框,同样也可以设置一个无填充的 背景NULL_BRUSH
HPEN hPen = CreatePen(PS_SOLID,,RGB(,,)); // 产生画笔,设置线条格式
HPEN hOldPen = (HPEN)::SelectObject(hDC,hPen); HBRUSH hBrush = CreateSolidBrush(RGB(,,)); //设置画刷颜色
HBRUSH hOldBrush =(HBRUSH)::SelectObject(hDC,hBrush);
{
//::Rectangle(hDC,0,0,100,50); //绘制矩形 ::Ellipse(hDC,,,,); //绘制椭圆
}
::SelectObject(hDC,hOldBrush);
DeleteObject(hBrush);
::SelectObject(hDC,hOldPen);
DeleteObject(hPen);

5.双缓冲绘图模式

 HDC  hMenDC = ::CreateCompatibleDC(hDC);      //产生一个能兼容hDC的设备句柄
assert(hMenDC); HBITMAP hCompatibaleMap = ::CreateCompatibleBitmap(hDC,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top); //创造出一个图层,当然所有创建的最后都要进行销毁
assert(hCompatibaleMap);
{
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMenDC,hCompatibaleMap);
{ //HPEN hPen =(HPEN) ::GetStockObject(NULL_PEN); //设置为没有颜色的边框,同样也可以设置一个无填充的 背景NULL_BRUSH
HPEN hPen = CreatePen(PS_SOLID,,RGB(,,)); // 产生画笔,设置线条格式
HPEN hOldPen = (HPEN)::SelectObject(hMenDC,hPen); HBRUSH hBrush = CreateSolidBrush(RGB(,,)); //设置画刷颜色
HBRUSH hOldBrush =(HBRUSH)::SelectObject(hMenDC,hBrush);
{ for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
SetPixel(hMenDC,i,j,RGB(,,));
}
} //::Rectangle(hDC,0,0,100,50); //绘制矩形 // ::Ellipse(hMenDC,0,0,100,50); //绘制椭圆
}
::SelectObject(hMenDC,hOldBrush);
DeleteObject(hBrush);
::SelectObject(hMenDC,hOldPen);
DeleteObject(hPen);
::BitBlt(hDC,rcClient.left,rcClient.top,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top,
hMenDC,,,SRCCOPY);
}
::SelectObject(hMenDC,hOldBitmap);
}
::DeleteObject((HGDIOBJ)hCompatibaleMap);
DeleteDC(hMenDC);

6. 输出位图

位图的输出要在双缓冲的基础上进行

  HDC  hMenDC = ::CreateCompatibleDC(hDC);
assert(hMenDC); HBITMAP hBitMap = (HBITMAP)::LoadBitmap((HINSTANCE)GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1));
assert(hBitMap); BITMAP bm;
::GetObject(hBitMap,sizeof(BITMAP),&bm); //获取位置的尺寸信息 {
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMenDC,hBitMap);
{
for(int i= ; i< ;i++)
{
for(int j=;j<;j++)
{
::BitBlt(hDC,rcClient.left+bm.bmWidth*i,rcClient.top+bm.bmHeight*j,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top,
hMenDC,,,SRCCOPY);
}
} /* ::BitBlt(hDC,rcClient.left,rcClient.top,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top,
hMenDC,0,0,SRCCOPY);*/ //::StretchBlt(hDC, rcClient.left, rcClient.top, //放大位图
//rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, hMenDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
}
::SelectObject(hMenDC,hOldBitmap);
}
::DeleteObject((HGDIOBJ)hBitMap);
DeleteDC(hMenDC);

GDI的 点 线 面 双缓冲 位图的绘制的更多相关文章

  1. C#中使用双缓冲来避免绘制图像过程中闪烁

    自己所做项目中,在显示医学图像的界面中,当鼠标拖动图像时,不断刷新从后台获取新的图像,而整个过程就很诡异,一直闪个不停. 找到的一个可行方法是:在用户控件的构造函数中加入以下代码: SetStyle( ...

  2. 【转载】C#:使用双缓冲让界面绘制图形时避免闪烁

    https://blog.csdn.net/fujie724/article/details/5767064#

  3. Win32 GDI 非矩形区域剪裁,双缓冲技术

    传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X- ...

  4. C# GDI+双缓冲技术

    我想有很多搞图形方面的朋友都会用到双缓冲技术的时候,而且有的时候她的确是个头疼的问题.最近我也要用双缓冲技术,程序怎么调试都不合适,当要对图形进行移动时,总是会出现闪烁抖动.在网上找了些资料,说得都不 ...

  5. c# GDI画图 双缓冲画图分析

    双缓冲绘图分析  1.Windows 绘图原理  我们在 Windows 环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是“画”出来的.这时的屏幕,就相当于一块黑板,而 Windows ...

  6. C#-gdi绘图,双缓冲绘图,Paint事件的触发

    一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1  绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...

  7. C#-gdi画图,双缓冲画图,Paint事件的触发---ShinePans

    在使用gdi技术画图时,有时会发现图形线条不够流畅,或者在改变窗口大小时会闪烁不断的现象.(Use DoubleBuffer to solve it!)                         ...

  8. .net WINFORM的GDI双缓冲的实现

    有时候在窗体中执行不断的GDI+操作的时候会出现闪速的状况,除了修改窗体的参数,更应该解决刷新本身的问题,双缓冲可能就是这样来的. 方法1: 用GDI绘制在位图上,然后再重新生成位图 Bitmap b ...

  9. GDI双缓冲

    GDI双缓冲 翻译自Double buffering,原作者Dim_Yimma_H 语言:C (原文写的是C++,实际上是纯C) 推荐知识: 构建程序 函数 结构体 变量和条件语句 switch语句 ...

随机推荐

  1. Makefile中变量定义中末尾不能有空格

    我在Makefile中添加了 ifndef EMASSDIR EMASSDIR=$(shell emassTop.py)endif 但是emassTop.py)后面不小心加入了空格,造成出现“Make ...

  2. iOS UI布局-回到顶部

    回到顶部,是比较常用的一个效果 核心代码 在ViewDidLoad中,添加回到顶部按钮 计算偏移量,如果当前显示的内容全部向上隐藏掉,则显示“回到顶部”按钮 // // ViewController. ...

  3. 从零开始一起学习SLAM | 三维空间刚体的旋转

    刚体,顾名思义,是指本身不会在运动过程中产生形变的物体,如相机的运动就是刚体运动,运动过程中同一个向量的长度和夹角都不会发生变化.刚体变换也称为欧式变换. 视觉SLAM中使用的相机就是典型的刚体,相机 ...

  4. Css预处理器---Less(一)

    一.简介: Less是一种动态样式语言,可以在样式中使用变量,继承,运算,函数 二.使用 (1)客户端使用 //引入您的.less样式文件,rel属性区别去css为stylesheet/less &l ...

  5. https加密过程

    https加密完整过程 step1: “客户”向服务端发送一个通信请求 “客户”->“服务器”:你好 step2: “服务器”向客户发送自己的数字证书.证书中有一个公钥用来加密信息,私钥由“服务 ...

  6. SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递

    实现思路: 1:准备一个ThreadLocal变量,供线程之间共享. 2:每个微服务对所有过来的Feign调用进行过滤,然后从请求头中获取User用户信息,并存在ThreadLocal变量中. 3:每 ...

  7. 区别JS中类的静态方法,静态变量,实例方法,实例变量

    1.类的静态方法 先来段代码之后分析 // JS类静态函数 function BaseClass() { } // 类添加add函数 BaseClass.add = function() { cons ...

  8. pdf转txt

    ubuntu pdf转jpg或txt chenlei posted @ 2009年12月30日 17:22 inLinux , 1818 阅读 呵呵,刚刚在网上定购了一款mp5,后来才发现它不支持PD ...

  9. Python -- 连接数据库SqlServer

    用Python几行代码查询数据库,此处以Sql server为例. 1. 安装pymssql,在cmd中运行一下代码 pip install pymssql 2. 链接并执行sql语句 #-*-cod ...

  10. APIView源码解析

    1.首先安装pip install djangorestframework 2.导入from rest_framework.views import APIView class Courses(API ...