Почему мерцает длинныи Леибл - Текст при обновлении

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Почему мерцает длинныи Леибл - Текст при обновлении

Сообщение student-uni » 19.11.2007 (Пн) 11:58

Обновляю в цикле Леибл - Текст - такои счетчик, показывающии номер итеррации цикла.
Так вот если леибл короткии - все идеально,
но если слишком широкии - то Текст в леибле мерцает.
Можно что-то сделать чтоб убрать это мерцание ?

Спасибо

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.11.2007 (Пн) 12:12

Выводи текст через API, чтобы VB не перерисовывал сам.
Помести лейбл в контейнер (Frame или PictureBox).
Lasciate ogni speranza, voi ch'entrate.

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 19.11.2007 (Пн) 12:41

Поместил в контеинер - тоже самое.
Подскажите ключевые слова для поиска вывода Текста через АПИ ?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.11.2007 (Пн) 12:45

DrawText/TextOut
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 19.11.2007 (Пн) 13:16

ерунда какая то
в событии лоад - срабатывает
а по клику кнопки - нет
В чем может быть дело ?
Спасибо

Код: Выделить всё
Option Explicit

Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private Const DT_CENTER = &H1
Private Const DT_SINGLELINE = &H20
Private Const DT_VCENTER = &H4

Dim myRect As RECT

Private Sub Command1_Click()
  Me.ScaleMode = vbPixels
  myRect.Left = 0
  myRect.Top = 0
  myRect.Right = Me.ScaleWidth
  myRect.Bottom = Me.ScaleHeight
  DrawText Me.hdc, "Hello", Len("Hello"), myRect, DT_SINGLELINE Or DT_VCENTER Or DT_CENTER
End Sub

Private Sub Form_Load()
 
  Me.ScaleMode = vbPixels
  myRect.Left = 0
  myRect.Top = 0
  myRect.Right = Me.ScaleWidth
  myRect.Bottom = Me.ScaleHeight
  DrawText Me.hdc, "DrawText!", Len("DrawText!"), myRect, DT_SINGLELINE Or DT_VCENTER Or DT_CENTER
End Sub

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.11.2007 (Пн) 13:22

AutoRedraw?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 19.11.2007 (Пн) 13:27

true
интересно что если я ставлю брекпоинт и пытаюсь отладить - второе слово выходит поверх первого !!!

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.11.2007 (Пн) 13:41

Я не спрашиваю, я указываю на причину. Кроме того есть Cls.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 19.11.2007 (Пн) 14:03

Это функция обьекта напр PictureBox ?
а у меня структура
и еще PictureBox я по ссылке в функцую DrawText передать немогу

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.11.2007 (Пн) 14:25

Какая у тебя структура?
И зачем PictureBox передавать по ссылке? У него есть свойство hDC.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.11.2007 (Пн) 14:26

student-uni, что-то ты непонятное ответил... как то не в тему...
Весь мир матрица, а мы в нем потоки байтов!

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 19.11.2007 (Пн) 14:41

Cls -- это метод. Есть и у формы, и у PictureBox. Для вывода текста, как тебе уже сказали, очищай то, куда выводишь этот текст (форму или PictureBox, используя этот самый Cls)
Осмелюсь предположить, что "не могу передать по ссылке" -- это значит, что когда автор пишет "DrawText Picture1.hdc,...", то в PictureBox ничего не отображается. Я прав? Если да, то перед вызовом функции DrawText используй Picture1.Cls и заполни структуру RECT следующим образом
Код: Выделить всё

  Picture1.ScaleMode = vbPixels
  myRect.Left = 0
  myRect.Top = 0
  myRect.Right = Picture1.ScaleWidth
  myRect.Bottom = Picture1.ScaleHeight
Salus populi suprema lex

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 19.11.2007 (Пн) 16:07

2 dr.MIG
Спасибо получилось
вот рабочии код
Код: Выделить всё
Option Explicit

Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private Const DT_CENTER = &H1
Private Const DT_SINGLELINE = &H20
Private Const DT_VCENTER = &H4



Private Sub Command1_Click()

  Dim myRect As RECT
Picture1.Cls
 
  Picture1.ScaleMode = vbPixels
  myRect.Left = 0
  myRect.Top = 0
  myRect.Right = Picture1.ScaleWidth
  myRect.Bottom = Picture1.ScaleHeight

   

  DrawText Picture1.hdc, "DrawText!", Len("DrawText!"), myRect, DT_SINGLELINE Or DT_VCENTER Or DT_CENTER
End Sub

Private Sub Command2_Click()
Dim myRect As RECT
Picture1.Cls
 
  Picture1.ScaleMode = vbPixels
  myRect.Left = 0
  myRect.Top = 0
  myRect.Right = Picture1.ScaleWidth
  myRect.Bottom = Picture1.ScaleHeight


  DrawText Picture1.hdc, "!", Len("!"), myRect, DT_SINGLELINE Or DT_VCENTER Or DT_CENTER
End Sub



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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 17

    TopList  
cron