如何使用Delphi在窗口非客户区中使用自定义光标。

3
我有一个定制的Delphi VCL控件,它截取WM_NCHITTEST消息并返回HTCAPTION,使控件可在其父窗口上移动。
那部分功能正常工作,但返回HTCAPTION时,当悬浮在该控件上时,我的自定义光标也会被重置为Windows默认光标。有没有办法可以使用HTCAPTION并仍显示我的自定义光标?
注意:我知道如何实现控件移动而不使用HTCAPTION并解决光标问题。
1个回答

5
使用 WM_SETCURSOR 消息处理程序:
procedure TCustomVCLControl.WMSetCursor(var Message: TWMSetCursor);
begin
  SetCursor(Screen.Cursors[cr..]);
  Message.Result := 1;
end;

难道不是更好的方法是这样写吗:if Message.HitTest <> HTCAPTION then SetCursor(...); - TLama
1
@TLama - 我理解这个问题的意思是,命中测试始终是HTCAPTION。如果不是,那当然可以。 - Sertac Akyuz
1
@TLama - 点击测试与点击无关,它仅通过位置进行识别。但结果会影响点击的效果。也许它的名称有点不准确。 - Sertac Akyuz
@TLama - 如果您不更改光标,则默认窗口过程将将其设置为默认光标(箭头)。问题要求如何使用不同的光标。您无法获取 WM_NCHITTEST 或 WM_SETCURSOR,因为它们不会被发布到队列中。此外,那可能会阻止按钮按下生成鼠标按下消息。 - Sertac Akyuz
@TLama - 可能混淆在于VCL对光标的处理。如果命中测试不是HTCLIENT,则什么也不做。对于此控件,它始终为HTCAPTION。(什么也不做意味着VCL不会调用SetCursor,而是默认窗口过程使用默认光标调用它。) - Sertac Akyuz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接