2019-11-29-WPF-非客户区的触摸和鼠标点击响应

原文:2019-11-29-WPF-非客户区的触摸和鼠标点击响应

title author date CreateTime categories

WPF 非客户区的触摸和鼠标点击响应

lindexi

2019-11-29 08:44:11 +0800

2019-07-02 17:15:20 +0800

WPF

默认在 WPF 里面是不响应非客户区的鼠标事件,但响应触摸事件

在没有喝下午茶的时候 lsj 告诉我,在项目里面在一个定制的窗口里面的非客户区用鼠标点击不了一个按钮,但是用触摸可以点击按钮。本金鱼一开始认为这是之前修复的问题,但是作为金鱼已经不记得是怎么修了,为了让本金鱼下次遇到触摸或鼠标问题的时候可以解决,于是写了这个博客

本文将会告诉大家在 WPF 里面关于非客户区的触摸和鼠标点击响应

在本文开始之前,需要大家知道非客户区 Non-client Area 的概念,其实就是窗口标题栏大概的意思,详细请看 一起学WPF系列(3):窗体 - Robin Zhang - 博客园WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome) - walterlv

敲黑板,下面的知识点要考

默认的 WPF 程序支持在非客户区响应 Touch 触摸,但不响应鼠标点击和 Pointer 触摸

如果需要在非客户区也就是窗口标题栏支持鼠标点击,那么请在按钮添加附加属性 WindowChrome.IsHitTestVisibleInChrome 为 true 支持鼠标点击

<Button WindowChrome.IsHitTestVisibleInChrome="True"/>

这里的 WindowChrome.IsHitTestVisibleInChrome 支持继承,也就是可以在窗口设置,这样所有在窗口里面的按钮都支持在标题栏点击

如何开启 Pointer 消息请看 win10 支持默认把触摸提升鼠标事件 打开 Pointer 消息

我和 lsj 使用 spy++ 知道在 WPF 的标题栏点击的时候是可以收到 Windows 鼠标消息,也就是这里是 WPF 处理的

我和 lsj 说也许是之前的 WPF 框架的大佬写的时候还不知道有触摸,于是处理了鼠标事件。之后添加了触摸忘了需要去掉,于是触摸就可以使用。现在 lsj 正在看 WPF 的源代码,想要找到是如何让标题栏支持触摸但是不支持鼠标点击

WindowChrome Class (System.Windows.Shell)

WindowChrome.IsHitTestVisibleInChrome Attached Property (Microsoft.Windows.Shell)

关于WM_NCHITTEST消息 - Gang.Wang - 博客园

WM_TOUCH message - Windows applications

原文地址:https://www.cnblogs.com/lonelyxmas/p/12075846.html

时间: 2024-11-08 19:44:54

2019-11-29-WPF-非客户区的触摸和鼠标点击响应的相关文章

窗体皮肤实现 - 重绘窗体非客户区(三)

窗体边框基本的绘制和控制完成,在第二篇中主要遗留的问题. 标题区域图标和按钮没绘制 缩放时客户区显示有问题 解决完下面的问题,皮肤处理基本完整.大致的效果GIF GIF中TShape的颜色表现有些问题,实际是正常的. 绘制标题区域内容 获取标题有效区域 绘制窗体图标 绘制按钮 绘制标题 标题区域主要考虑窗体是否在最大化状态,最大化后实际的标题绘制区域会有变化.可以通过 IsZoomed 或 GetWindowLong(Handle, GWL_STYLE) and WS_MAXIMIZE = WS

窗体皮肤实现 - 重绘窗体非客户区(一)

现在皮肤控件也很多,但每次装一堆控件,使用又繁琐.稍微研究一下内部机制,还是比较简单的. 主要会使用到下面几个消息 1 const 2 WM_NCUAHDRAWCAPTION = $00AE; 3 WM_NCUAHDRAWFRAME = $00AF; 4 5 // 绘制非客户区消息 6 procedure WMNCPaint(var message: TWMNCPaint); message WM_NCPAINT; 7 // 在激活程序时需要相应的消息 8 procedure WMNCActiv

