2013-03-16 101 views
0

我想用C++編寫一個應用程序,該應用程序可以在用戶持有並移動鼠標時平移圖像。我用一個面板,並把一個pictureBox上。面板的AutoScroll屬性設置爲true。現在我試圖在鼠標移動時更改滾動條的位置。我嘗試了幾種方法,但它不起作用。在C++中更改面板中自動滾動條的位置

爲了簡單起見,我在這裏使用+/- 100,+/- 100代碼。我試圖

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

它給了我下面的錯誤:

cannot convert from 'System::Drawing::Point *' to 'System::Drawing::Point'"

我也試過以下。

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

但是,滾動條不會移動並始終返回0,0。 我曾嘗試使用-ve和+ ve值,但它只是不工作。

我該如何解決這個問題?

+0

哪個框架您使用的? – kiamlaluno 2013-03-16 10:44:28

+0

看起來像是C++/CLI,更好的重新編碼 – 2013-03-16 10:44:43

+0

如果這實際上是一些與C++相關的東西,那麼'Point p = new Point(100,100)'這行可能不會達到你期望的效果。 – Oswald 2013-03-16 10:47:00

回答

2

System::Drawing::Point是一個結構,而不是一個類。結構是值類型,並且不需要新操作符。我不是在一個編譯器,但我相信這是你想要的語法:

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

(此外,點是一個管理型,gcnew會更合適new作品,但非常不規範,不的API將接受類型的參數)

你嘗試過其他的東西:那也不行,因爲Point是結構

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

AutoScrollPosition返回結構的COPY,這就是你修改的內容。當你嘗試這個時,C#會給出編譯器警告。如果確實需要修改一個點的一個組成部分,這裏就是你需要做的(這適用於C++/CLI和C#):

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

謝謝大衛,我用你的建議「Point p(100,100); panel1-> AutoScrollPosition = p;」它完美的工作!順便說一句,我想知道什麼是結構和類之間的主要區別?爲什麼我「新」點不起作用?再次感謝。 – Novfrank 2013-03-21 13:40:14

+0

下面是解釋託管結構和類之間區別的一個很好的答案:http://stackoverflow.com/a/13275。 「新」不起作用,因爲這是非託管堆的運算符,您希望對任何託管類型使用「gcnew」。 「gcnew Point」可以工作,但這不是管理結構在任何標準API中傳遞的方式,所以你只需要退回到直接類型就可以在任何地方使用它。 – 2013-03-21 16:17:32