GDI的 点 线 面 双缓冲 位图的绘制
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的 点 线 面 双缓冲 位图的绘制的更多相关文章
- C#中使用双缓冲来避免绘制图像过程中闪烁
自己所做项目中,在显示医学图像的界面中,当鼠标拖动图像时,不断刷新从后台获取新的图像,而整个过程就很诡异,一直闪个不停. 找到的一个可行方法是:在用户控件的构造函数中加入以下代码: SetStyle( ...
- 【转载】C#:使用双缓冲让界面绘制图形时避免闪烁
https://blog.csdn.net/fujie724/article/details/5767064#
- Win32 GDI 非矩形区域剪裁,双缓冲技术
传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X- ...
- C# GDI+双缓冲技术
我想有很多搞图形方面的朋友都会用到双缓冲技术的时候,而且有的时候她的确是个头疼的问题.最近我也要用双缓冲技术,程序怎么调试都不合适,当要对图形进行移动时,总是会出现闪烁抖动.在网上找了些资料,说得都不 ...
- c# GDI画图 双缓冲画图分析
双缓冲绘图分析 1.Windows 绘图原理 我们在 Windows 环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是“画”出来的.这时的屏幕,就相当于一块黑板,而 Windows ...
- C#-gdi绘图,双缓冲绘图,Paint事件的触发
一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1 绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...
- C#-gdi画图,双缓冲画图,Paint事件的触发---ShinePans
在使用gdi技术画图时,有时会发现图形线条不够流畅,或者在改变窗口大小时会闪烁不断的现象.(Use DoubleBuffer to solve it!) ...
- .net WINFORM的GDI双缓冲的实现
有时候在窗体中执行不断的GDI+操作的时候会出现闪速的状况,除了修改窗体的参数,更应该解决刷新本身的问题,双缓冲可能就是这样来的. 方法1: 用GDI绘制在位图上,然后再重新生成位图 Bitmap b ...
- GDI双缓冲
GDI双缓冲 翻译自Double buffering,原作者Dim_Yimma_H 语言:C (原文写的是C++,实际上是纯C) 推荐知识: 构建程序 函数 结构体 变量和条件语句 switch语句 ...
随机推荐
- python模拟艺龙网登录requests包
对比urllib.urllib2与requests不难发现,前者功能更强大,但是实现一个功能要写很多的代码,后者,requests代码简洁,用起来更快速 下面一个模拟登录的代码:看看吧一共也没有几行就 ...
- ecshop 前台分页
在当前需要分页的if最后div里面加入这句, <!-- #BeginLibraryItem "/library/pages.lbi" --><!-- #EndLi ...
- python3学习笔记之安装
一.Python安装 1.下载地址: https://www.python.org/downloads/release/python-365/ 2. Linux系统自带Python2.7,如需安装3 ...
- jQuery_ajax请求超时
设置timeout的时间,通过检测complete时status的值判断请求是否超时,如果超时执行超时的操作. $.ajax({ url:'', timeout : 1000, //超时时间设置,单位 ...
- struts2实现jQuery的异步交互
struts2中jQuery的异步交互有两种方式: 1)是利用构造字符串的方式来实现: 使用该方法主要是在服务器端根据前端的请求,返回一个字符串信息,然后前端的jQuery通过解析该字符串信息得到对应 ...
- C#中换行的代码
1.Windows 中的换行符"\r\n"2.Unix/Linux 平台换行符是 "\n".3.MessageBox.Show() 的换行符为 "\n ...
- talend openstudio 在OracleInput组件中guess Schema 出现Database connection is failed 的错误
错误描述: talend openstudio 在OracleInput组件中guess Schema 出现Database connection is failed 的错误. 查看错误详情,发现错误 ...
- CSS实例:图片导航块
1.认识CSS的 盒子模型. 2.CSS选择器的灵活使用. 3.实例: a.图片文字用div等元素布局形成HTML文件. b.新建相应CSS文件,并link到html文件中. c.CSS文件中定义样式 ...
- Qt 事件机制
[1]事件 事件是可以被控件识别的操作.如按下确定按钮.选择某个单选按钮或复选框. 每种控件有自己可识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件等等. 事件就是用户对窗口 ...
- 初探AngularJs框架(二)
一.创建Components组件 直接使用AngularCLI即可很方便的创建component组件,使用如下指令: ng g component components/news 这样就会在compo ...