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语句 ...
随机推荐
- 深入解密.NET(GC垃圾回收)
值类型与引用类型 值类型(Value Type),值类型实例通常分配在线程的堆栈(stack)上,并且不包含任何指向实例数据的指针,因为变量本身就包含了其实例数据 C#的所有值类型均隐式派生自Syst ...
- color xml arm相关
#-------------------------------------------------------------------------- # C O L O R S #--------- ...
- selenium键盘操作
键盘操作需引用: from selenium.webdriver.common.keys import Keys 操作码表: NULL = '\ue000' CANCEL = '\ue001' # ^ ...
- Git操作说明
Git操作说明 1.将本地项目上传到GitHub 1) 首先在GitHub上注册帐户 2) 在GitHub上创建仓库 3) Pc安装Git客户端(Git Bach) 4) 打开 ...
- 1.Spring对JDBC整合支持
1.Spring对JDBC整合支持 Spring对DAO提供哪些支持 1)Spring对DAO异常提供统一处理 2)Spring对DAO编写提供支持的抽象类 3)提高编程效率,减少DAO编码量 Spr ...
- SSM框架-SpringMVC 实例文件上传下载
一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+sta ...
- InstallShield2015制作安装包----------安装过程中修改文件内容
//修改安装目录下autostart.vbs里的路径 //打开文件 OpenFileMode(FILE_MODE_NORMAL); strPath=INSTALLDIR+"centerAut ...
- UVa 202 Repeating Decimals(抽屉原理)
Repeating Decimals 紫书第3章,这哪是模拟啊,这是数论题啊 [题目链接]Repeating Decimals [题目类型]抽屉原理 &题解: n除以m的余数只能是0~m-1, ...
- TP父类及模板继承
一.TP父类方法继承 session用法 用登录页面做例子 <?php namespace Home\Controller; use Think\Controller; class LoginC ...
- 10 enumerate()在字典,列表中的用法详解
1.字典 li = {"alex"," aric","Alex","Tony","rain"}for ...