Au fil des flows

9jan/1215

Donner le focus a un controle PictureBox

Je developpai un controle de type PictureBox permettant de sélectionner une zone sur une image. Ce controle doit être utilisable directement dans le designer de visual studio. Il ne doit pas necessiter d'implémenter du code en plus dans la form qui l'héberge pour fonctionner.

Parmi les exigences que je m'etais fixé, il y'avait celle ci :

  • Si l'utilisateur appuie sur Escape, le programme annule la sélection en cours

Au moment de réaliser ce scénario, j'ai eu une petite surprise. Le controle PictureBox dont j'hérite n'est pas un controle focusable. Consequence facheuse, un controle qui ne prend pas le focus ne peut intercepter d'evenement clavier, même quand la propriete KeyPreview de l'objet Form parent est active.

Avec Winform, soit dit en passant, ce n'est pas le seul controle à etre ainsi. Voici une liste tiré de la MSDN sur les controles qui ne peuvent prendre le focus :

  • Panel
  • GroupBox
  • ProgressBar
  • Splitter
  • Label
  • LinkLabel (sans link actif)

Premier réflexe, faire une recherche sur Google à ce sujet (avec les mots PictureBox Winform Focus). J'ai trouvé 2 approches :

  • utiliser un bouton flat à la place d'une PictureBox
  • intercepter les evenements claviers sur la Form et les dispatcher

Comme vous vous en doutez, la deuxième solution n'est pas valable pour résoudre le problème fixée. Pour la première, elle est trop abracadabrante pour sembler être la bonne manière.

Rendre un controle Focusable

J'ai donc creusé un peu plus et j'ai trouvé la propriété ControlStyles qui permet de configurer le comportement d'un controle.

Pour lui permettre de pouvoir obtenir le focus, il suffit de lui affecter la propriété Selectable dans son constructeur :

this.SetStyle(ControlStyles.Selectable, true);

Ca ne suffit pas, à présent, il faut donner au controle le moyen de récupérer le focus. Votre controle même si il peut prendre le focus n'a aucun moyen de le faire.

J'ai trouvé la solution (qui est on ne peut plus evidente à la réflexion) sur le forum de StackOverFlow. Il suffit de demander le focus sur l'appel à la méthode OnMouseDown. C'est à dire lors d'un clic de souris sur votre image.

Voici le code qui résume l'approche :

using System;
using System.Drawing;
using System.Windows.Forms;
 
class SelectablePictureBox : PictureBox {
  public SelectablePictureBox() {
    this.SetStyle(ControlStyles.Selectable, true);
  }
  protected override void OnMouseDown(MouseEventArgs e) {
    this.Focus();
    base.OnMouseDown(e);
  }
}

Posted by Fabien Arcellier

Remplis sous: Non classé Laisser un commentaire
Commentaires (15) Trackbacks (0)
  1. A motivating discussion is definitely worth comment.

    I do think that you should publish more on this subject, it may not be a taboo subject but usually folks don’t discuss such topics.
    To the next! All the best!!

  2. Tulisan yang bermanfaat tentang hosting, domain murah dan toko online ini luar biasa bagus.
    Keren banget dan bermanfaat sekali. Siapa aja yg pakai ataupun sedang cari service web host murah di Indonesia & toko
    online harus baca artikel ini. Monggo kunjungi juga situs saya
    ya min, banyak tulisan keren yang semoga berguna buat para pengguna layanan web hosting.
    BR.

  3. What’s Going down i am new to this, I stumbled
    upon this I have discovered It absolutely useful
    and it has aided me out loads. I hope to give
    a contribution & assist other customers like its aided me. Great job.

  4. This is very attention-grabbing, You are an excessively professional blogger.
    I’ve joined your feed and sit up for searching for extra of
    your fantastic post. Also, I have shared your web site in my
    social networks

  5. Hi there colleagues, nice piece of writing and nice arguments commented
    here, I am in fact enjoying by these.

  6. Thanks for the good writeup. It actually used to be a enjoyment account it.
    Look complicated to far introduced agreeable from you!
    However, how could we communicate?

  7. I feel that is among the such a lot important info for me.
    And i’m glad reading your article. However want to observation on some
    normal things, The site style is perfect, the articles is
    actually great : D. Just right activity, cheers

  8. Your style is really unique in comparison to other folks I’ve read stuff from.
    Thank you for posting when you’ve got the opportunity, Guess I
    will just book mark this web site.

  9. I am actually thankful to the owner of this web
    site who has shared this fantastic article at at this time.

  10. Hello I am so glad I found your weblog, I really found you
    by mistake, while I was browsing on Askjeeve for something else, Nonetheless I
    am here now and would just like to say thank you for
    a marvelous post and a all round entertaining blog (I also love the theme/design), I don’t have time to read through it all at the minute but I have book-marked it and also added
    in your RSS feeds, so when I have time I will be back to read
    a great deal more, Please do keep up the excellent b.

  11. Thanks for sharing your thoughts about dewapokerqq.
    Regards

  12. Fantastic beat ! I wish to apprentice while you amend your
    website, how can i subscribe for a blog site?
    The account aided me a acceptable deal. I had
    been a little bit acquainted of this your broadcast offered
    bright clear concept

  13. I know this web page presents quality dependent content and other information, is there any other web site which offers these kinds of information in quality?

  14. My brother recommended I may like this web site. He was once totally right.

    This publish actually made my day. You cann’t
    believe just how much time I had spent for this info!
    Thanks!

  15. belanja murah cara mudah di masariklaten.com


Leave a comment

Aucun trackbacks pour l'instant