【问题标题】:Windows 10 : Pen (stylus) not working on MFC applicationWindows 10:笔(触控笔)无法在 MFC 应用程序上运行
【发布时间】:2020-09-13 09:25:59
【问题描述】:

我有一个 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下可以正常工作

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

【问题讨论】:

  • “有什么建议吗?” 不是一个可以回答的问题。
  • @IInspectable 建议、想法、解释、解决方案...
  • 有什么问题?请参阅How to Ask
  • @IInspectable 如果不使用(单击并拖动)Windows 10 上的滚动条,我将无法使用触控笔垂直滚动
  • 是的,很好。你需要解决什么问题?您想与 Windows 7 平价吗?如果是这样,您是否要将 Windows 10 的行为移植到 Windows 7?另一种方式?完全是别的东西吗?再次阅读How to Ask

标签: c++ mfc windows-10 stylus-pen


【解决方案1】:

我发布此答案是为了帮助与我处境相同的人。

1.简介

可以使用滚动条进行交互(这可能不是唯一存在的方法):

第一种方法(SetScrollPos 加上ScrollWindow)需要管理所有滚动条信息:可滚动大小、当前位置……并在每个 OnSize() 上重新计算它(这不是太琐碎……)

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

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

2。解决方案

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

您所要做的就是使用计算出的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
   }
}  

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 2018-10-27
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多