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)
。如果您没有(通常没有)对话框中的静态窗口,转换只是一个偏移量,您可以存储第一次转换的结果并使用它,而不是调用函数。