Rectangel... помогите разобраться.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Rectangel... помогите разобраться.

Сообщение XairOn » 14.03.2005 (Пн) 11:40

Здравствуйте, с таким вопросом я к вам обращаюсь, в графическом редакторе нужно дать пользователю возможность рисовать прямоугольники, для этого юзаю Rectangel, и всё вроде хорошо, да только вот такой момент: если при рисовании прямоугольника начать уменьшать его (т.е. не отпуская кнопку мыши... сначала растянуть его, а потом наоборот уменьшать), то получается не очень красивый эффект, предыдущий прямоугольник не стирается а остается, вобщем лажа какая-то, ну и отсюда вопрос как этого избежать? Picture1.Cls мне не подходить, т.к. сотрется не только лишнее, но и всё нарисованное до этого... а это не есть гуд :-( вобщем на всякий случай кину код того, как я это делаю, может кто-нибудь предложит другой метод.
Код:
Код: Выделить всё

Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal x1 As Long, ByVal y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Dim xq1 As Single, yq1 As Single
Dim mBrush As Long, hRPen As Long

Private Sub Form_Load()
    Picture1.AutoRedraw = True
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    xq1 = x / 15
    yq1 = y / 15
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = 1 Then
        mBrush = CreateSolidBrush(crNewColor)
        SelectObject Picture1.hdc, mBrush
        Rectangle Picture1.hdc, xq1, yq1, x / 15, y / 15
        DeleteObject mBrush
        Picture1.Refresh
    End If
End Sub

Большая часть, как вы понимаете, была вырезана из Api-Guide... мне к сожалению, этот механизм не очень понятен :-( Спасибо!

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 14.03.2005 (Пн) 17:16

Вобщем, глядя на активность, я хочу конкретезировать вопрос. Есть такая мысль, создать DC, скопировать в него содержимое PictureBox'а, в MouseMove в начале вызывать Picture1.Cls, а после него из нашего DC скопировать обратно всё содержимое в Picture1.hDC... теоретически должно сработать, хотя может это не очень красиво и грамотно, но сработать должно, только вот как это всё замутить??? ... остается для меня загадкой, помогите ПЛИЗ!!! Может есть способ попроще???

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.03.2005 (Пн) 17:28

Закинь в пикчербокс невидимый shape. Обрабатывая движения мыши, показывай и растягивай его...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 14.03.2005 (Пн) 17:29

копай в сторону ReleaseDC, InvalidateRect

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 14.03.2005 (Пн) 17:59

копай в сторону ReleaseDC, InvalidateRect

Спасибо большое что откликнулся, но нельзя ли чуточку поподробнее, а то что-то не очень понятно.

Andrev
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 19.01.2005 (Ср) 9:22
Откуда: Kursk

Боже!...

Сообщение Andrev » 14.03.2005 (Пн) 18:13

Насколько я помню, это проблема десятого класса.
В чем проблема? Запоминай предыдущие координаты и сначала рисуй с ними прямоугольник с цветом BackColor твоего Picture (таким образома ты убираешь тот ректангл, которые нарисовал до этого), а затем уже рисуй прямоугольник с текущими координатами.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 14.03.2005 (Пн) 18:13

вот как я бы сделал :

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 14.03.2005 (Пн) 18:30

Bonesnapper, спасибо большое, это как раз то, что мне было нужно... единственное до чего я не догадался, это: Picture1.Picture = Picture1.Image ;-) вроде такая простая строчка, а освобождает меня от стольких проблем![/quote]

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 14.03.2005 (Пн) 19:23

Блин, мне казалось проблема решена... НО... увы. Bonesnapper, твой пример работает отлично и внём меня всё устраивает, но когда я вмонтировал его в свою прогу обнаружился такой вот глюк: когда рисуешь прямоугольники, всё ok, но если на форме нарисовано, что-то ещё (например "карандашиком"... как в Paint'е) оно стирается (Picture1.Cls елает своё дело)... прямоугольники почему-то остаются, а всё остальное стирается :-( В чем дело?

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 14.03.2005 (Пн) 23:17

после того как нарисовал карандашем делай
Picture1.Picture = Picture1.Image

Deja-vu
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 55
Зарегистрирован: 02.11.2004 (Вт) 22:02

Сообщение Deja-vu » 15.03.2005 (Вт) 0:25

Bonesnapper
после того как нарисовал карандашем делай
Picture1.Picture = Picture1.Image
Повторение, мать учения! :lol: Хороший пример.

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 15.03.2005 (Вт) 13:16

Bonesnapper, сновая тебя благодарю, отлично работает, меня всё устраивает, вот только я смысла это операции понять не могу Picture1.Picture = Picture1.Image, не мог бы ты (или кто-то другой) объяснить в двух словах, что это мы тут делаем??? Что бына будующее знать!

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 15.03.2005 (Вт) 17:33

да я точно сам не знаю
image походу это то что на hdc(включая и картинку)
picture -это сама картинка как раз ее и можно сохранить


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 137

    TopList