J'ai deux questions.Méthode de remplacement C# à l'exécution
1) J'ai trouvé un petit bijou de code pour how to make a control scroll smoothly.
Très bien. Mais il remplace la méthode WndProc, donc pour l'utiliser, j'ai dû supprimer le FlowLayoutPanel que j'avais déposé sur le formulaire au moment du design, sous-classe FlowLayoutPanel, puis enfin instancier ma nouvelle classe et créer toutes les propriétés manuellement et changer toutes les références au contrôle pour être this.Controls ["ControlName"]. (Ou je suppose que je pourrais faire une variable de niveau de classe qui est essentiellement ce que le contrôle était à l'origine, mais comment vous permettent-ils d'utiliser intellisense quand il n'est pas déclaré?)
Alors maintenant je me demande si il y avait en fait une façon d'exécuter pour le faire.
Puis-je faire quelque chose de simple comme cela, où MainPanel est le nom du contrôle:
MainPanel = (SmoothScrollingFlowLayoutPanel)MainPanel
Il ne peut pas être facile, peut-il? Même ainsi, c'est ennuyeux parce que je dois encore avoir la sous-classe (ce qui peut être une bonne décision de conception mais j'aimerais la liberté de le faire une seule fois). Serait-il possible de mettre le code dans le parent de quelque chose comme FlowLayoutPanel ceci:
private Delegate void WndProcHandler(ref Message m);
private WndProcHandler w;
public void SomeCode() {
w = MainPanel.WndProc; // get reference to existing wndproc method
MainPanel.WndProc = WndProcSmoothScroll; //replace with new method
}
private void WndProcSmoothScroll(ref Message m) { // make smooth scrolling work
if (
(m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL)
&& (((int)m.WParam & 0xFFFF) == 5)
) {
m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
}
if (w != null) { w(); }
base.WndProc(ref m);
}
Je sais que cela est probablement assez naïve. Je traite la méthode WndProc comme si c'était un événement, et ce n'est pas le cas.
2) Alors ma deuxième question est, si WndProc était un événement au lieu d'une méthode, comment pourrais-je faire la même chose magasin une copie de la liste originale des gestionnaires pour un événement, installer mon propre événement gestionnaire d'exécuter d'abord, puis appeler tous les gestionnaires d'événements d'origine?
BITS SAVOUREUSES
Dans le cas où quelqu'un est intéressé, j'ai remarqué une optimisation possible dans le code de défilement régulier:
//m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
m.WParam = (IntPtr)((int)m.WParam^1);
Puisque nous voulons tourner les 16 derniers bits de 5 à 4, nous peut simplement retourner le dernier bit (XOR) plutôt que ET alors OU.
Merci Zach, mais j'ai déjà réussi à faire défiler mes fenêtres en douceur. Je détestais juste comment je devais arracher le contrôle du concepteur et tout faire dynamiquement. – ErikE
@Emtucifor: Pas de problème, je voulais juste vous faire savoir que vous n'aviez pas besoin d'hériter de 'FlowLayoutPanel' pour remplacer son' WndProc'. –
Oh, maintenant je comprends. Merci. J'avoue que je n'ai pas lu aussi soigneusement que je devrais l'avoir fait. C'est utile! En fait, vous avez raison à 100%, c'est la réponse que je cherchais. (sent le front) – ErikE