怎么在一条弧的两端画上实体箭头? 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵,好像没有直接的API哟! 可能要画一Polygon来实现. moveto lineto也就几条线 //Draw Triangle double dAngle = 0.0; CPoint trigle[3]; if(sqrt( (m_ptStart.x - m_ptEnd.x)*(m_ptStart.x - m_ptEnd.x) + (m_ptStart.y - m_ptEnd.y)*(m_ptStart.y - m_ptEnd.y) ) > 10) { double ptCenterx,ptCentery; ptCenterx = m_ptStart.x + double(m_ptEnd.x - m_ptStart.x)/2; ptCentery = m_ptStart.y + double(m_ptEnd.y - m_ptStart.y)/2; //求得三角形的三个顶点 if((m_ptStart.x - m_ptEnd.x) == 0) //竖直 { trigle[0].y = long(ptCentery + (m_ptStart.y > m_ptEnd.y ? -ARROWLENGTH*3 : ARROWLENGTH*3));//A trigle[0].x = long(ptCenterx); trigle[1].y = long(ptCentery);//B trigle[1].x = long(ptCenterx - ARROWLENGTH - 2); trigle[2].y = long(ptCentery);//C trigle[2].x = long(ptCenterx + ARROWLENGTH + 2); } else if((m_ptStart.y - m_ptEnd.y) == 0) //水平 { trigle[0].x = long(ptCenterx + (m_ptStart.x > m_ptEnd.x ? -ARROWLENGTH*3 : ARROWLENGTH*3));//A trigle[0].y = long(ptCentery); trigle[1].x = long(ptCenterx);//B trigle[1].y = long(ptCentery - ARROWLENGTH*1.2); trigle[2].x = long(ptCenterx);//C trigle[2].y = long(ptCentery + ARROWLENGTH*1.2); } else //rotate { double trigle0x = 0.0,trigle0y = 0.0; double dTemp = 0.0; double ratio = 0.0; double b = 0.0; dAngle = double(m_ptStart.y - m_ptEnd.y) / double(m_ptStart.x - m_ptEnd.x); //斜率 ratio = - 1 / dAngle; //第三象限和第一象限dAngle是正的 if(m_ptStart.y > m_ptEnd.y && m_ptStart.x < m_ptEnd.x) dAngle = -dAngle; if(m_ptStart.y < m_ptEnd.y && m_ptStart.x > m_ptEnd.x) dAngle = -dAngle; if(m_ptStart.y > m_ptEnd.y) //起始点在下 trigle0y = long(ptCentery - ARROWLENGTH*3*sin(atan(dAngle))); else //起始点在上 trigle0y = long(ptCentery + ARROWLENGTH*3*sin(atan(dAngle))); if(m_ptStart.x > m_ptEnd.x) //起始点在右 trigle0x = long(ptCenterx - ARROWLENGTH*3*cos(atan(dAngle))); else //起始点在左 trigle0x = long(ptCenterx + ARROWLENGTH*3*cos(atan(dAngle))); trigle[0].x = long(trigle0x); trigle[0].y = long(trigle0y); b = ptCentery - ratio * ptCenterx; dTemp = ptCenterx - ARROWLENGTH*sin(atan(dAngle))*1.2; trigle[1].x = long(dTemp); trigle[1].y = long(ratio * dTemp + b); dTemp = ptCenterx + ARROWLENGTH*sin(atan(dAngle))*1.2; trigle[2].x = long(dTemp); trigle[2].y = long(ratio * dTemp + b); } CRgn rgnPointer; rgnPointer.CreatePolygonRgn(trigle,3,WINDING); CBrush pointKnob; if(m_hiton) pointKnob.CreateSolidBrush(m_colorSelect); else pointKnob.CreateSolidBrush(m_colorDefault); pMemDC->FillRgn(&rgnPointer, &pointKnob); pointKnob.DeleteObject(); rgnPointer.DeleteObject(); }这是一条直线的中点处画箭头的代码 你参考一下 直线的两个点为ptStart和ptEnd 按钮的黑色边框 关于printf的问题~ 有些难搞定的超时问题 怎么实现图像基于任意点的放缩? 哪里有网络程序开发的书籍....... 关于一个类似CRectTracker的设计问题 VC写的程序如何可以输入德文并可以保存到文件?急!!! 有关文件传输超时的问题? 请问:关于制作平面三态下压按钮。 嗨,各位高手!! 怎样在程序中确定是否选择了“自动获得dns服务器地址”这个选项 有关对话框以及其控件的问题
也就几条线
double dAngle = 0.0;
CPoint trigle[3];
if(sqrt( (m_ptStart.x - m_ptEnd.x)*(m_ptStart.x - m_ptEnd.x) + (m_ptStart.y - m_ptEnd.y)*(m_ptStart.y - m_ptEnd.y) ) > 10)
{
double ptCenterx,ptCentery;
ptCenterx = m_ptStart.x + double(m_ptEnd.x - m_ptStart.x)/2;
ptCentery = m_ptStart.y + double(m_ptEnd.y - m_ptStart.y)/2;
//求得三角形的三个顶点
if((m_ptStart.x - m_ptEnd.x) == 0) //竖直
{
trigle[0].y = long(ptCentery + (m_ptStart.y > m_ptEnd.y ? -ARROWLENGTH*3 : ARROWLENGTH*3));//A
trigle[0].x = long(ptCenterx);
trigle[1].y = long(ptCentery);//B
trigle[1].x = long(ptCenterx - ARROWLENGTH - 2);
trigle[2].y = long(ptCentery);//C
trigle[2].x = long(ptCenterx + ARROWLENGTH + 2);
}
else if((m_ptStart.y - m_ptEnd.y) == 0) //水平
{
trigle[0].x = long(ptCenterx + (m_ptStart.x > m_ptEnd.x ? -ARROWLENGTH*3 : ARROWLENGTH*3));//A
trigle[0].y = long(ptCentery);
trigle[1].x = long(ptCenterx);//B
trigle[1].y = long(ptCentery - ARROWLENGTH*1.2);
trigle[2].x = long(ptCenterx);//C
trigle[2].y = long(ptCentery + ARROWLENGTH*1.2);
}
else //rotate
{
double trigle0x = 0.0,trigle0y = 0.0;
double dTemp = 0.0;
double ratio = 0.0;
double b = 0.0;
dAngle = double(m_ptStart.y - m_ptEnd.y) / double(m_ptStart.x - m_ptEnd.x);
//斜率
ratio = - 1 / dAngle; //第三象限和第一象限dAngle是正的
if(m_ptStart.y > m_ptEnd.y && m_ptStart.x < m_ptEnd.x)
dAngle = -dAngle;
if(m_ptStart.y < m_ptEnd.y && m_ptStart.x > m_ptEnd.x)
dAngle = -dAngle; if(m_ptStart.y > m_ptEnd.y) //起始点在下
trigle0y = long(ptCentery - ARROWLENGTH*3*sin(atan(dAngle)));
else //起始点在上
trigle0y = long(ptCentery + ARROWLENGTH*3*sin(atan(dAngle))); if(m_ptStart.x > m_ptEnd.x) //起始点在右
trigle0x = long(ptCenterx - ARROWLENGTH*3*cos(atan(dAngle)));
else //起始点在左
trigle0x = long(ptCenterx + ARROWLENGTH*3*cos(atan(dAngle)));
trigle[0].x = long(trigle0x);
trigle[0].y = long(trigle0y);
b = ptCentery - ratio * ptCenterx;
dTemp = ptCenterx - ARROWLENGTH*sin(atan(dAngle))*1.2;
trigle[1].x = long(dTemp);
trigle[1].y = long(ratio * dTemp + b); dTemp = ptCenterx + ARROWLENGTH*sin(atan(dAngle))*1.2;
trigle[2].x = long(dTemp);
trigle[2].y = long(ratio * dTemp + b);
} CRgn rgnPointer;
rgnPointer.CreatePolygonRgn(trigle,3,WINDING);
CBrush pointKnob;
if(m_hiton)
pointKnob.CreateSolidBrush(m_colorSelect);
else
pointKnob.CreateSolidBrush(m_colorDefault);
pMemDC->FillRgn(&rgnPointer, &pointKnob);
pointKnob.DeleteObject();
rgnPointer.DeleteObject();
}这是一条直线的中点处画箭头的代码 你参考一下 直线的两个点为ptStart和ptEnd