Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Вниз

Static без мерцания   Найти похожие ветки 

 
Игорь00   (2007-12-11 16:05) [0]

Уважаемые мастера.
Скажите,как сделать STATIC БЕЗ МЕРЦАНИЯ.
сПАСИБО.
program Project1;

uses
  windows, messages,sysutils;
const
   id_Static = 100;
   FPS_TIMER = 1; // Timer to calculate FPS
 FPS_INTERVAL = 1; // Calculate FPS every 1000 ms

var
   x:Cardinal;

function ModifyFont(const ID:Cardinal; FontName:string;FontSize:Word):Boolean;
var
   LogFont:PLogFont; //log-шрифт
   Font:HFont; //шрифт
begin
   New(LogFont);
   LogFont^.lfWidth:=0;
   LogFont^.lfHeight:=FontSize;
   LogFont^.lfWeight:=700;
   LogFont^.lfEscapement:=0;
   LogFont^.lfItalic:=0;
   LogFont^.lfUnderline:=0;
   LogFont^.lfStrikeOut:=0;
   LogFont^.lfPitchAndFamily:=FF_MODERN;
   StrPCopy(LogFont^.lfFaceName,FontName);
   Font:=CreateFontIndirect(LogFont^);
   SendMessage(ID,WM_SETFONT,Font,0);
   Dispose(LogFont);
   Result:=True;
end;

procedure Update;
begin
   Windows.SetWindowText(x,PChar(FormatDateTime("hh:mm:ss:zzz",now)));
end;

function MainWndProc(hWindow: HWND; Msg: UINT; wParam: wParam;
  lParam: lParam): LRESULT; stdcall; export;
var
  ps: TPaintStruct;
  s:string;
begin
  Result := 0;
  case Msg of
    WM_PAINT:
      begin
        BeginPaint(hWindow, ps);
        EndPaint(hWindow, ps);
       Result:=0;
      end;
     wm_Create:
    begin
     Windows.SetTimer(hWindow,FPS_TIMER, FPS_INTERVAL,nil);
     // create button
     x:=CreateWindowEx (0, // extended styles
       "STATIC", // predefined class
       "", // caption
       ws_Child or ws_Visible, // styles
       0, 0,
       400, 70, // size
       hWindow, // parent
       id_Static, // identifier (not a menu handle)
       hInstance, // application id
       nil); // init info pointer
       ModifyFont(x,"Tahoma",60);
   end;
   WM_CTLCOLORSTATIC:
       begin
              if (lParam = Integer(x)) then
               begin
                   SetBkColor(wParam,BLACK_BRUSH);
                   Windows.SetTextColor(wParam,rgb(50,255,0));
                   Result:=GetStockObject(BLACK_BRUSH);
                   Exit;
               end;
               Result:=0;
       end;

    WM_TIMER:
       begin
           if wParam = FPS_TIMER then
           begin
               update;
           end;
           Result:=0;
       end;
    WM_DESTROY: PostQuitMessage(0);
    else
      begin
       KillTimer(hWindow,0);
        Result := DefWindowProc(hWindow, Msg, wParam, lParam);
        Exit;
      end;
  end;
end;

// Main Procedure

var
  wc: TWndClass;
  hWindow: HWND;
  Msg: TMsg;
begin
  wc.lpszClassName := "YourAppClass";
  wc.lpfnWndProc   := @MainWndProc;
  wc.Style         := CS_VREDRAW or CS_HREDRAW;
  wc.hInstance     := hInstance;
  wc.hIcon         := LoadIcon(0, IDI_APPLICATION);
  wc.hCursor       := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := (COLOR_WINDOW + 1);
  wc.lpszMenuName  := nil;
  wc.cbClsExtra    := 0;
  wc.cbWndExtra    := 0;
  RegisterClass(wc);
  hWindow := CreateWindowEx(WS_EX_CONTROLPARENT or WS_EX_WINDOWEDGE,
    "YourAppClass",
    "API",
    WS_VISIBLE or WS_CLIPSIBLINGS or
    WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0,
    400, 300,
    0,
    0,
    hInstance,
    nil);

  ShowWindow(hWindow, CmdShow);
  UpDateWindow(hWindow);

  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  Halt(Msg.wParam);
end.


 
spyrytus   (2007-12-11 21:59) [1]

Я так понял, что ты перерисовываешь время в STATIC окне. Если ты создаешь в API STATIC окно, тогда оно существует само по себе, и перерисовывать его не нужно. То есть при вызове WM_PAINT - оно остается ! В случае если бы ты рисовал непосредственно на форме - тогда б тебе пришлось бы писать все это. Также зачем ты в WM_PAINT пишешь подряд две команды, первая с которых:
This function prepares the specified window for painting and fills a PAINTSTRUCT structure with information about the painting. , но затем ты пишешь:
This function marks the end of painting in the specified window. , ты же их так и не применил, а вот контекст устройства для рисования создал, а затем уничтожил.
Попробуй сперва убрать то, что я тебе сказал, то есть в WM_PAINT, возможно перестанет моргать.

P.S. Если тебе действительно интересно писать на API, напиши мне на E-mail, я тебе, чего нибудь подкину, посмотришь.


 
DVM ©   (2007-12-11 22:02) [2]


> Скажите,как сделать STATIC БЕЗ МЕРЦАНИЯ.

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.006 c
2-1218625101
Дмитрий
2008-08-13 14:58
2008.10.05
Как заполнить поле одной таблицы из другой - перенести данные


2-1219895591
snake-as
2008-08-28 07:53
2008.10.05
Печать картинок


2-1219927692
DJones
2008-08-28 16:48
2008.10.05
Событие MouseMove и всплывающее окно.


15-1218639160
Goric
2008-08-13 18:52
2008.10.05
Отображение файлов


15-1218713820
cyborg
2008-08-14 15:37
2008.10.05
Алгоритм Ахо-Карасик





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский