mfc picture 控件画图问题
我想在对话框的picture控件上当鼠标单击的时候画上一个像素点,但是没任何反应,以下是在对话框的OnLButtonDown函数里的代码,对于MFC我是菜鸟中的菜鸟,各位...
我想在对话框的picture控件上当鼠标单击的时候画上一个像素点,但是没任何反应,以下是在对话框的OnLButtonDown函数里的代码,对于MFC我是菜鸟中的菜鸟,各位大侠帮帮我吧!
CRect rect;
CWnd* pWnd = GetDlgItem(IDC_PIC1);
pWnd->GetClientRect(&rect);
CDC* pDC = pWnd->GetDC();
pDC->SetPixel(point,RGB(0,255,0));
pWnd->InvalidateRect(&rect); CDialog::OnLButtonDown(nFlags, point);
我新建了一个工程,确实能画出来,但是画出来的和点上去的相距很远!所以应该是坐标的问题,该怎么解决呢? 展开
CRect rect;
CWnd* pWnd = GetDlgItem(IDC_PIC1);
pWnd->GetClientRect(&rect);
CDC* pDC = pWnd->GetDC();
pDC->SetPixel(point,RGB(0,255,0));
pWnd->InvalidateRect(&rect); CDialog::OnLButtonDown(nFlags, point);
我新建了一个工程,确实能画出来,但是画出来的和点上去的相距很远!所以应该是坐标的问题,该怎么解决呢? 展开
展开全部
CRect rect;
CWnd* pWnd = GetDlgItem(IDC_PIC1);
pWnd->GetClientRect(&rect);
CClientDC pDC(this);
pDC.SetPixel(point,RGB(0,0,0));
pWnd->InvalidateRect(&rect);
这样写就对了。原因在于CDC* pDC = pWnd->GetDC();
这一句得到的pDC是以你的图片控件的左上角为(0,0)坐标而画点的,而 CDialog::OnLButtonDown(nFlags, point);里带给我们的是以窗口客户区的左上角为(0,0)坐标的,所以当你鼠标点到picture控件的左上角时,point的值不会是(0,0),而是(55,66)之类的别的坐标,然后pDC就以picture控件的左上角为(0,0)坐标,画一个点。故我们点到是picture控件的左上角,而pDC画出的点却偏离了。 给分吧!呵呵
CWnd* pWnd = GetDlgItem(IDC_PIC1);
pWnd->GetClientRect(&rect);
CClientDC pDC(this);
pDC.SetPixel(point,RGB(0,0,0));
pWnd->InvalidateRect(&rect);
这样写就对了。原因在于CDC* pDC = pWnd->GetDC();
这一句得到的pDC是以你的图片控件的左上角为(0,0)坐标而画点的,而 CDialog::OnLButtonDown(nFlags, point);里带给我们的是以窗口客户区的左上角为(0,0)坐标的,所以当你鼠标点到picture控件的左上角时,point的值不会是(0,0),而是(55,66)之类的别的坐标,然后pDC就以picture控件的左上角为(0,0)坐标,画一个点。故我们点到是picture控件的左上角,而pDC画出的点却偏离了。 给分吧!呵呵
展开全部
你获得的是当前对话框的坐标point,在控件的Wnd里的左上角坐标是从0算起,但是在对话框里控件的左上角坐标就不是0了,需要转换成同一空间的坐标才可以。
CRect rect;
CWnd* pWnd = GetDlgItem(IDC_PIC1);
pWnd->GetWindowRect(&rect); // 获取控件屏幕坐标
ClientToScreen(&point); // 把鼠标坐标转化为屏幕坐标
CDC* pDC = pWnd->GetDC();
point.x -= rect.left; // 同一类坐标可运算,转化为控件内坐标
point.y -= rect.top;
pDC->SetPixel(point,RGB(0,255,0));
pDC->Ellipse(point.x - 5,point.y - 5,point.x + 5,point.y + 5); // 画圆更明显哦
CRect rect;
CWnd* pWnd = GetDlgItem(IDC_PIC1);
pWnd->GetWindowRect(&rect); // 获取控件屏幕坐标
ClientToScreen(&point); // 把鼠标坐标转化为屏幕坐标
CDC* pDC = pWnd->GetDC();
point.x -= rect.left; // 同一类坐标可运算,转化为控件内坐标
point.y -= rect.top;
pDC->SetPixel(point,RGB(0,255,0));
pDC->Ellipse(point.x - 5,point.y - 5,point.x + 5,point.y + 5); // 画圆更明显哦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-04-20
展开全部
存鼠标的位置;
再在MFC对话框里捕获鼠标移动的消息,一旦发现鼠标在MFC对话筐上移动就把鼠标放到 刚才保存的鼠标位置,也就是出界前的最后位置.这样鼠标就移不出去了,
另外好象还有个可以把鼠标限制在指定矩形内移动的函数,那函数叫什么我忘记了......
另外,团IDC网上有许多产品团购,便宜有口碑
再在MFC对话框里捕获鼠标移动的消息,一旦发现鼠标在MFC对话筐上移动就把鼠标放到 刚才保存的鼠标位置,也就是出界前的最后位置.这样鼠标就移不出去了,
另外好象还有个可以把鼠标限制在指定矩形内移动的函数,那函数叫什么我忘记了......
另外,团IDC网上有许多产品团购,便宜有口碑
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
上面的代码可能是无法覆盖控件自己的绘制机制;像pWnd->InvalidateRect(&rect),大概会触发Picture自身原定的重绘机制。
估计你需要自定义CPicture的自绘函数,如之类的OnEraseBackground,OnCtrlColor......
上面你还有一个Bug,GetDC之后,最好要ReleaseDC。
估计你需要自定义CPicture的自绘函数,如之类的OnEraseBackground,OnCtrlColor......
上面你还有一个Bug,GetDC之后,最好要ReleaseDC。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询