VC++在两个按钮之间连直线和折线

Posted bcbobo21cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++在两个按钮之间连直线和折线相关的知识,希望对你有一定的参考价值。

在两个按钮之间连线;按钮大小都一样;如果按钮完全平行,连直线;如果按钮不平行,连的是一条折线;

对话框工程;先设计界面;

按钮大小做成一样;button1和3,2和4,左端对齐; 1和2,顶端对齐;3和4,顶端错开一个距离;

然后编写代码;最终效果如下;想要实现的效果是把线连到按钮边的中点;是按此思路写的代码,最终实现效果有些差距;下面来看一下代码,并分析原因;

对话框头文件加入如下变量;

    CRect crect1;
	int w;
	int h;
	int top1;
	int top2;
	int top3;
	int top4;
	int left1;
	int left2;
	int left3;
	int left4;
	int wz, hz;
	CDC *pDC;

w,按钮宽度;h,高度;top1-4,四个按钮顶部距离父窗口顶边的距离,像素;left1-4,4个按钮的左边距,距离父窗口;wz,连的是折线时,折线第一段的长度;折线有三段,第一段和第三段长度一样;第二段指中间竖立的一小段;

第一条线的起点,x坐标是,left1加上w,y坐标是,top1 + h/2;看上去没错;x坐标,按钮1的左边距加上按钮的宽度;y坐标,按钮1的顶部边距,加上按钮高度的一半;其他计算类似;中间一小段折线的长度是,(top4 - top3)/2;

对话框OnInitDialog()函数做初始化;

    GetDlgItem(IDC_BUTTON1)->GetWindowRect(crect1);	
	w = crect1.Width();
	h = crect1.Height();
	top1 = crect1.top;
	left1 = crect1.left;
	GetDlgItem(IDC_BUTTON2)->GetWindowRect(crect1);
	top2 = crect1.top;
	left2 = crect1.left;
	GetDlgItem(IDC_BUTTON3)->GetWindowRect(crect1);
	top3 = crect1.top;
	left3 = crect1.left;
	GetDlgItem(IDC_BUTTON4)->GetWindowRect(crect1);
	top4 = crect1.top;
	left4 = crect1.left;
	pDC = GetDC();

    获取各变量的值,获取设备描述表指针以备绘图;

四个按钮的单击代码;运行起来,单击按钮1,再单击按钮2,绘第一条线;单击按钮3,再单击按钮4,绘第二条线;

void CzhexiandemoDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	
	int x = 0,y=0;
	x = left1 + w;
	y = top1 + h / 2;
	pDC->MoveTo(x, y);
}

void CzhexiandemoDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	int x = 0, y = 0;
	x = left2;
	y = top2 + h / 2;
	pDC->LineTo(x, y);
}

void CzhexiandemoDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	int x = 0;
	x = left3 + w;
	int y = 0;
	y = top3 + h / 2;
	wz = (left4 - left3 - w) / 2;
	pDC->MoveTo(x, y);
	pDC->LineTo(x + wz, y);
}

void CzhexiandemoDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	hz = (top4 - top3) / 2;
	pDC->LineTo(left3 + w + wz, top3 + h / 2 + hz);
	pDC->LineTo(left4, top3 + h / 2 + hz);	
}

但是连线的起点和终点的y坐标没有定位到按钮边的中点;

可能是VC++的窗体坐标系还未完全简化,距离窗体顶部的像素大小包含窗口标题条在内;C# winform 是什么情况有时间可以看一下;

有时间再继续;可以把连线绘制为箭头,实现终点随鼠标移动的动态提示线等;

以上是关于VC++在两个按钮之间连直线和折线的主要内容,如果未能解决你的问题,请参考以下文章

在两个纬度和经度之间绘制折线

Flutter:折线显示直线

道路 API 捕捉折线只是一条直线

MATLAB 中加一条直线

片段和活动之间没有传递值

如何在片段中使用按钮[关闭]