Перемещение окна в форме текста

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Перемещение окна в форме текста

Сообщение viter.alex » 01.11.2009 (Вс) 2:52

По примеру из книги сделал окно в виде текста:
Код: Выделить всё
  Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
    MyBase.BackColor = Color.Blue
    Dim gp As New System.Drawing.Drawing2D.GraphicsPath
    Dim hwnd As New IntPtr
    Dim fntfml As FontFamily = New FontFamily("Times New Roman")
    Dim fntsz As Integer = 40
    Dim fntstl As FontStyle = FontStyle.Bold
    Dim fnt As Font = New Font(fntfml, fntsz, fntstl)

    hwnd = MyBase.Handle
    Dim g As Graphics = Graphics.FromHwnd(hwnd)
    gp.AddString(sShadowingStatus, fntfml, fntstl, fntsz, Me.Location, StringFormat.GenericDefault)

    MyBase.Region = New Region(gp)
    MyBase.Size = g.MeasureString(sShadowingStatus, fnt).ToSize
    gp.Dispose()
    MyBase.OnPaintBackground(e)
  End Sub

Очень удобно, мне на форме кроме текста ничего не нужно, да и выглядит красиво. Но вопрос стал в перемещении этой формы. Перемещаю я форму таким кодом:
Код: Выделить всё
  Const WM_NCHITTEST As Integer = &H84
  Const HTCAPTION As Integer = &H2

  Protected Overrides Sub WndProc(ByRef m As Message)
    If (m.Msg = WM_NCHITTEST) Then
      m.Result = IntPtr.op_Explicit(HTCAPTION)
      Return
    End If
    MyBase.WndProc(m)
  End Sub

Так вот, форма хорошо отображается, пока ее не трогаешь. Когда я ее хватаю мышкой и переношу, она переносится, но при отпускании сразу пропадает и больше не появляется. В чем может быть дело?
Лучше день потерять — потом за пять минут долететь!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Перемещение окна в форме текста

Сообщение Nord777 » 01.11.2009 (Вс) 3:52

Вопрос на засыпку: для чего ты это делаешь в OnPaintBackground?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение окна в форме текста

Сообщение viter.alex » 01.11.2009 (Вс) 11:32

Текст формы постоянно перерисовывается, а OnPaintBackGround работает быстрее, чем OnPaint. Да и в книге так было написано
Лучше день потерять — потом за пять минут долететь!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Перемещение окна в форме текста

Сообщение Nord777 » 01.11.2009 (Вс) 12:41

sShadowingStatus меняется по таймеру или как? У тебя в коде этого не видно.

Да и в книге так было написано
Автор книги как-то обьясняет смысл этой строки: Dim g As Graphics = Graphics.FromHwnd(hwnd) :?:
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение окна в форме текста

Сообщение viter.alex » 01.11.2009 (Вс) 15:05

sShadowingStatus меняется по таймеру, совершенно верно.
А Graphics мне нужен, чтобы измерить прямоугольник, в который помещается строка, и подогнать размеры формы. Если можно сделать иначе, то подскажи, пожалуйста
Лучше день потерять — потом за пять минут долететь!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Перемещение окна в форме текста

Сообщение Nord777 » 01.11.2009 (Вс) 18:04

Во-первых, ты промахиваешься в координатах:
gp.AddString(sShadowingStatus, fntfml, fntstl, fntsz, Me.Location, StringFormat.GenericDefault)
Me.Location - это положение формы относительно рабочего стола.
Тебе надо New Point(0,0)

Во-вторых, изменять регион в OnPaintBackGround не оптимально. Изменяй в обработчике таймера.
И наконец Me.CreateGraphics вместо Graphics.FromHwnd(hwnd)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение окна в форме текста

Сообщение viter.alex » 01.11.2009 (Вс) 19:46

Да, действительно, проблема была именно в исходной точке, но не понимаю почему :oops:
Лучше день потерять — потом за пять минут долететь!

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение окна в форме текста

Сообщение viter.alex » 02.11.2009 (Пн) 0:28

Еще вопрос на ту же тему. Форму в виде текста сделали, но перемещать ее можно, естественно только схватив за текст. Между буквами схватить не получится. Можно это решить? И как? Отслеживать курсор? Подложить под текст картинку прозрачную? Пробовал и то и другое, но у меня не получается.
Лучше день потерять — потом за пять минут долететь!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Перемещение окна в форме текста

