【问题标题】:Something for a child window analogous to `this`类似于 `this` 的子窗口的东西
【发布时间】:2018-04-21 02:03:47
【问题描述】:

我是编程新手。我正在编写一个基于对话框的应用程序,它上面有一个静态控件。使用

Using
void CMy1stDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    if (this == GetCapture())
    {
        CClientDC aDC(this);
        aDC.SetPixel(point, RGB(255,0,0));
    }   
}

我可以创建类似的结果

但是我想要的是鼠标的轨迹只在静态窗口中绘制。我在 MSDN 中找不到对this 的引用,也不知道为什么下面的方法会失败。

void CMy1stDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    CWnd* pMYSTATIC = GetDlgItem (IDC_MYSTATIC);    //IDC_MYSTATIC is the ID of the static control
    if (pMYSTATIC == GetCapture())
    {
        CClientDC aDC(pMYSTATIC);
        aDC.SetPixel(point, RGB(255,0,0));
    }   
}

我怎样才能得到我想要的?是否有任何方法可以为类似于this 的静态窗口获取一些东西?我将不胜感激这些方面的任何帮助。

【问题讨论】:

  • 请阅读一本关于 Windows 编程的书。绘画只能在窗口的 WM_PAINT 消息内完成!比你在这里问的所有问题都消失了。
  • 这是错误的,因为您在对话框窗口 (CClientDC aDC(this)) 上绘制(实际上是“绘制”) - 您应该在静态控件上绘制/绘制,因为这会掩盖这部分对话窗口。而@xMRI,不是真的,CClientDC() 调用GetDC(),这不需要无效和处理WM_PAINT 消息,它完全用于直接“绘图”。
  • 糟糕,抱歉,刚刚意识到我错了,您已经在对话框上绘图了,因为您的静态控件只是一个框架。尝试GetDlgItem(IDC_MYSTATIC))->GetWindowRect()(或pMYSTATIC->GetWindowRect())然后PtInRect(&rect, &point) 以检查您是否在所需的矩形内。矩形可能需要缩小(到其客户专用区域)。
  • 如果没有对 Windows API 的扎实了解,您就无法希望精通 MFC。从 Petzold 的 Programming Windows® 开始。

标签: visual-c++ mfc


【解决方案1】:

好的,试试这个:

void CMy1stDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    CRect rect;
    // Get static control's rectangle
    GetDlgItem(IDC_MYSTATIC)->GetWindowRect(&rect);
    // Convert it to client coordinates
    ScreenToClient(&rect);
    // Check if mouse pointer is inside the static window, if so draw the pixel
    if (rect.PtInRect(point))
    {
        CClientDC dc(this);
        dc.SetPixel(point.x, point.y, RGB(255,0,0));
    }
}

在检查是否绘制像素之前,此代码可能还需要一些修复,例如缩小矩形(到其仅限客户端的区域)。

请注意,您不需要检查GetCapture();如果您的对话框没有捕获鼠标,它无论如何都不会收到此消息。

此外,所有这些函数都是 Windows SDK 的封装,例如 ClientDC() 类,基本上封装了 GetDC()/ReleaseDC()

【讨论】:

  • 亲爱的@Constantine Georgiou:非常感谢您的友好和有用的回复。抱歉,我现在无权投票赞成您的答案。您的回答帮助我弄清楚GetWindowRectGetClientRect 之间的区别。
  • 由于我需要坐标相对于静态的左上角(即静态的左上角是(0,0)),我调整你的ScreenToClient(&rect);CClientDC dc(this);分别为:GetDlgItem(IDC_MYSTATIC)->ScreenToClient(&rect);CClientDC dc (GetDlgItem (IDC_BGSTATIC));。但是,经过调整后,我发现轨迹落在鼠标后面。我该如何克服呢?谢谢。
  • 嗯,point struct (ok, class) 与此处的对话客户区相关(CClientDC dc(this) 也是如此)。但是CClientDC dc (GetDlgItem (IDC_BGSTATIC)) 在静态的客户区坐标中。所以你需要转换它。由于无法直接进行客户端到客户端的转换,我会先调用ClientToScreen(&point),然后再调用GetDlgItem (IDC_BGSTATIC)->ScreenToClient(&point)。如果您不(通常不)对话框中的静态窗口,则转换只是一个偏移量,您可以存储第一次转换的结果并使用它而不是调用函数。
猜你喜欢
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2011-04-18
  • 2011-10-03
相关资源
最近更新 更多