Лучший способ создать таймер на экране

У меня была идея создать таймер обратного отсчета, например, 01:02, на экране (полный размер). Одно дело в том, что я действительно понятия не имею, как начать.

Я знаю основы c/c++, win32 api и немного gdi.

У кого-нибудь есть какие-либо указания о том, как начать это? Моя программа была бы похожа на превращение компьютера в большой секундомер (но с дополнительными функциями).

Я не прошу код, просто некоторые идеи/праймеры о том, как это начать. Занимаясь в основном веб-вещами, я немного заржавел в программировании win.

Любые идеи приветствуются

Спасибо

Примечание. Я думаю, что мне придется сделать это с помощью c/c++ из-за скорости. Моя программа секундомера будет работать на очень медленном компьютере, например, на p3 800 МГц, поэтому скорость действительно важна.


person AntonioCS    schedule 27.01.2009    source источник


Ответы (3)


Если у вас есть некоторый опыт работы с обработкой сообщений Windows и Win32 API, это должно помочь вам начать работу.

LRESULT WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
  HDC hdc; 
  PAINTSTRUCT ps; 
  RECT r; 
  char szBuffer[200]; 
  static int count = 120; 
  int seconds = 0;
  int minutes = 0;
  int hours  = 0;

  switch (message) { 
  case WM_CREATE: 
    // create a 1 second timer 
    SetTimer (hwnd, ID_TIMER, 1000, NULL); 
    return 0;      

  case WM_PAINT:
    if(count > 0)
    {
        hdc = BeginPaint (hwnd, &ps); 
        GetClientRect (hwnd, &r);
        hours = count / 3600;
        minutes = (count / 60) % 60;
        seconds = count % 60;
        wsprintf (szBuffer, "Hours: %d Minutes: %d Seconds: %d", hours, minutes, seconds); 
        DrawText (hdc, szBuffer, -1, &r, DT_LEFT); 
        EndPaint (hwnd, &ps); 
    }
    else
    {
        SendMessage (hwnd, WM_CLOSE, 0, 0L)
    }
    return 0; 

  case WM_TIMER: 
    count--;       
    InvalidateRect (hwnd, NULL, TRUE);
    return 0;        

  case WM_DESTROY: 
    KillTimer (hwnd, ID_TIMER); 
    PostQuitMessage (0); 
    return 0; 
  }  /* end switch */ 
 } 

Вот хорошая ссылка на использование таймеров:

Использование таймеров

person Phaedrus    schedule 27.01.2009
comment
Ух ты! Спасибо!! Я обязательно проанализирую этот код и очень надеюсь, что это мне поможет :) Еще раз спасибо! - person AntonioCS; 28.01.2009
comment
Не считайте время... э... считая с WM_TIMER, так как это будет неточно. Лучше использовать системное время в миллисекундах и обновлять его с интервалом в одну секунду WM_TIMER с текущим значением системного времени. - person macbirdie; 12.02.2009

Создайте таймер, чтобы ваше приложение реагировало на событие таймера, отправляя сообщение рисования самому себе. Не забудьте удалить таймер при выходе из приложения.

person Joe Soul-bringer    schedule 27.01.2009

Часы работают с одной сменой экрана в секунду; процессор с частотой 800 МГц обрабатывает около 800 миллионов инструкций в секунду. Это примерно на 799 миллионов больше, чем вам нужно, поэтому эффективность НЕ является проблемой. Это все равно будет работать в Jvascript внутри браузера. Однако это не означает, что C или C++ не подходят.

Самый простой способ запрограммировать Win32 — через вспомогательную библиотеку. wxWidgets и Qt — хороший выбор, и оба бесплатны. Они немного сэкономят вам на гайках и болтах. По сути, в обоих случаях вы создаете объект Window, содержащий объект текстового поля и объект таймера, и просто связываете отметку таймера с обновлением текста.

person MSalters    schedule 29.01.2009