如何隐藏picture控件外的图线

flyingba 2019-01-05 02:52:15
在picture控件上画直线时,由于起点的X坐标和Y坐标均为负值,因此,这条直线有一部分在该picture控件之外了。

请教该如何隐藏此部分在picture控件之外的线段?

谢谢。
...全文
113 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingba 2019-01-05
  • 打赏
  • 举报
回复
成了! 太感谢您了,楼上的兄弟!
schlafenhamster 2019-01-05
  • 打赏
  • 举报
回复

CWnd* pPicWnd=GetDlgItem( IDC_PicCtrl);
pDC = pPicWnd->GetDC();
pPicWnd->GetClientRect(&rc);
flyingba 2019-01-05
  • 打赏
  • 举报
回复
12楼的兄弟,还是不行啊。 在这里 pDC->GetClientRect(&rc); 出错,显示: error : class "CDC"没有成员"GetClientRect" 今天太麻烦您了。谢谢12楼的兄弟。
schlafenhamster 2019-01-05
  • 打赏
  • 举报
回复
void CMyStatic1::OnPaint()
不是 CTestView:
在 CTestView: 可以:

void CTestView::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CDC *pDC = NULL;
pDC = GetDlgItem(IDC_PicCtrl)->GetDC();//获取picture控件的DC
CRect rc;
pDC->GetClientRect(&rc);
CRgn rgn;
rgn.CreateRectRgn(rc.left,rc.top,rc.right,rc.bottom);
pDC->SelectClipRgn(&rgn);


int X1,Y1,X2,Y2;
X1 = -100;
Y1 = -200;
X2= 100;
Y2= 100;
pDC->MoveTo(X1,Y1);
pDC->LineTo(X2,Y2);
}
flyingba 2019-01-05
  • 打赏
  • 举报
回复
运行结果是上面这个样子的。 下面是我按照10楼修改后的程序: void CTestView::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 /* CDC *pDC = NULL; pDC = GetDlgItem(IDC_PicCtrl)->GetDC();//获取picture控件的DC int X1,Y1,X2,Y2; X1 = -100; Y1 = -200; X2= 100; Y2= 100; pDC->MoveTo(X1,Y1); pDC->LineTo(X2,Y2); */ } void CTestView::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CFormView::OnPaint() CRect rc; GetClientRect(&rc); CRgn rgn; rgn.CreateRectRgn(rc.left,rc.top,rc.right,rc.bottom); dc.SelectClipRgn(&rgn); int X1,Y1,X2,Y2; X1 = -100; Y1 = -200; X2= 100; Y2= 100; dc.MoveTo(X1,Y1); dc.LineTo(X2,Y2); } 这次有些象了,只是这根线段的位置不对。 无论怎样,还是要谢谢10楼。
schlafenhamster 2019-01-05
  • 打赏
  • 举报
回复
void CMyStatic1::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rc;
GetClientRect(&rc);
CRgn rgn;
rgn.CreateRectRgn(rc.left,rc.top,rc.right,rc.bottom);
dc.SelectClipRgn(&rgn);


int X1,Y1,X2,Y2;
X1 = -100;
Y1 = -200;
X2= 100;
Y2= 100;
dc.MoveTo(X1,Y1);
dc.LineTo(X2,Y2);
}
flyingba 2019-01-05
  • 打赏
  • 举报
回复
在OnPaint()中对这个picture控件,绘制同样的直线,得到同样的结果:在picture控件外的线段还是显示在那里。
schlafenhamster 2019-01-05
  • 打赏
  • 举报
回复
派生一个类 ,在 OnPaint 中 绘制 、
flyingba 2019-01-05
  • 打赏
  • 举报
回复
坐标是相对picture控件的。 因为,将(X1,Y1)改为(0,0)后,那条直线就是从picture控件的左上角画出来的。
schlafenhamster 2019-01-05
  • 打赏
  • 举报
回复
需要 ReleaseDC(pDC)

你那个 坐标 是 screen 坐标 ?
flyingba 2019-01-05
  • 打赏
  • 举报
回复
我要的就是从(X1,Y1) 画直线到(X2,Y2) ,但是不需要picture控件外面的直线。 但是不能改变起始点到另外一个点,这样画出来的直线就不是我想要的了。
flyingba 2019-01-05
  • 打赏
  • 举报
回复
上面是运行的结果,直线画到picture控件的外面去了。 下面是具体的程序: void CTestView::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 CDC *pDC = NULL; pDC = GetDlgItem(IDC_PicCtrl)->GetDC();//获取picture控件的DC int X1,Y1,X2,Y2; X1 = -100; Y1 = -200; X2= 100; Y2= 100; pDC->MoveTo(X1,Y1); pDC->LineTo(X2,Y2); }
schlafenhamster 2019-01-05
  • 打赏
  • 举报
回复
客户区 从 0,0 开始
if(X1<0) X1=0;
if(Y1<0) Y1=0;

pDC->MoveTo(X1,Y1);
flyingba 2019-01-05
  • 打赏
  • 举报
回复
程序是这样写的: CDC *pDC = NULL; pDC = GetDlgItem(IDC_PicCtrl)->GetDC();//获取picture控件的DC pDC->MoveTo(X1,Y1); pDC->LineTo(X2,Y2); 在程序中,已经明确试图获取picture控件了。 其中的X1和Y1的值为负值。 直线还是画到picture控件的外面了。 问题出在哪里,该如何修改呢? 请指教,谢谢。
schlafenhamster 2019-01-05
  • 打赏
  • 举报
回复
在picture控件上画 ,一定 要以 picture控件 客户区 为 基准 , 画出去 是 不会 显示的, 你用的DC 一定 不是 picture控件 的!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