J'ai un contrôle ListView en mode Détails avec une seule colonne. C'est sur une forme qui est destinée à être utilisée uniquement avec le clavier, principalement avec les flèches haut / bas pour faire défiler et entrer pour sélectionner. Donc, je n'ai pas vraiment besoin d'avoir les barres de défilement et je voudrais juste qu'ils ne montrent pas pour un look plus propre. Toutefois, lorsque j'ai défini la propriété ListView.scrollable sur false, je peux toujours déplacer l'élément sélectionné de haut en bas, mais dès qu'il se déplace à un article non actuellement en vue, la liste ne bouge pas pour afficher cet élément. J'ai essayé d'utiliser Assurez-vous à défiler de manière programmée sur la liste, mais cela ne fait rien quand dans ce mode. P>
Y a-t-il un moyen de déplacer manuellement la liste de haut en bas pour faire défiler, mais sans avoir la barre de défilement présentée? P>
6 Réponses :
Appelez le FRESSECLOLLBAR CODE > méthode API. P>
Utilisé [DLLIMPORT ("user32.dll")] STATIC externe Sourcecrollarbar (IntPTR HWND, int WBAR, BOOL BSHOW); Avec: montrecrollbar (lstmain.handle, 3, faux); Et ça n'a pas fonctionné ...
Essayez de l'appeler dans le Layout code> ou redimensionner code> événements.
Aussi, voir ici: WindowsDevop.com / Windows-Forms-General / ... et ici: Stackoverflow .com / questions / 159864 / ...
SemitecrollBar API fonctionne bien si vous le définissez lorsque WM_NCCALCSIZE est reçu sur WNDPROC (). Mais la fonctionnalité de défilement est perdue.
Si Vous pouvez mettre la liste de liste dans un panneau et créer la liste plus large que le panneau de sorte que la barre de défilement soit coupée (cocher apparition decrollbar code> ne fonctionne pas, je ne sais pas comment le faire. P>
systeminformation.verticalscrollbarwidth code>), mais c'est un horrifiant em > Hack de laid. P>
Puisque le montrecrollbar ne fonctionnait pas, peut-être que cela aide:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
private const int WM_VSCROLL = 0x115;
private const int SB_LINEDOWN = 1;
public Form1()
{
InitializeComponent();
for (int i = 0; i < 100; i++)
listView1.Items.Add("foo" + i);
listView1.Scrollable = false;
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
SendMessage(listView1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
}
Ce n'est pas facile mais cela peut être fait. Si vous essayez de masquer la barre de défilement via FRESHCROLLBARBAR, la liste de réception sera simplement de retour. Donc, vous devez faire quelque chose de plus sournois.
Vous devrez intercepter le message WM_NCCALCSIZE, et là, éteignez le style de défilement vertical. Chaque fois que la liste de réception tente de l'allumer à nouveau, vous l'éteignez à nouveau dans ce gestionnaire. P>
public class ListViewWithoutScrollBar : ListView
{
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case 0x83: // WM_NCCALCSIZE
int style = (int)GetWindowLong(this.Handle, GWL_STYLE);
if ((style & WS_VSCROLL) == WS_VSCROLL)
SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_VSCROLL);
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
const int GWL_STYLE = -16;
const int WS_VSCROLL = 0x00200000;
public static int GetWindowLong(IntPtr hWnd, int nIndex) {
if (IntPtr.Size == 4)
return (int)GetWindowLong32(hWnd, nIndex);
else
return (int)(long)GetWindowLongPtr64(hWnd, nIndex);
}
public static int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong) {
if (IntPtr.Size == 4)
return (int)SetWindowLongPtr32(hWnd, nIndex, dwNewLong);
else
return (int)(long)SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
}
[DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
public static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto)]
public static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLongPtr32(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, int dwNewLong);
}
J'ai essayé le même code pour le défilement horizontal (I remplacé 0x00200000 par 0x00100000), la barre de défilement est atteinte mais je ne peux pas faire défiler avec les touches fléchées. Une idée?
Ce code fonctionne bien pour des lignes régulières, mais l'en-tête semble tromper, il ne semble pas redessiner les zones où la barre de défilement est superposée. BTW, j'utilise ObjectListView, qui est une sous-classe de listeView.
J'ai fait quelque chose de plus facile. Je suis parti défilable à true et utilisé un curseur personnalisé (ColorsLider) que j'ai trouvé sur CodeProject et j'ai dessiné le curseur sur la position où le vscroller apparaîtrait puis utilisé la fonction Assurance. P>
Vous pouvez utiliser la propriété ListView.scrollable. Définissez-le sur les fausses barres de défilement n'apparaîtra pas! p>