Tout d'abord, dans le constructeur de votre fiche, placez le code suivant :
KeyPreview = true;
En effet, lorsqu'un événement clavier a lieu, il est normalement récupéré par le contrôle actif (par exemple, la zone d'édition qui a le focus). La fiche ne reçoit pas d'événement clavier ; en revanche, si vous positionnez
KeyPreview à
true, la fiche recevra tous les événements clavier avant que les contrôles ne les reçoivent.
Dans le constructeur, rajoutez ensuite le code suivant :
switch(GetKeyState(VK_CAPITAL)1){
case 0 : StatusBar1->Panels->Items[0]->Text=""; break;
case 1 : StatusBar1->Panels->Items[0]->Text="CAP"; break;
}
switch(GetKeyState(VK_NUMLOCK)1){
case 0 : StatusBar1->Panels->Items[1]->Text=""; break;
case 1 : StatusBar1->Panels->Items[1]->Text="NUM"; break;
}
switch(GetKeyState(VK_SCROLL)1){
case 0 : StatusBar1->Panels->Items[2]->Text=""; break;
case 1 : StatusBar1->Panels->Items[2]->Text="SCROLL"; break;
}
Nous supposons dans ce code que vous souhaitez afficher la valeur du vérouillage dans les premier, second et troisième panneaux de la barre d'état. Pensez donc à rajouter une telle barre en lui ajoutant au moins trois panneaux.
Ce code ne présente pas vraiment de difficulté :
GetKeyState permet de savoir si une touche est enfoncée. Pour ces touches spéciales, le bit de poids le plus faible indique si le vérouillage est actif, en plus de savoir si la touche est enfoncée, d'où le
GetKeyState(VK_SCROLL) qui permet d'obtenir cette valeur pour chaque touche.
Lorsque notre programme démarre, les bons vérouillages seront affichés dans la barre d'état.
Nous allons maintenant écrire le gestionnaire d'événement OnKeyDown de la fiche, pour gérer l'appui sur l'une de ces touches :
void __fastcall TForm1::OnKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
switch(Key)
{
case VK_CAPITAL :
switch(GetKeyState(VK_CAPITAL)1)
{
case 0 : StatusBar1->Panels->Items[0]->Text=""; break;
case 1 : StatusBar1->Panels->Items[0]->Text="CAP"; break;
}
case VK_NUMLOCK :
switch(GetKeyState(VK_NUMLOCK)1)
{
case 0 : StatusBar1->Panels->Items[1]->Text=""; break;
case 1 : StatusBar1->Panels->Items[1]->Text="NUM"; break;
}
case VK_SCROLL :
switch(GetKeyState(VK_SCROLL)1)
{
case 0 : StatusBar1->Panels->Items[2]->Text=""; break;
case 1 : StatusBar1->Panels->Items[2]->Text="SCROLL"; break;
}
}
}
Le code est très aisémment compréhensible : on regarde sur quelle touche l'utilisateur a appuyé grâce à un premier switch et selon la touche, on effectue exactement le même test que dans le constructeur.