MFC 使用三点画弧

我的第一个MFC程序,花了一些时间了解了网上的很多内容,最后写出来的程序

1.**我的工程名字是: “MAP” **
2.**使用 MFC AppWizard [exe],基于 “基本对话框” **
3.大多需要解释我都加载了程序代码注释里面来了


1.由于使用了鼠标的点击取点的操作,需要在加上相关的库函数
添加在 文件MAPDlg.h 的 CMAPDlg 类里面

protected:
	afx_msg void OnLButtonDown();		//按下鼠标右键
	afx_msg void OnLButtonUp();			//鼠标起来
	afx_msg void OnMouseMove();			//鼠标移动

2.对应的鼠标操作的需要对应的消息映射
添加在 文件MAPDlg.cpp 里面

BEGIN_MESSAGE_MAP(CMAPDlg, CDialog)
	//{
  
  {AFX_MSG_MAP(CMAPDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	//需要添加鼠标操作的的消息映射,以上三行
	ON_WM_LBUTTONDOWN()			//响应鼠标左键按下
	ON_WM_LBUTTONUP()			//响应鼠标左键放开
	ON_WM_MOUSEMOVE()			//响应鼠标移动

	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

再需要添加成员数据,用于保存鼠标取点的数据
添加在 文件MAPDlg.h 的 CMAPDlg 类里面

public:
	CPoint m_point[4]; //点坐标
	int fs,kk;			//记录鼠标状态

在CMAPDlg类的构造函数内,添加对对加入数据的初始化
添加在 文件MAPDlg.hcpp

CMAPDlg::CMAPDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMAPDlg::IDD, pParent)
{
	//{
  
  {AFX_DATA_INIT(CMAPDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	//绘制多边形的点数组
    m_point[0].x=0;
    m_point[0].y=0;
    m_point[1].x=0;
    m_point[1].y=0;
    m_point[2].x=0;
    m_point[2].y=0;
    m_point[3].x=0;
	m_point[3].y=0;
	int choice =0;
	fs=0;
	kk=0;
}

**在对话框里面添加一个按钮,用来清除画的线条,然后双击按钮,添加一个函数 **

void CMAPDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	Invalidate();	//调用窗口的刷新函数
}

三点画弧就是需要注意怎么确定是顺时针还是逆时针
使用一个非成员函数来判断画出来的圆弧的方向是顺时针还是逆时针
添加在 MAPDlg.cpp 里面

	//CPoint a, b, c; 分别为按顺序使用鼠标点下的 三个点
double direction(CPoint a, CPoint b, CPoint c)
{
	return (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x);
}
	//如果返回值大于0为顺时针,小于0为逆时针。

自己定义的一个非成员函数用它来画弧
添加在 MAPDlg.cpp 里面

void DrawMultiArc ( CClientDC&  dc,CPoint p0,CPoint  p1, CPoint p2 )//用三点画弧
{
	CPen PenRed;		//定义画笔的颜色
	PenRed.CreatePen(  PS_SOLID,1,RGB(255,0,0) );//红色实线
	CPen * Oldpen=dc.SelectObject(&PenRed); //记录原始画笔的设置
	
	int iDirection = direction(p0, p1, p2) > 0 ? AD_CLOCKWISE : AD_COUNTERCLOCKWISE;
	dc.SetArcDirection(iDirection);
	
	int a1=2*(p1.x-p0.x);
	int b1=2*(p1.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值