Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Обработка клавиатуры


Автор: UserNet 13.12.2006, 08:20
Народ, у меня такая проблема возникла, я пишу на C++ под платформы .NET.Мне нужно что бы у меня форма сначало обработывала клавиатуру, а затеам contol, как это сделать для стрелок, на клавиатуре, (KeyPreview=true я поставил) у меня при нажатии стрелок перемещается фокус между двух кнопок и всё.

Код

 void createform1()
  {
        child = new Form();
        child->Width=600;
        child->Height=600;
        child->MdiParent = this;
        
        child->KeyPress += new KeyPressEventHandler(this,&MyForm::AsciiCod); 

        
        child->Show();
        
        initlabel();
        InitButton();
        
}


Код InitButton
Код

 void InitButton()
        {
            poButton=new Button();
            poKey=new Button();
            poButton->Top=150;
            poButton->Left=310;
            poButton->Text="New";
            poButton->BackColor=Color::Blue;
            poButton->Click +=new EventHandler(this,&MyForm::create);
            child->Controls->Add(poButton);
            poKey->Top=120;
            poKey->Left=220;
            poKey->Text="Text";
            poKey->Click +=new EventHandler(this,&MyForm::create1);

            /*pTb= new TextBox();
            pTb->Top=120;
            pTb->Left=350;*/

            
//        this->child->Controls->Add(pTb);
            this->child->Controls->Add(poKey);
            child->KeyPreview=true;
            child->KeyUp+= new KeyEventHandler(this,&MyForm::ClearLab);
            child->KeyDown+= new KeyEventHandler(this,&MyForm::Work);

        }


Код intilabel
Код


 void  initlabel()
        {
          lb1= new Label();
          lb2= new Label();
          lb3= new Label();
          lb4= new Label();
          lb5= new Label();
          lb6= new Label();
          lb7= new Label();
         
          lb1->Text="Keypress Character";
          lb1->Left=10;
          lb1->Top=10;
          lb1->BorderStyle=System::Windows::Forms::BorderStyle::FixedSingle;
          
          lb2->Text="Key down value";
          lb2->Left=10;
          lb2->Top=40;
          lb2->BorderStyle=System::Windows::Forms::BorderStyle::FixedSingle;
            
          lb3->Size=System::Drawing::Size(100,50);
          lb3->Text=S"Special Key Alt: Shift: Ctrl:";
          lb3->Left=10;
          lb3->Top=60;
          lb3->BorderStyle=System::Windows::Forms::BorderStyle::FixedSingle;
          
          lb4->Text="F12";
          lb4->Left=200;
          lb4->Top=10;
          lb4->BorderStyle=System::Windows::Forms::BorderStyle::FixedSingle;

          lb5->Text="123";
          lb5->Left=200;
          lb5->Top=40;
          lb5->BorderStyle=System::Windows::Forms::BorderStyle::FixedSingle;
          
          lb6->Size=System::Drawing::Size(250,50);
          lb6->Text=" ";
          lb6->Left=200;
          lb6->Top=62;
          lb6->BorderStyle=System::Windows::Forms::BorderStyle::FixedSingle;

          lb7->Text="Press any key and hold down Shift, Alt,and Ctrl keys to see their ASCII and virtual key values. ";
          lb7->Left=310;
          lb7->Top=10;
          lb7->Size=System::Drawing::Size(120,52);
          lb7->BorderStyle=System::Windows::Forms::BorderStyle::FixedSingle;
          
         

          child->Controls->Add(lb1);
          child->Controls->Add(lb2);
          child->Controls->Add(lb3);
          child->Controls->Add(lb4);  
          child->Controls->Add(lb5);
          child->Controls->Add(lb6);
          child->Controls->Add(lb7);

        }

причём если раскоментировать код в InitButton, то будет работать.

Автор: juravel 19.12.2006, 23:47
Знаю только для кпк на c#:
Код

static void Main() 
        {
            Application.Run(new StarLightForm());
        }

        private void timer1_Tick(object sender, System.EventArgs e)
        {
            updateGame();
        }

        private void StarLightForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            e.Graphics.DrawImage(backBuffer,0,0);
        }

        private void leftKeyMenuItem_Click(object sender, System.EventArgs e)
        {
            newGame();
        }

        private void StarLightForm_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            keyDown (e.KeyCode);
        }

        private void StarLightForm_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            keyUp();
        }

        private void StarLightForm_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            keyPress (e.KeyChar);
        }

        private void exitMenuItem_Click(object sender, System.EventArgs e)
        {
            Application.Exit();
        }

        private void StarLightForm_LostFocus(object sender, System.EventArgs e)
        {
            pauseGame();
        }

        private void StarLightForm_GotFocus(object sender, System.EventArgs e)
        {
            resumeGame();
        }

Может бить не в тему smile 

Автор: mr.DUDA 20.12.2006, 13:23
Надо выставить у формы свойство KeyPreview = true, тогда все нажатия вначале будут приходить в форму, а только потом в контролы.

Автор: ivashkanet 20.12.2006, 14:09
mr.DUDA, 
Цитата(UserNet @  13.12.2006,  07:20 Найти цитируемый пост)
KeyPreview=true я поставил

 smile  smile 

Автор: mr.DUDA 20.12.2006, 16:02
Упс. Точно.

Проблема в том, что некоторые клавиши (Tab, стрелки) вынесены в отдельную группу, и управляют фокусом на форме. Чтобы этого не происходило, надо подписаться на событие PreviewKeyDown контролов (кнопок и др.) и в обработчике поставить:
Код
e.IsInputKey = true;


Тогда все клавиши будут трактоваться как обычные, и обрабатываться соответственно. Стрелки не будут перемещать между кнопками.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)