视窗 10 :笔(手写笔)在 MFC 应用程序上不起作用

Windows 10 : Pen (stylus) not working on MFC application

本文关键字:应用 MFC 应用程序 程序上 不起作用 手写笔 视窗      更新时间:2023-10-16

我有一个MFC应用程序,可以在Windows 7下与Pen(Stylus(一起使用,但不幸的是,它不适用于Windows 10。

  • Windows 7下,我可以使用手写笔垂直滚动而无需使用(单击和拖动(滚动条,我可以通过单击并从对话框中的任意位置拖动来垂直滚动(表单视图(
  • Windows 10下,如果不使用(单击并拖动(滚动条,我无法使用手写笔垂直滚动。我必须单击(并拖动(滚动条上的手写笔才能垂直滚动

我的需要:
我需要能够使用手写笔垂直滚动,而无需使用(单击和拖动(Windows 10 上的滚动条

详细信息:
我使用的是带有Visual Studio 2010的Windows 10。

我的意见
我认为MFC100的版本.dll(与我的Visual Studio 2010有关(可能不支持Windows 10下的手写笔功能,因为代码在Windows 7下可以正常工作

有人已经遇到过这个问题吗? 谢谢。

我发布这个答案是为了帮助与我情况相同的人。

1. 简介

可以使用(这可能不是存在的唯一方法(来完成与滚动条的交互:

  • SetScrollPos与ScrollWindow相结合。第一个滚动裸滚动,第二个滚动窗口的内容
  • ScrollToPosition,可滚动裸露的滚动和窗口的内容

第一种方法(SetScrollPos与ScrollWindow相结合(需要管理所有滚动条信息:可滚动大小,当前位置,...并在每个OnSize((上重新计算它(这不是太微不足道...

使用 seconde 方法(ScrollToPosition(模式,我们所要做的就是调用具有所需滚动大小的ScrollToPosition。我们不必管理裸露滚动的细节,Windows 为我们做到了!

由于我不知道的某种原因,Windows 10上的stylus滚动功能在Windows 7上没有相同的行为:滚动条滚动但不滚动窗口的内容!!

2. 解决方案

在这个问题上花了几个小时,我得出结论,解决此问题的简单解决方案是尽可能多地使用 ScrollToPosition 函数。在这种情况下,您只需要计算滚动大小(delta(,其定义如下:

  • 按下鼠标按钮时启动(斯图利斯指向((使用ON_WM_LBUTTONDOWN(
  • 拖动期间延长/减少(使用ON_WM_MOUSEMOVE(
  • 松开按钮时结束(使用 ON_WM_LBUTTONUP(

您所要做的就是使用计算delta调用ScrollToPosition函数。这将允许您从极其复杂的管理模式移动到如下所示的一些内容:

ON_WM_LBUTTONDOWN

void CMyView::OnLButtonDown (UINT nFlags, CPoint point) 
{
// Code here ...
POINT p;
GetCursorPos(&p);
ScreenToClient ( &p); // Convert to screen coordinates
m_dragPosition = p; // m_dragPosition : member variable to store click position
m_bMouseDown = true; // Set Flag to true
CWnd::OnLButtonDown (nFlags, point) ;
}  

ON_WM_LBUTTONUP

void CMyView::OnLButtonUp (UINT nFlags, CPoint point) 
{
// Code here ...  
m_bMouseDown = false;
CWnd::OnLButtonUp(nFlags, point);
}

ON_WM_MOUSEMOVE

void CMyView::OnMouseMove(UINT nFlags, CPoint point) 
{
int delta = p.y - m_dragPosition.y;
// Use absolute value to take into account top/bottom scrolling
if ( abs (delta) > SCROLLING_STEP_SIZE)
{
CPoint pp = GetScrollPosition (); // Get current scrollbar position
pp.y += -delta;
pp.x = 0;  // I'm intersting only for vertical scrolling
ScrollToPosition (pp);   // Scroll to new position
UpdateWindow (); // This redraw new showed area
m_dragPosition = p; // Update drag position
}
}  

通过添加它,您可以避免明确的管理,这根本不是微不足道的......
希望这对那些和我情况相同的人有所帮助