Конференция "Начинающим" » перерисовка экрана [D2005, XP]
 
  • gefest80 (28.03.08 17:42) [0]
    такая проблема, в определенном месте экрана (вне формы) выводится постоянно меняющийся текст. Как сделать так, чтобы текст не накладывался друг на друга. Я так понимаю нужно переодически перерисовывать область экрана, на которой выводится текст. Как можно это осуществить?
  • Eraser © (28.03.08 17:49) [1]
    invalidateRect
  • gefest80 (28.03.08 18:36) [2]
    Я может что-то не так делаю, но invalidateRect не работает. Подскажите что именно.
    вот кусок кода вывода текста:

     Rec:=Rect(100,100,500,200);
     invalidateRect(can.Handle,@Rec,false);
     OldBkMode := SetBkMode(can.Handle, Transparent);
     can.TextOut(100,100,inttostr(X)+':'+inttostr(Y));
     SetBkMode(can.Handle, OldBkMode);
  • tesseract © (28.03.08 19:55) [3]

    >  invalidateRect(can.Handle,@Rec,false);


    а can это канва за пределами формы ?  И как это ты текст за пределами выводишь ?
  • gefest80 (28.03.08 20:22) [4]
    да can - это дескриптор всего экрана
    объявлял так:
     can:=TCanvas.Create;
     with can do
     begin
       Handle:=getdc(0);
       font.Color:=clLime;
       Font.Name:='Tempus Sans ITC';
       can.Font.Size:=72;
     end;
    а вывод текста прямо функцией
    can.TextOut(100,100,'TEXT');
  • tesseract © (28.03.08 20:27) [5]
    а напрмую в DC выводить ? дескриптора экрана не существует, ты выводишь на desktop. А он нижлежащее окно.
  • gefest80 (28.03.08 20:33) [6]
    Ну проблема не с выводом изображениия, а с тем чтобы оно не накладывалось друг на друга и было читаемо. Вот тут советовали использовать invalidateRect, но не работает.
  • tesseract © (28.03.08 20:51) [7]
    естесвенно, GetDC(0) выдаёт дескриптор рабочего стола, лучше выведи окно, которое по необходимости перерисовываеться.


    >  а с тем чтобы оно не накладывалось друг на друга и было
    > читаемо


    А ты заполнять предидущий вывод FillRect не пробовал ? TextOut не перерисовывает облать окна которая его не касаеться.  InvalidateRect выведет тебе canvas - только то что нарисовад TextOut  поверх уже выведенного изображения.
  • gefest80 (28.03.08 21:09) [8]
    Воощем проблема такая, нужно сделать таймер, чтобы он всегда был поверх всех окон. Установка свойства окна StayOnTop не помогает. Так как планируется использовать таймар, например, при просмотре презентаций PowerPoint.
    Лучшего варианта, чем выводить прямо на десктоп я не нашел.
    FillRect не устраивает, так как слишком большая область экрана при этом остается закрашеной.
    Пробовал просто перед началом вывода текста копировать область фона и затем потом выводить текст на него и уже с текстом возвращать его на экран. Но возникает другая проблема, как быть если изображение на десктопе меняется (старый фон уже не катит)....
  • MetalFan © (28.03.08 22:26) [9]

    >  Handle:=getdc(0);

    ReleaseDC то потом надеюсь делается?
  • tesseract © (29.03.08 15:42) [10]

    > FillRect не устраивает, так как слишком большая область
    > экрана при этом остается закрашеной.



    > . Но возникает другая проблема, как быть если изображение
    > на десктопе меняется (старый фон уже не катит)....


    Хапать старый фон, выводить свой, при перерисовке выводить обратно, было решение - сейчас не помню.
  • {RASkov} © (29.03.08 16:25) [11]
    Если фон действительно статичен, т.е. по этому месту не елозят никакие окна там например, или еще что, а только обновляется наша инфа, то есть решение... с "кусочком старого фона" во временном битмапе.... при выводе "нашей" инфы, сначало "затирать" участок старым фоном, и сверху выводить инфу...
 
Конференция "Начинающим" » перерисовка экрана [D2005, XP]
Есть новые Нет новых   [134433   +22][b:0][p:0]