Сообщение Nord777 » 02.11.2009 (Пн) 1:12

Это из-за применения региона. Так и должно быть.
То, что ты пытаешься сделать будет вводить в заблуждение.
Либо регион - и таскать за буквы
Либо полупрозрачный фон - и таскать за всю поверхность.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение окна в форме текста

Сообщение viter.alex » 02.11.2009 (Пн) 2:51

Хорошо, фон так фон. Обойдемся без региона, хотя и красиво. Делаю форму прозрачной через TransparencyKey. На форму ставлю Label. Все равно эффект тот же самый. Между буквами Label таскать не получается. А если ставить Opacity = 1%, то тогда и Label становится прозрачной. Как быть?
Лучше день потерять — потом за пять минут долететь!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Перемещение окна в форме текста

Сообщение MIT » 02.11.2009 (Пн) 8:40

viter.alex писал(а):Как быть?
Отрисовать в памяти фон формы: нарисовать текст, разблурить его, приделать прозрачность в, например, 200 или градиентную к краю, а поверх нарисовать черным текст. И UpdateLayeredWindow тебе в помощь.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Перемещение окна в форме текста

Сообщение Dmitry81 » 02.11.2009 (Пн) 9:48

Стоп... но ведь форма не поддерживает прозрачных цветов... Например, если задать цвет fromARGB и указать альфа-составляющую отличную от 255 (т.е. с некоторой степенью прозрачности), то ничего не выйдет - форма прозрачной не станет...
Разве только на лейбле шрифт пожирнее сделать (для упрощения захвата мышью)...
Или я не понял MIT`а.
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Перемещение окна в форме текста

Сообщение MIT » 02.11.2009 (Пн) 9:52

Ты наверно не знаешь что такое UpdateLayeredWindow. В соседнем разделе недавно обсуждали что-то похожее, на .NET`е это сделать будет куда проще (ну и Гугль в помощь - примеров тьма).
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Перемещение окна в форме текста

Сообщение Dmitry81 » 02.11.2009 (Пн) 10:17

MIT писал(а):Ты наверно не знаешь что такое UpdateLayeredWindow.

В точку! С изображениями редко работаю...
Буду изучасть МЧ...
Спс
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение окна в форме текста

Сообщение viter.alex » 02.11.2009 (Пн) 11:41

Все-таки получилось через PNG и рисование текста. Но, что-то я не пойму, как очищать форму. Рисую строку на форме:
Код: Выделить всё
      With frmFlying.CreateGraphics
        .DrawString(sFlyingString, FlyingFnt, Brushes.AliceBlue, 0, 0)
        frmFlying.Size = .MeasureString(sFlyingString, FlyingFnt).ToSize
        .Dispose()
      End With

Но, поскольку делаю это по таймеру, то изображения строк накладываются. Т.е. перед прорисовкой нужно как-то сбросить все, что уже нарисовано. Не догоню как.

И как создать кисть нужного мне цвета, чтобы использовать в DrawString
Лучше день потерять — потом за пять минут долететь!

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение окна в форме текста

Сообщение viter.alex » 02.11.2009 (Пн) 12:11

Кисть создал через SolidBrush, а вот с очисткой формы вопрос остался открытым
Лучше день потерять — потом за пять минут долететь!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Перемещение окна в форме текста

Сообщение MIT » 02.11.2009 (Пн) 13:49

Invalidate?

А вообще я бы посоветовал использовать для всего этого буфер - так удобнее.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Перемещение окна в форме текста

Сообщение Dmitry81 » 02.11.2009 (Пн) 15:47

Код: Выделить всё
Dim g as Graphics = frmFlying.CreateGraphics
With g
        .DrawString(sFlyingString, FlyingFnt, Brushes.AliceBlue, 0, 0)
        frmFlying.Size = .MeasureString(sFlyingString, FlyingFnt).ToSize
        .Dispose()
      End With

а очистить можно так тогда:
Код: Выделить всё
g.Clear(цвет очистки)
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение окна в форме текста

Сообщение viter.alex » 02.11.2009 (Пн) 16:04

Пробовал через Clear, остается только цвет очистки :(
Лучше день потерять — потом за пять минут долететь!

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Перемещение окна в форме текста

Сообщение Dmitry81 » 02.11.2009 (Пн) 16:54

ну так потом на том же графиксе все снова рисуй. Только строку новую...
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList