Visual c++ 类似于“这个”的儿童窗口的东西`

Visual c++ 类似于“这个”的儿童窗口的东西`,visual-c++,mfc,Visual C++,Mfc,我是编程新手。我正在编写一个基于对话框的应用程序,它有一个静态控件。使用 Using void CMy1stDlg::OnMouseMove(UINT nFlags, CPoint point) { if (this == GetCapture()) { CClientDC aDC(this); aDC.SetPixel(point, RGB(255,0,0)); } } 我可以创建如下结果 然而,我想要的是,鼠标的轨迹只在静态窗

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

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));
    }   
}
我怎样才能得到我想要的?是否有任何方法可以为静态窗口获取类似于此的内容?我将非常感谢您对我的帮助

好的,试试这个:

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()

请阅读一本关于Windows编程的书。绘画只能在窗口的WM_绘画信息内完成!这是错误的,因为您在对话框窗口(
CClientDC aDC(This)
)上绘制(“绘制”),而应该在静态控件上绘制/绘制,因为这会模糊对话框窗口的这一部分。@xMRI,不是真的,
CClientDC()
调用
GetDC()
,它不需要失效和处理
WM_PAINT
消息,它完全用于直接“绘制”。哦,对不起,刚刚意识到我错了,您已经在对话框上绘制了,因为您的静态控件只是一个框架。请尝试
GetDlgItem(IDC_MYSTATIC))->GetWindowRect()
(或
pMYSTATIC->GetWindowRect()
),然后
PtInRect(&rect,&point)
检查您是否在所需的矩形内。矩形可能需要缩小(到它的客户端区域)。如果不完全了解Windows API,就不可能精通MFC。亲爱的@Constantine Georgiou:非常感谢您友好而有用的回复。对不起,我现在无权对你的答案投赞成票。您的回答帮助我澄清了
GetWindowRect
GetClientRect
之间的区别。因为我需要坐标相对于静态的左上角(即静态的左上角是(0,0)),所以我调整了
ScreenToClient(&rect)
CClientDC(本)分别如下:
GetDlgItem(IDC\u MYSTATIC)->ScreenToClient(&rect)
CClientDC(GetDlgItem(IDC_BGSTATIC))。然而,经过调整后,我发现轨迹落在鼠标后面。我怎样才能克服这个问题?谢谢。嗯,
结构(好的,类)是相对于这里的对话框客户端区域的(这也是
CClientDC(this)
)。但是
CClientDC(GetDlgItem(IDC\u BGSTATIC))
位于static的客户端区域坐标中。所以你需要转换它。由于没有直接的客户端到客户端转换的方法,我会调用
ClientToScreen(&point)
,然后调用
GetDlgItem(IDC\u BGSTATIC)->screenttoclient(&point)
。如果您没有(通常没有)对话框中的静态窗口,转换只是一个偏移量,您可以存储第一次转换的结果并使用它,而不是调用函数。