首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 用向下箭头模拟TAB键问题 [已结帖,结帖人:Songzhiq]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Songzhiq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-06-14 11:54:14 楼主
    一个项目无Windows键盘,只有小键盘,故用向下箭头模拟TAB键盘。遇到一个问题:一个TEdit控件放在TGroupBox中,
    下面放了两个TButton控件,我想用向下箭头键实现Edit1、Button1、Button2三着之间的切换,实现不了。
    (不加TGroupBox于窗体上下面的代码是可以实现的。)
    //---------------------------------------------------------------------------
    //KeyPreview已设true;
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
        if(Key==VK_DOWN)
        {
          PostMessage(Handle,WM_KEYDOWN,VK_TAB,0);
        }
    }
    //---------------------------------------------------------------------------

    望高手相助,谢谢!!!
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Songzhiq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-14 12:09:081楼 得分:0
    Windows键盘上的TAB键却能实现切换。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hnzlk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-14 14:45:092楼 得分:0
      直接转移焦点不就行了吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Songzhiq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-14 14:50:213楼 得分:0
    第1编切换可以,但是循环切换不行(即第2编再开始就不行了)。但Windows键盘上的TAB键可以实现
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hnzlk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-14 15:06:204楼 得分:15
    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
          OldWndProc=Edit1->WindowProc;
          Edit1->WindowProc=NewWndProc;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::NewWndProc(TMessage &Message)
    {
          if(Message.Msg==WM_KEYDOWN )
          {
              switch(Message.WParam)
              {
                case 40:
                    PostMessage(Handle,WM_KEYDOWN,VK_TAB,0);
                break;
              }

          }
          OldWndProc(Message);
    }


    //--------------------------------------------------
    //---------------------------------------------------------------------------

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
      TEdit *Edit1;
      TButton *btn1;
      TButton *btn2;
      TButton *btn3;
    private: // User declarations
              TWndMethod OldWndProc;
              void __fastcall NewWndProc(TMessage &Message);
    public: // User declarations
      __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif


    最完整的代码的哦,我试了可以的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • samchoy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-06-14 15:22:395楼 得分:5
    C/C++ code
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { bool GoForward; if (Key == VK_DOWN) GoForward = true; else if (Key == VK_UP) GoForward = false; else return; SelectNext(ActiveControl, GoForward, true); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Songzhiq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-15 07:58:286楼 得分:0
    hnzlk 和samchoy的代码都不行啊。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Songzhiq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-15 08:04:347楼 得分:0
    焦点在Button2上时,再按向下箭头键光标应该移至Edit1的(Edit1里若有文字的话,还应该蓝色反显的),这时可以输入文字。但上面两段代码都不行啊。

    To hnzlk:按你的代码试了,不行啊,不知错在哪里。(注意:Edit1是放在TGroupBox控件里的 )
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Songzhiq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-15 20:24:598楼 得分:0
    啊有知道的啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • samchoy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-06-15 21:27:359楼 得分:15
    原来你的Button是在GroupBox外面
    那就这样:
    C/C++ code
    //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { bool GoForward; if (Key == VK_DOWN) GoForward = true; else if (Key == VK_UP) GoForward = false; else return; SelectNext(ActiveControl, GoForward, true); } //--------------------------------------------------------------------------- void __fastcall TForm1::GroupBox1Enter(TObject *Sender) { ActiveControl = Edit1; } //---------------------------------------------------------------------------
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • samchoy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-06-15 21:28:2010楼 得分:1
    C/C++ code
    //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TGroupBox *GroupBox1; TEdit *Edit1; TButton *Button1; TButton *Button2; void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall GroupBox1Enter(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Jikycc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-16 08:18:4011楼 得分:5
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
        if(Key==VK_DOWN)
        {
          PostMessage(Handle,WM_KEYDOWN,VK_TAB,0);
          PostMessage(Handle,WM_KEYUP,VK_TAB,0);//应该要UP才算完成一次点击吧
        }
    }
    //---------------------------------------------------------------------------
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • i_love_pc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 7

      2

    发表于:2008-06-16 08:46:5012楼 得分:1
    顶老蔡!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hnzlk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-16 09:23:2113楼 得分:0
      你留个邮箱,我可以把源码发给你,我试过的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jacknes009
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-16 09:46:2114楼 得分:0
    顶老蔡!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cppowner
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-16 10:18:5515楼 得分:0
    34727498@qq.com  笑  我也想要份 谢谢
    随便帮顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hnzlk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-16 10:45:1016楼 得分:0
    发了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • futulove
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-16 11:35:3017楼 得分:4
    int ikind=0;
    if(ikind==0)
    {
    Edit1->SetFocus();
    ikind++;
    }
    else if(ikind==1)
    {
    Button1->SetFocus();
    ikind++;
    }
    else
    {
    Button2->SetFocus();
    ikind=0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • scottlai
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-16 15:58:2018楼 得分:4
    把消息换一下:
    Form->Perform(WM_NEXTDLGCTL,0,0);
    //---------------------------------------------------------------------------
    //KeyPreview已设true;
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
        if(Key==VK_DOWN)
        {
          Form->Perform(WM_NEXTDLGCTL,0,0);
        }
    }
    //---------------------------------------------------------------------------

    然后把那三个控件的TabStop设为True,TabOrder按顺序设置1-3,然后把其它的控件的TabStop设为False.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Songzhiq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-19 12:35:4719楼 得分:0
    //已经实现,下面是最简单的办法:
    void __fastcall TForm1::FormShortCut(TWMKey &Msg, bool &Handled)
    {
      if (Msg.CharCode==VK_DOWN)
        {
          Handled=true;
          PostMessage(Handle,WM_KEYDOWN,VK_TAB,0);

        }
    }
    //---------------------------------------------------------------------------

    谢谢大家!!
    修改 删除 举报 引用 回复