|
Изменить размер нарисованной фигуры передвижением мышки
|
|||
---|---|---|---|
#18+
Добрый вечер. Есть задание: реализовать изменение нарисованной фигуры на форме движением мыши. Фигуры-окружности. Код using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows; using System.Windows.Input; using System.Threading; using System.Runtime.InteropServices; namespace Grafa { public partial class Form1 : Form { bool is_press = false; int cur_counter = 0; int counter = 0; Ellipsoid[] mas = new Ellipsoid[100]; Graphics grafa_1; Pen pen_1 = new Pen(Color.Black); public Form1() { InitializeComponent(); grafa_1 = Graphics.FromHwnd(pictureBox1.Handle); for (int i = 0; i < 100; i++) { mas[i] = new Ellipsoid(5555, 5555); } } private void button1_Click(object sender, EventArgs e) { counter++; int pic_width = pictureBox1.Width / 2; int pic_height = pictureBox1.Height / 2; Random random_1 = new Random(); int rand_width = random_1.Next(0, pic_width); int rand_height = random_1.Next(0, pic_height); mas[counter] = new Ellipsoid(rand_width, rand_height); grafa_1.DrawEllipse(pen_1, rand_width, rand_height, 100, 100); } private void toolStripMenuItem2_Click(object sender, EventArgs e) { pen_1.Width = 1; } private void toolStripMenuItem3_Click(object sender, EventArgs e) { pen_1.Width = 5; } private void toolStripMenuItem4_Click(object sender, EventArgs e) { pen_1.Width = 10; } private void сплошнаяToolStripMenuItem_Click(object sender, EventArgs e) { pen_1.DashPattern = new float[] {1f}; } private void пунктирнаяToolStripMenuItem_Click(object sender, EventArgs e) { pen_1.DashPattern = new float[] { 2f, 1f }; } private void цветФигурыToolStripMenuItem_Click(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK) { pen_1.Color = colorDialog1.Color; } } public bool Is_Detect(MouseEventArgs e) { // Детектирование, кликнули ли мы по какой-нибудь окружности for (int i = 0; i < 10000; i++) { if ((mas[i].width_ <= e.X) && (e.X <= (mas[i].width_) + 100) && (mas[i].height_ <= e.Y) && (e.Y <= (mas[i].height_ + 100))) { return true; } } return false; } public int GetEllipsoidIndex(MouseEventArgs e) { // Определение индекса выделенной окружности for (int i = 0; i < 100; i++) { if ((mas[i].width_ <= e.X) && (e.X <= (mas[i].width_) + 100) && (mas[i].height_ <= e.Y) && (e.Y <= (mas[i].height_ + 100))) { return i; } } return -1; } private void Form1_Load(object sender, EventArgs e) { } [DllImport("user32.dll")] public static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey); private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { // Мышка зажата // Детектирование, кликнули ли мы по какой-нибудь окружности is_press = true; if (Is_Detect(e)) { int n = GetEllipsoidIndex(e); int p_x = e.X; int p_y = e.Y; int p_x_new; int p_y_new; while(is_press == true) { Int16 state = GetAsyncKeyState(Keys.LButton); if ((state & 0x8000) == 0) is_press = false; p_x_new = Cursor.Position.X; p_y_new = Cursor.Position.Y; double ratio = p_x_new / p_x; int he = Convert.ToInt32(100 * ratio); int we = Convert.ToInt32(100 * ratio); grafa_1.Clear(Color.White); for (int i = 0; i < 100; i++) { if ((mas[i].width_ != 5555) && (mas[i].height_ != 5555)) { if (i == n) { grafa_1.DrawEllipse(pen_1, mas[i].width_, mas[i].height_, we, he); } else grafa_1.DrawEllipse(pen_1, mas[i].width_, mas[i].height_, 100, 100); } } System.Threading.Thread.Sleep(50); } } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { // Мышка отпущена is_press = false; //MessageBox.Show("false"); } } public class Ellipsoid { public int width_; public int height_; public Ellipsoid(int r_width, int r_height) { width_ = r_width; height_ = r_height; } // Конструктор } } Проблема с изменением размера окружности и дальнейшей перерисовкой всех окружностей. Т.е. при следующем изменении размера другой окружности старая окружность возвращается в свои исходные размеры. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2017, 19:59 |
|
Изменить размер нарисованной фигуры передвижением мышки
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2017, 20:41 |
|
Изменить размер нарисованной фигуры передвижением мышки
|
|||
---|---|---|---|
#18+
mraklbrwТ.е. при следующем изменении размера другой окружности старая окружность возвращается в свои исходные размеры. А ты разве запоминаешь где-то измененные размеры? Перерисовывать в mouseDown - порочная практика. В mouseDown нужно найти нужный эллипс и изменить его размеры, и вызвать перерисовку холста ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2017, 06:08 |
|
Изменить размер нарисованной фигуры передвижением мышки
|
|||
---|---|---|---|
#18+
Переписал код с использованием List<Ellipsoid>. Иногда вываливается с ошибкой Overflow. Странно, в коде нигде не нашёл возможной ошибке. И так же осталась ещё одна проблема: окружность сначала вообще не меняют размер, а если продолжить тащить, то резко увеличиваются в размерах и пропадают за пределами pictureBox. Код Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178.
Pallaris, но ведь мы должны перерисовывать всё время, пока мышка не отпущена. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2017, 15:59 |
|
Изменить размер нарисованной фигуры передвижением мышки
|
|||
---|---|---|---|
#18+
mraklbrwно ведь мы должны перерисовывать всё время, пока мышка не отпущена. А не должны ли мы перерисовать, когда изменился размер окна, его перетащили, свернули развернули? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2017, 16:27 |
|
Изменить размер нарисованной фигуры передвижением мышки
|
|||
---|---|---|---|
#18+
Нет, размер pictureBox и формы фиксированный. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2017, 16:38 |
|
Изменить размер нарисованной фигуры передвижением мышки
|
|||
---|---|---|---|
#18+
Вам же подсказали как делать. Создали список фигур, в методе прорисовки холста пробегаетесь по списку и прорисовываете фигуры. В событиях, связанных с мышкой, вы только меняете размеры и если надо, координаты фигуры, на которую кликнули. Там же вызываете прорисовку холста. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2017, 17:39 |
|
|
start [/forum/topic.php?fid=20&fpage=45&tid=1399928]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 35ms |
total: | 195ms |
0 / 0 |