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++在两个按钮之间连直线和折线的主要内容,如果未能解决你的问题,请参考以下文章