EVT_NC_PAINT 窗口非客户区的绘制

说明 NC就是non client意思,非客户区主要包括标题栏,状态栏,工具栏和边框等区域,目前wxwidgets只是提供了EVT_NC_PAINT 唯一的一个非客户区的事件,在MFC中,还有提供WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCMOUSEMOVE等事件操作,如果需要关联这些事件,就必须要过滤该事件,或者在源码中实现该类事件 目前需要拖动边框的时候,客户区域不变,只是边框变大,等到边框拖动到合适的地方,鼠标弹起,客户区域重绘

C# 绘制窗体客户非客户区要用WM_PAINT和WM_NCPAINT

窗体分为两部分:客户区(Client area)和非客户区(Non-Client area) WM_PAINT消息.OnPaint()方法.GetDC()API函数都是处理窗体客户区绘制的   而标题栏处于非客户区中,所以WM_PAINT消息.OnPaint()方法.GetDC()API函数都用不上   GetWindowDC()是获得整个窗体的画布句柄(Device Context翻译为:设备清单,我习惯称为画布句柄),包括非客户区   GDI的绘制都离不开DC,因为操作系统必须知道你要在什么

窗口非客户区的绘制

1.根据需要,要改变nc区的大小. 响应WM_NCCALCSIZE可改变nc区的大小.关键在于lParam,msdn上说当wParam为True时, lParam为LPNCCALCSIZE_PARAMS的指定,当wParam为False时为LPRECT,做了些实验发现 只有第一次时wParam为False,LPNCCALCSIZE_PARAMS的语义相当复杂,不过我们只用 看第一个RECT就成.它表是窗口客户区的大小.当lParam为LPRECT时,也同样.只用改变 客户区的大小,相应的就改变了

Windows的三种坐标系:屏幕坐标系,非客户区坐标系,客户区坐标系

1. 屏幕坐标系:以屏幕的左上角为原点,如图所示GetWindowRect() 函数获得的 RECT 就是以屏幕坐标系算的. 2. 非客户区坐标系(窗口坐标系)包括标题栏的部分.GetWindowDC 返回的设备环境就是基于此坐标系,一般只在 WM_NCPAINT 消息中使用. 3. 客户区坐标系不包括标题栏,坐标的原点在标题栏下的客户区的左上角.BeginPaint 函数返回的设备环境是基于客户区坐标系的,只在 WM_PAINT 消息中使用,与 EndPaint 函数成对使用.GetDC 函数

窗体皮肤实现 - 重绘窗体非客户区(二)

第一个实现了基本处理.窗体边框的宽度有些肥大,需要进行瘦身. 实现:     1.改变外框线宽度 (WM_NCCALCSIZE)     2.改变外框样式 (WM_WINDOWPOSCHANGING) 通过 WM_NCCALCSIZE 消息可以实现目的. procedure WMNCCalcSize(var message: TWMNCCalcSize); message WM_NCCALCSIZE; procedure TTest.WMNCCalcSize(var message: TWMNC

矩阵结合律的证明-2019.11.29

学习日志-矩阵 矩阵的乘法 证明矩阵乘法的结合律,即证A(BC)=(AB)C 先令出三个矩阵 A_{mn}; B_{np}; C_(p*q) 先看等式右边(AB)C 新矩阵第i行第j列的元素就是AB相乘后的第i行与C的第j列各元素相乘的和 A的第i行乘以B的第1列如下: \begin{equation} \left[ \begin{array}{cccc} a_{i1} & a_{i2} & - & a_{in} \end{array} \right ] \left[ \begin

Windows客户区窗口大小设置

#define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 Windows下设置的窗口(非客户区)长宽分别为800 x 600 所以当我们用函数GetClientRect(hwnd, &rect)获取客户区大小 rect.right为782   rect.bottom为555 所以如果要设置客户区成800 x 600 RECT rect1;RECT rect2;GetWindowRect(hwnd, &rect1);   // 四个坐标分别表示窗口