【问题标题】:Change the position of auto scroll bar in a panel in C++在 C++ 中更改面板中自动滚动条的位置
【发布时间】:2013-03-16 10:41:11
【问题描述】:

我想用 C++ 编写一个可以在用户按住和移动鼠标时平移图像的应用程序。我使用了一个面板并在上面放了一个图片框。 Panel 的属性 AutoScroll 设置为 true。现在我试图在鼠标移动时改变滚动条的位置。我尝试了几种方法,但都不起作用。

为简单起见,我在这里使用 +/-100、+/-100 作为代码。我试过了

Point p = new Point(100, 100);
panel1->AutoScrollPosition = p;

它给了我以下错误:

无法从 'System::Drawing::Point *' 转换为 'System::Drawing::Point'"

我也尝试了以下方法。

panel1->AutoScrollPosition.X = 100;
panel1->AutoScrollPosition.Y = 100;

但是,滚动条不会移动并且总是返回 0,0。 我曾尝试同时使用 -ve 和 +ve 值,但它不起作用。

我该如何解决这个问题?

【问题讨论】:

  • 你使用的是哪个框架?
  • 看起来是 C++/CLI,最好重新标记一下
  • 如果这确实是一些与 C++ 相关的东西,那么 Point p = new Point(100, 100) 行可能不会像您期望的那样。
  • 它仍然没有按照他的预期去做。 C++/CLI 使用不同的语法来允许垃圾收集news。

标签: winforms c++-cli panel autoscroll


【解决方案1】:

System::Drawing::Point 是一个结构,而不是一个类。结构是值类型,不需要 new 运算符。我不是编译器,但我相信这是你想要的语法:

Point p(100, 100);
panel1->AutoScrollPosition = p;

(另外,Point 是托管类型,gcnew 会更合适。new 有效,但非常不标准,没有 API 会接受该类型的参数。)

你尝试的另一件事:

panel1->AutoScrollPosition.X = 100;
panel1->AutoScrollPosition.Y = 100;

这不起作用,因为 Point 是一个结构。 AutoScrollPosition 返回结构的副本,这就是您修改的内容。当您尝试此操作时,C# 将给出编译器警告。如果您确实需要修改 Point 的一个组件,请执行以下操作(这适用于 C++/CLI 和 C#):

Point p = panel1->AutoScrollPosition;
p.X = 100;
panel1->AutoScrollPosition = p;

【讨论】:

  • 谢谢大卫,我使用了你的建议“Point p(100, 100); panel1->AutoScrollPosition = p;”它完美无缺!顺便说一句,我想知道结构和类之间的主要区别是什么?为什么我“新”一个点不起作用??再次感谢。
  • 这是一个很好的答案,解释了托管结构和类之间的区别:stackoverflow.com/a/13275。 “new”不起作用,因为这是非托管堆的运算符,您想在 any 托管类型上使用“gcnew”。 “gcnew Point”可以工作,但这不是在任何标准 API 中传递托管结构的方式,因此您只需转换回直接类型即可在任何地方使用它。
猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 2015-01-25
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多