我目前正在处理一个多表单应用程序并且在注册del键按下时遇到问题,需要del键的应用程序是一个带有框架的表单,其上绘有可以选择的对象,按下del键通过deleteObjects方法删除所选对象。我目前使用的代码如下
void __fastcall TF_Image::KeyUpKbd( WORD &Key )
{
if(Key == VK_DELETE || Key == VK_DKEY)
{
deleteSelectedObjects();
}
}
(注意:函数调用中还有其他参数,但不使用它们)
TF_Image继承自TFrame
我已经尝试映射除del键之外的其他键,即D键,并且发现该方法被调用没有问题。我发现当按下(物理上)del键时,与KeyUp& KeyDown未被调用。
编辑:所以我试图将DeleteSelectedOb()方法添加到我的WndProc方法中,但运气不佳。
void __fastcall TF_ImgBrowserOA::WndProc(TMessage &Message)
{
if (Message.Msg == WM_KEYDOWN)
{
if (Message.WParam == VK_DELETE)
{
F_Image->DeleteSelectedOb();
}
}
//code that manages window resize
TForm::WndProc(Message);
}
WndProc方法似乎响应击键
答案 0 :(得分:1)
所以在清理了一些其他模块中的代码并删除了不必要的菜单之后,我决定回过头来看看这一部分,在我发现类似的代码实现了类似的功能后,我看不出它们之间的差别很大所以我重新编译并尝试从KeyDown事件中运行我的Delete函数,由于某种原因它只是起作用,我怀疑它归结为另一个在Application中保持焦点的元素的问题。作为一种预防措施,我还将一个SetFocus()称为我需要此代码操作的帧。对我来说,这仍然是一个谜,为什么这不起作用。
答案 1 :(得分:0)
以下是我的TRichEdit控件的一个片段(Script_Edit)。
TWndMethod *PrevWndProc = Script_Edit->WindowProc;
Script_Edit->WindowProc = MyWndProc;
void __fastcall My_Form::MyWndProc(TMessage &Message) {
switch (Message.Msg) {
case WM_KEYDOWN: {
// Check for DELETE and BACKSPACE keys
if( Message.WParam == VK_BACK ||
Message.WParam == VK_DELETE
) {
// Do whatever you need
}
break;
default:
// call default handler if not processed
PrevWndProc(Message);
}
}
使用VCL,你无法更接近消息核心......