使用笔擦除
如果选择在应用程序中实现擦除,而不是使用 InkOverlay 对象,则可以使用以下两种方法之一来实现此目的。
使用笔尖
平板电脑笔尖一般用于手写和绘图:但是,笔尖也可用于擦除墨迹。 为此,应用程序必须具有用户可以使用的擦除模式。 在此模式下,使用命中测试来确定光标移动的墨迹。 可以将擦除模式设置为仅删除光标经过的墨迹或与光标路径相交的整个笔划,具体取决于设计或功能注意事项。
有关如何使用擦除模式擦除墨迹的示例,请参阅 墨迹擦除示例。
使用触控笔顶部
若要使用平板电脑笔顶部实现擦除,应用程序必须在光标中查找更改。 若要查找倒置游标,请侦听 CursorInRange 事件以确定游标何时在应用程序的上下文中。 当光标处于范围内时,在 Cursor 对象上查找 Inverted 属性。 如果 Inverted 属性 为 true,则执行命中测试以确定光标移动的墨迹。 擦除与光标路径相交的墨迹或笔划,具体取决于设计或功能注意事项。
有关如何使用笔顶部擦除墨迹的示例,请参阅 墨迹擦除示例。
确定是否启用了笔顶部的擦除
如果用户的特定硬件允许,则用户可以使用笔顶部擦除专为平板电脑设计的应用程序中的墨迹。 此功能可通过“平板电脑和触控笔设置”控制面板对话框的“笔选项”选项卡上的“笔按钮”组框中的检查框访问。 若要检测用户是否为笔顶部启用了擦除,检查以下注册表子项:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\WISP\PEN\SysEventParameters
此 EraseEnable
子项的条目的类型为 REG_DWORD。 对于 enabled,此项的值为 1,对于 disabled,则为 0。 保留其他值以供将来使用。
如果应用程序允许使用笔顶部进行擦除,则应在以下情况下检查并缓存 EraseEnable 条目的值:
- 应用程序将启动。
- 每当应用程序在失去焦点后收到焦点时。
使用此缓存值可相应地修改应用程序的行为。
以下 C# 示例定义了一个 GetEraseEnabled
方法, EraseEnable
用于检查子项的值 SysEventParameters
。 如果条目的值为 1,则 GetEraseEnabled
方法返回 TRUE ;如果该条目的值为 0,则返回 FALSE ;如果条目的值不是 1 或 0,则该方法将引发 InvalidOperationException 异常。 如果子项或条目不存在,方法 GetEraseEnabled
将返回预期值 TRUE 。
private bool GetEraseEnabled()
{
// 0 is disabled, 1 is enabled. The default is enabled
const int Enabled = 1;
const int Disabled = 0;
const int DefaultValue = Enabled;
// Constants for the registry subkey and the entry
const string Subkey =
@"SOFTWARE\Microsoft\WISP\PEN\SysEventParameters";
const string KeyEntry = "EraseEnable";
// Open the registry subkey.
Microsoft.Win32.RegistryKey regKey =
Microsoft.Win32.Registry.CurrentUser.OpenSubKey(Subkey);
// Retrieve the value of the EraseEnable subkey entry. If either
// the subkey or the entry does not exist, use the default value.
object keyValue = (null == regKey) ? DefaultValue :
regKey.GetValue(KeyEntry,DefaultValue);
switch((int)keyValue)
{
case Enabled:
// Return true if erasing on pen inversion is enabled.
return true;
case Disabled:
// Return false if erasing on pen inversion is disabled.
return false;
default:
// Otherwise, throw an exception. Do not assume this is
// a Boolean value. Enabled and Disabled are the values
// defined for this entry at this time. Other values are
// reserved for future use.
throw new InvalidOperationException(
"Unexpected registry subkey value.");
}
}