Конференция "WinAPI" » Как заставить работать таймер? [D7, WinXP]
 
  • Nikfel (21.11.09 22:34) [0]
    Почему-то не работает таймер хотя все верно создано. Просто когда уберешь из кода обработку wm_paint, то работает, а мне надо чтобы с wm_paint работало. Под скажите, пожалуйста, что не так? Заранее спасибо. Вот код для примера:
    Program Api;

    uses
     Windows, Messages;

    var
    window: TWndClassEx;
    Mwindow: HWND;
    Mmsg: MSG;

    // Процедура обработки сообщений
    function WindowProc(wnd: HWND; msg: integer;  wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
    begin
    case msg of
     wm_paint:;
     wm_create:settimer(wnd,7,1000,nil);
     wm_timer:begin
       case wparam of
         7:showwindow(wnd,sw_hide);
       end;
     end;
     WM_Destroy:
      begin
       killtimer(wnd,7);
       PostQuitMessage(0);
       Result:=0;
       Exit;
      end;
      else
       Result:=DefWindowProc(wnd,msg,wparam,lparam);
    end;
    end;

    // Ристрация созданого класса
    begin
    window.cbSize     :=sizeof (window);
    window.style      :=CS_HREDRAW or CS_VREDRAW;
    window.lpfnWndProc:=@WindowProc;
    window.cbClsExtra :=0;
    window.cbWndExtra :=0;
    window.hInstance  :=HInstance;
    window.hIcon      :=LoadIcon (0,IDI_APPLICATION);
    window.hCursor    :=LoadCursor (0,IDC_ARROW);
    window.hbrBackground:=Color_BtnFace+12;
    window.lpszMenuName :=nil;
    window.lpszClassName:='Main_Window';
    RegisterClassEx (window);
    // Создание окна на основе созданного класса
    Mwindow:=CreateWindowEx(0,'Main_Window','First_WinAPI_Program',WS_OVERLAPPEDWIND OW,100,100,300,300,0,0,Hinstance,nil);
    // Показать созданное окно
    SHOWWINDOW(Mwindow,SW_Show);
     // Цикл обработки сообщений
    while GetMessage(Mmsg,0,0,0) do
     begin
      TranslateMessage(Mmsg);
      DispatchMessage(Mmsg);
     end;
    end.

  • DVM © (21.11.09 22:37) [1]

    > Просто когда уберешь из кода обработку wm_paint, то работает,
    >  а мне надо чтобы с wm_paint работало.

    Почти все сообщения Windows нуждаются в возвращении некого результата, у тебя же в том же wm_paint пусто.
  • nikfel (21.11.09 22:45) [2]
    А что именно должно там быть чтобы таймер работал. Просто в любом случае, если есть wm_paint, таймер не работает.
  • nikfel (21.11.09 23:03) [3]
    Нашел что добавить надо:
    var ps:TPaintStruct;
    ...
    wm_paint:begin
     BeginPaint(wnd,ps);

     EndPaint(wnd,ps);
    end;

  • DVM © (21.11.09 23:24) [4]

    > nikfel   (21.11.09 23:03) [3]

    result := 0 еще не забудь
 
Конференция "WinAPI" » Как заставить работать таймер? [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]