深入浅出话VC++(3)——VC++实现绘图操作
VC++实现绘图操作,说白了也就是对API熟练操作了,下面介绍几种绘图
1. 绘制线条
具体实现代码如下:
// 鼠标左键按下时的处理函数
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
originP=point;
CEditView::OnLButtonDown(nFlags, point);
} // 鼠标左键弹起时的处理函数,Point为弹起时鼠标的点坐标
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//#pragma region 1.利用SDK全局函数实现画线功能
//// 首先获得窗口的设备描述表
//HDC hdc;
//hdc=::GetDC(m_hWnd); //// 移动到线条的起点
//MoveToEx(hdc,originP.x,originP.y,NULL); //// 画线
//LineTo(hdc,point.x,point.y); //// 释放设备描述表
//::ReleaseDC(m_hWnd,hdc); //#pragma endregion
//#pragma region 2. 利用MFC的CDC类实现画线功能
//CDC* mfcDC=GetDC();
//mfcDC->MoveTo(originP);
//mfcDC->LineTo(point);
//ReleaseDC(mfcDC); //#pragma endregion //#pragma region 3. 利用MFC的CClientDC类实现画线功能
//CClientDC dc(this);
//dc.MoveTo(originP);
//dc.LineTo(point); //#pragma endregion
//#pragma region 4. 利用MFC的CWindowDC类实现画线功能
//CWindowDC wdc(this);
//wdc.MoveTo(originP);
//wdc.LineTo(point); //#pragma endregion #pragma region 5. 在桌面窗口中绘制彩色线
// 指定画笔GDI对象
CPen pen(PS_SOLID,,RGB(,,)); // 获得桌面设备描述符
CWindowDC wdc(GetDesktopWindow()); // 使用SelectObject函数来实现把GDI对象选入设备描述表中
// SelectObject函数返回指向先前被选对象的指针
CPen* pOldPen =wdc.SelectObject(&pen);
wdc.MoveTo(originP);
wdc.LineTo(point); // 把先前的GDI对象选入设备描述表,以便恢复到先前的状态
wdc.SelectObject(pOldPen);
#pragma endregion
CEditView::OnLButtonUp(nFlags, point);
}
2. 使用画刷绘制一块区域
实现代码:
// CDrawRegionView 消息处理程序 // 鼠标左键按下消息处理函数
void CDrawRegionView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
originPoint=point;
CTreeView::OnLButtonDown(nFlags, point);
} // 鼠标左键弹起消息处理函数
void CDrawRegionView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
#pragma region 1. 简单画刷
//// 创建一个红色画刷
//CBrush brush(RGB(255,0,0));
//// 创建并获得设备描述表
//CClientDC dc(this);
//// 利用红色画刷填充鼠标拖拽过程中形成的矩形区域
//dc.FillRect(CRect(originPoint,point),&brush);
#pragma endregion #pragma region 2. 位图画刷
// 创建位图对象
CBitmap bitmap;
// 加载位图资源
bitmap.LoadBitmapW(IDB_BITMAP1);
// 创建位图画刷
CBrush bitmapBrush(&bitmap);
// 创建并获得设备描述表
CClientDC dc2(this);
// 利用位图画刷填充鼠标拖拽过程中形成的矩形区域
dc2.FillRect(CRect(originPoint,point),&bitmapBrush); #pragma endregion #pragma region 3. 透明画刷
// 创建并获得设备描述表
CClientDC dc3(this); // 创建一个空画刷
CBrush *pBrush =CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); // 将空画刷选入设备描述表中
CBrush *oldBrush =dc3.SelectObject(pBrush);
// 绘制一个矩形
dc3.Rectangle(CRect(originPoint,point)); // 恢复先前的画刷
dc3.SelectObject(oldBrush);
#pragma endregion
CTreeView::OnLButtonUp(nFlags, point);
}
3. 绘制连续的线条
实现代码:
void CDrawContinuousLineView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
originPt =point;
isBeginDraw=true;
CEditView::OnLButtonDown(nFlags, point);
} void CDrawContinuousLineView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
isBeginDraw=false;
CEditView::OnLButtonUp(nFlags, point);
} // 鼠标移动消息的处理函数
void CDrawContinuousLineView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this); // 创建一个红色,宽度为1的实现画笔
CPen pen(PS_SOLID,,RGB(,,));
// 把创建的画笔选入设备描述表中
CPen* oldPen =dc.SelectObject(&pen);
if(isBeginDraw==true)
{
dc.MoveTo(originPt);
dc.LineTo(point);
// 修改线段的起点
originPt=point;
} // 恢复设备描述表
dc.SelectObject(oldPen);
CEditView::OnMouseMove(nFlags, point);
}
完整的实现源码下载:C++实现绘图
深入浅出话VC++(3)——VC++实现绘图操作的更多相关文章
- WPF学习之深入浅出话模板
图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本.列表.图形等多种形式立体显示. 用户体验在GUI程 ...
- MATLAB绘图功能(1) 二维高层绘图操作
文末源代码 部分源代码 %% 基本绘图操作 x=:*pi; y=sin(x); plot(x,y); % 第二个参数为矩阵 y1=sin(x); y2=cos(x); y3=0.002*exp(x); ...
- 封装CoreGraphics的API简化绘图操作
封装CoreGraphics的API简化绘图操作 效果 说明 1. 将CoreGraphics的API接口抽象为对象,让绘图变得简单易懂 2. 简化常用的绘制操作 3. 源码长期更新 源码 https ...
- Android通过onDraw实现在View中绘图操作
Android绘图操作,通过继承View实现,在onDraw函数中实现绘图. 下面是一个简单的例子: public class AndroidTest extends Activity { /** C ...
- matlab学习笔记8 基本绘图命令-基本绘图操作
一起来学matlab-matlab学习笔记8 基本绘图命令_2基本绘图操作 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...
- IDG资本全球拼图:近10年揽26家独角兽,最敢出手VC再造"VC+"
IDG资本全球拼图:近10年揽26家独角兽,最敢出手VC再造"VC+" 2017-04-01 15:33 两天前,IDG资本合伙人过以宏提出的“VC+”,又有了新的内涵——全球 ...
- 深入浅出话VC++(2)——MFC的本质
一.引言 上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序.MFC(Microsoft Foundation Clas ...
- 深入浅出话VC++(1)——Windows程序内部运行机制
一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...
- VC++大数据量绘图时无闪烁刷屏技术实现(我的理解是,在内存上作画,然后手动显示,而不再直接需要经过WM_PAINT来处理了)
http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序 ...
随机推荐
- python默认的是17位小数的精度,但是这里有一个问题,就是当我们的计算需要使用更高的精度(超过17位小数)的时候该怎么做呢?
1. 使用格式化(不推荐) 1 2 3 >>> a = "%.30f" % (1/3) >>> a '0.3333333333333333148 ...
- CSS3常用选择器(一)
在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素.比如最常用到的#id,.class,标签选择器. 随着CSS3到来,增加了很多新型选择器,这里就常用的做一个总结. 1.属性选择器. 在c ...
- args
java 中args一般存在main主类方法内,String args[ ]或者String[ ] args表示给主方法传一个字符串数组. 而args是一个字符串数组的变量名,不是关键字,是argum ...
- css属性word-spacing和letter-spacing的区别
word-spacing和letter-spacing用来定义单词或者字母之间的水平空白间隔.顾名思义,word-spacing定义了单词之间的空白,例如: <div style="w ...
- Oracle 取随机数(转)
1.从表中随机取记录 select * from (select * from staff order by dbms_random.random) where rownum < 4 ...
- windows 系统下 Firefox hostadmin插件无法修改Host
firefox hostAdmin插件无法修改Host了,提示“ write hosts file failed check permissions”,肯定是权限出现了问题??? 使用管理员权限打开c ...
- C#版SQLHelper.cs类
using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...
- 设置随处都可以调用tcc的编译环境
tcc的短小精悍,编译速度快,以及独特的直接运行c代码功能,让tcc成为一个出色的编译器,横跨linux,windows平台. 笔者目前尚处于学习c(ANSI c/ISO c)阶段,为了加强手写代码的 ...
- 网易视频云技术分享:linux软raid的bitmap分析
网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PAAS服务,在线教育.远程医疗.娱乐秀场.在线 ...
- XE3随笔8:关于乱码
以下例子都会出现乱码, 虽然都可以有变通的方案, 但如果不乱码就太好了! unit Unit1; interface uses Windows, Messages, SysUtils, Varia ...