private void HandlePaintBackground(PaintEventArgs e) { var bufferImage = new ImageWithDeviceContext(Size); Graphics g = Graphics.FromHdc(bufferImage.Dc); DrawBackground(bufferImage); int last = LastScrollableItemIndex; var mousePos = _form.PointToClient(Cursor.Position); var currentHoverred = mousePos.Y / ItemHeight; int relativeIndex = 0; for (int i = FirstScrollableItemIndex; i <= last; i++) { LayeredPopupMenuItem item = Items[i]; DrawItem(bufferImage, g, item, relativeIndex, currentHoverred == relativeIndex); relativeIndex++; } NativeMethods.BitBlt(e.Graphics.GetHdc(), 0, 0, Width, Height, bufferImage.Dc, 0, 0, CopyPixelOperation.SourceCopy); e.Graphics.ReleaseHdc(); bufferImage.Dispose(); g.Dispose(); }
private void HandleMouseClick(MouseEventArgs e) { var mousePos = _form.PointToClient(Cursor.Position); var currentHoverred = mousePos.Y / ItemHeight; LayeredPopupMenuItem clicked = Items[currentHoverred]; OnItemClicked((String)clicked.Tag); }
private void DrawText(Graphics g, LayeredPopupMenuItem item, Rectangle textBounds) { Font font = item.Bold ? FontBold : Font; g.TextContrast = 0; g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; g.DrawString(item.Text, font, ForeColorBrush, textBounds, DefaultStringFormat); }
private void DrawImage(IDeviceContext destImage, LayeredPopupMenuItem item, Rectangle bounds, bool hovered) { ImageWithDeviceContext itemImage = ItemBackgroundImage; if (item.Checked || hovered) { itemImage = ItemHoveredBackgroundImage; } ImageRenderer.StretchImageWithOutMargin(destImage, bounds.X, bounds.Y, bounds.Width, bounds.Height, itemImage, 0, itemImage.Width, itemImage.Height, StretchMargin, 255); }
protected virtual void DrawItem(ImageWithDeviceContext destImage, Graphics g, LayeredPopupMenuItem item, int index, bool hovered) { var bounds = new Rectangle(); bounds.Width = Width - (ContentMargin.Right + ContentMargin.Left + ItemContentRight); bounds.Height = ItemBackgroundImage.Height; bounds.X = ContentMargin.Left; bounds.Y = ContentMargin.Top + index * bounds.Height; DrawImage(destImage, item, bounds, hovered); Rectangle textBounds = bounds; textBounds.X += ItemContent.Left; textBounds.Y += ItemContent.Top; textBounds.Width -= ItemContent.Left + ItemContent.Right + ItemContentRight; textBounds.Height -= ItemContent.Top + ItemContent.Bottom; DrawText(g, item, textBounds); if (hovered && item.HoveredImage != null) { g.DrawImage(item.HoveredImage, ItemIconLocation.X + bounds.X, ItemIconLocation.Y + bounds.Y); } else if (item.Image != null) { g.DrawImage(item.Image, ItemIconLocation.X + bounds.X, ItemIconLocation.Y + bounds.Y); } }