Snippets
Items in ListBox: toon item in tooltip indien te breed voor box.
Een aardig extraatje van deze oplossing is, dat dezelfde eventhandler aan alle
listboxes in een applicatie kan worden gekoppeld, omdat de sender gebruikt wordt.
private int indexOfTooltippedItem = -1;
private void lst_MouseMove(object sender, MouseEventArgs e)
{
ListBox lb = (ListBox)sender;
int indexUnderTheMouse = lb.IndexFromPoint(e.X, e.Y);
if (indexUnderTheMouse > -1 && indexUnderTheMouse != indexOfTooltippedItem)
{
Graphics g = lb.CreateGraphics();
string itemtext = lb.Items[indexUnderTheMouse].ToString();
if (g.MeasureString(itemtext, lb.Font).Width > lb.ClientRectangle.Width)
{
toolTip2.SetToolTip(lb, itemtext);
indexOfTooltippedItem = indexUnderTheMouse;
}
else
{
toolTip2.SetToolTip(lb, "");
indexOfTooltippedItem = -1;
}
g.Dispose();
}
}
Items in ListBox: contextmenu op rechtsklik
De mooiste oplossing is, als je in de listbox een collectie van jouw objecten
hebt geplaatst. Dan hoef je bij de rechtsklik alleen maar dat object te onthouden
voor de afhandeling. Je kunt echter ook bepaalde waarden van het gekozen item in
een of meer globals bewaren.
private MyObject contextItemMyObject;
private void lst_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ListBox lb = (ListBox)sender;
int indexUnderTheMouse = lb.IndexFromPoint(e.X, e.Y);
if (indexUnderTheMouse == -1) return;
lb.SelectedIndex = indexUnderTheMouse;
MyObject mo = (MyObject)lb.SelectedItem;
contextItemMyObject = mo;
myContextMenuStrip.Show(lb, new Point(e.X, e.Y));
}
}
In de handler van je contextmenukeuze beschik je over het gekozen
object in de global contextItemMyObject.
State keeping
State keeping over meerdere monitoren
In de volgende twee routines wordt gecontroleerd of een bepaalde bewaarde links- of top-positie van een venster
in de actuele monitor configuratie nog wel geldig c.q. zichtbaar is. Zo niet, dan wordt false teruggegeven. Je kunt in zo'n geval overwegen om het
betreffende venster niet te herstellen, maar op zijn default plek te laten verschijnen.
private bool isValidLeft(int left)
{
bool validLocation = false;
Screen[] screens = Screen.AllScreens;
int upperBound = screens.GetUpperBound(0);
int x, w;
for (int index = 0; index <= upperBound; index++)
{
// For each screen, check if Location fals within bounds.
x = screens[index].Bounds.X;
w = screens[index].Bounds.Width;
if (left > x && left < x + w - 10)
validLocation = true;
}
return validLocation;
}
private bool isValidTop(int top)
{
bool validLocation = false;
Screen[] screens = Screen.AllScreens;
int upperBound = screens.GetUpperBound(0);
int y, h;
for (int index = 0; index <= upperBound; index++)
{
// For each screen, check if Location fals within bounds.
y = screens[index].Bounds.Y;
h = screens[index].Bounds.Height;
if (top > y && top < y + h - 10)
validLocation = true;
}
return validLocation;
}
|