gpt4 book ai didi

c# .NET 2.0 缩放滚动条

转载 作者:行者123 更新时间:2023-11-30 17:17:45 24 4
gpt4 key购买 nike

我正在寻找一个允许用户同时缩放和滚动的控件。它基本上需要像 Sony Sound Forge 那样的东西,请参阅此屏幕截图的底部: enter image description here

它的外观和行为就像一个普通的滚动条,此外,您还可以左右拖动边缘来放大/缩小图表。即使会为用户提供其他方式来放大和滚动(例如通过拖动图表本身的区域),我仍然认为这样的组件很有用,因为它为用户提供了数据中位置的直接视觉反馈以及已应用的缩放量。

是否存在这样的组件,还是需要我自己创建?欢迎任何帮助。

最佳答案

我认为这是非常具体的控制,我认为它不存在。此外,我认为自己创建它会比搜索它甚至等待有人回答这个问题更快。

要像 Sound Forge 那样绘制自定义按钮,您可以使用 WinAPI 函数 DrawThemeBackground

我举了一些简短的例子:

enter image description here

public partial class Form1 : Form
{
readonly Int32 ScrollBarWidth;
readonly Int32 ScrollBarHeight;



public Form1()
{
InitializeComponent();

ScrollBarWidth = GetSystemMetrics(SM_CYVSCROLL);
ScrollBarHeight = GetSystemMetrics(SM_CYHSCROLL);
}



private void panel1_Paint(object sender, PaintEventArgs e)
{
Int32 ZoomMarkerSize = 6;

Graphics G = e.Graphics;
Int32 SBWidth = ScrollBarWidth;
Int32 SBHeight = ScrollBarHeight;

DrawCustomScrollButton(G, 0, 0, SBWidth, SBHeight, Resources.Plus,
(int) SCROLLBARSTYLESTATES.SCRBS_NORMAL);
DrawCustomScrollButton(G, SBWidth, 0, ZoomMarkerSize, SBHeight, null,
(int) SCROLLBARSTYLESTATES.SCRBS_NORMAL);
DrawCustomScrollButton(G, SBWidth + ZoomMarkerSize, 0, SBWidth, SBHeight, Resources.Minus,
(int) SCROLLBARSTYLESTATES.SCRBS_HOT);
}



public void DrawCustomScrollButton (Graphics aG, Int32 aX, Int32 aY, Int32 aWidth, Int32 aHeight,
Image aImage, Int32 aState)
{
RECT R = new RECT () { left = aX, top = aY, right = aX + aWidth, bottom = aY + aHeight };
RECT NotUsed = R;

IntPtr ThemeHandle = OpenThemeData(this.Handle, "SCROLLBAR");
IntPtr HDC = aG.GetHdc();

DrawThemeBackground
(
ThemeHandle, HDC,
(int) SCROLLBARPARTS.SBP_THUMBBTNHORZ,
aState,
ref R, ref NotUsed
);

aG.ReleaseHdc(HDC);
CloseThemeData(ThemeHandle);

if (aImage != null)
{
aG.DrawImage(aImage,
aX + ((ScrollBarHeight - aImage.Width ) / 2),
aY + ((ScrollBarHeight - aImage.Height ) / 2));
}
}



public struct RECT
{
public Int32 left;
public Int32 top;
public Int32 right;
public Int32 bottom;
}

[DllImport("user32.dll")]
public static extern int GetSystemMetrics(int smIndex);

[DllImport("uxtheme.dll", ExactSpelling=true)]
public extern static Int32 DrawThemeBackground(IntPtr hTheme, IntPtr hdc, int iPartId,
int iStateId, ref RECT pRect, ref RECT pClipRect);

[DllImport("uxtheme.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
public static extern IntPtr OpenThemeData(IntPtr hWnd, String classList);

[DllImport("uxtheme.dll", ExactSpelling=true)]
public extern static Int32 CloseThemeData(IntPtr hTheme);

public int SM_CYHSCROLL = 3;
public int SM_CYVSCROLL = 20;

public int SBP_ARROWBTN = 1;

public int ABS_UPNORMAL = 1;
public int ABS_UPHOT = 2;
public int ABS_UPHOVER = 17;

public enum ARROWBTNSTATES {
ABS_UPNORMAL = 1,
ABS_UPHOT = 2,
ABS_UPPRESSED = 3,
ABS_UPDISABLED = 4,
ABS_DOWNNORMAL = 5,
ABS_DOWNHOT = 6,
ABS_DOWNPRESSED = 7,
ABS_DOWNDISABLED = 8,
ABS_LEFTNORMAL = 9,
ABS_LEFTHOT = 10,
ABS_LEFTPRESSED = 11,
ABS_LEFTDISABLED = 12,
ABS_RIGHTNORMAL = 13,
ABS_RIGHTHOT = 14,
ABS_RIGHTPRESSED = 15,
ABS_RIGHTDISABLED = 16,
ABS_UPHOVER = 17,
ABS_DOWNHOVER = 18,
ABS_LEFTHOVER = 19,
ABS_RIGHTHOVER = 20,
};

public enum SCROLLBARSTYLESTATES {
SCRBS_NORMAL = 1,
SCRBS_HOT = 2,
SCRBS_PRESSED = 3,
SCRBS_DISABLED = 4,
SCRBS_HOVER = 5,
};

public enum SCROLLBARPARTS {
SBP_ARROWBTN = 1,
SBP_THUMBBTNHORZ = 2,
SBP_THUMBBTNVERT = 3,
SBP_LOWERTRACKHORZ = 4,
SBP_UPPERTRACKHORZ = 5,
SBP_LOWERTRACKVERT = 6,
SBP_UPPERTRACKVERT = 7,
SBP_GRIPPERHORZ = 8,
SBP_GRIPPERVERT = 9,
SBP_SIZEBOX = 10,
};
}

以下是资源的表单源文件和两个测试 PNG 图像:
scrollbar-with-zoom-example.zip

查看 MSDN 以获取有关此 API 的更多信息,并查看 PINVOKE.NET 站点以获取函数签名。

编辑

更好的解决方案是使用VisualStyleRenderer 类。抱歉,第一个复杂的例子。我以前不知道那个类(class)。所以我的 DrawCustomScrollButton 函数应该被替换:

public void DrawCustomScrollButton (Graphics aG, Int32 aX, Int32 aY, Int32 aWidth, Int32 aHeight,
Image aImage, Int32 aState)
{
Rectangle R = new Rectangle(aX, aY, aX + aWidth, aY + aHeight);

VisualStyleRenderer Renderer = new VisualStyleRenderer
(
VisualStyleElement.ScrollBar.ThumbButtonHorizontal.Normal
);

Renderer.DrawBackground(aG, R);

if (aImage != null)
{
aG.DrawImage(aImage,
aX + ((ScrollBarHeight - aImage.Width ) / 2),
aY + ((ScrollBarHeight - aImage.Height ) / 2));
}
}

编辑 2

考虑到您的意见,我重新尝试重新创建此自定义控件。主要想法是使用标准的 ScrollBar 并在其上方放置缩放标记(两个 Panel 控件)。乍一看很容易。但是将这些组件组合在一起比我想象的要困难。

主要问题是很难改变系统 ScrollBar 控件的行为。我发现它不允许处理我想覆盖的 Windows 消息队列中的某些事件。例如 MouseUp 事件和其他一些。

最后,我认为唯一正确的方法是从头开始重新创建自己的 ScrollBar 控件副本,这样就不会有这些限制。因此,最初我走错了路,不幸的是没有解决你的任务。

无论如何,我目前的结果(完整解决方案): scrollbar-with-zoom-3.zip

关于c# .NET 2.0 缩放滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com