Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Часы с тремя стрелками. C++ Builder 5, Как связать стрелки с текущим временем? 
:(
    Опции темы
Masja
Дата 17.12.2005, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.4.2005
Где: Челябинск

Репутация: нет
Всего: 3



smile У меня такая проблема - не знаю как связать стрелки с реальным временем. Помогите доделать, пожалуйста. Вот код того, что сделала, правда в нем может быть много лишнего, т.к. основа взята из одного из предыдущих заданий... С координатами немного пролетела... да и вид не очень симпатичный... потом подгоню все. Если вдруг у кого найдутся свои написанные часики - буду рада, если поделитесь.

С++Builder 5

Код

#define STRICT 
#include <windows.h> 
#include <mem.h> 
#include <stdio.h>
#include <time.h>

#define CLOCK_TIMER1  100

// Прототипы функций 
BOOL InitApp(HINSTANCE); 
LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM);

// Имя класса окна 
char const szClassName[] = "WindowAppClass";

// Заголовок окна 
char const szWindowTitle[] = "Часики";

#define ID_STATIC                1                      // Идентификатор статического текста
#define ID_EDIT                     2                      // Идентификатор редактора текста
#define ID_BUTTON  3                      // Идентификатор кнопки

HWND hStatic;
HWND hEdit;
HWND hButton;

short koord[][2]={{50,0},            //0
                  {52,2},
                  {57,7},
                  {61,11},
                  {64,14},
                  {72,3},              //5
                  {70,20},
                  {73,23},
                  {76,26},
                  {80,30},
                  {83,33},                //10
                  {86,36},
                  {90,40},
                  {93,43},
                  {97,47},
                  {100,50},         //15
                  {97,53},
                  {93,57},
                  {90,61},
                  {86,64},
                  {83,67},            //20
                  {80,70},
                  {76,73},
                  {73,76},
                  {70,80},
                  {67,83},              //25
                  {64,86},
                  {61,90},
                  {57,93},
                  {53,97},
                  {50,100},            //30
                  {47,97},
                  {43,93},
                  {40,90},
                  {36,86},
                  {33,83},              //35
                  {30,80},
                  {26,76},
                  {23,73},
                  {20,70},
                  {17,67},                //40
                  {14,64},
                  {11,61},
                  {7,57},
                  {3,53},
                  {0,50},          //45
                  {3,47},
                  {7,43},
                  {11,40},
                  {14,36},
                  {17,33},          //50
                  {20,30},
                  {23,26},
                  {26,23},
                  {30,20},
                  {33,17},            //55
                  {36,14},
                  {40,11},
                  {43,7},
                  {47,3},
                  {50,0 }};             //60
// =====================================
// Функция WinMain получает управление при запуске приложения
// =====================================

#pragma argsused
int PASCAL WinMain(HINSTANCE hInstance, // идентификатор приложения
     HINSTANCE hPrevInstance,
     LPSTR lpszCmdLine, // указатель на командную строку
     int nCmdShow) // способ отображения
{
 MSG msg; // структура для работы с сообщениями
 HWND hwnd; // идентификатор главного окна приложения
 if(!InitApp(hInstance)) return FALSE;

 // После успешной инициализации приложения создаем главное окно приложения
 hwnd = CreateWindow(
     szClassName, // имя класса окна
     szWindowTitle, // заголовок окна
     WS_OVERLAPPEDWINDOW, // стиль окна
     200,
     100,
     400,
     150,
     0, // идентификатор родительского окна
     0, // идентификатор меню
     hInstance, // идентификатор приложения
     NULL); // указатель на дополнительные параметры

 // Если создать окно не удалось, завершаем приложение
 if(!hwnd) return FALSE;

 // Создаем поле редактирования текста
 hEdit = CreateWindow("edit", NULL, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT,
     10, 100, 200, 20, hwnd, (HMENU)ID_EDIT, hInstance, NULL);

 // Рисуем окно. Для этого после функции ShowWindow, рисующей
 // окно, вызываем функцию UpdateWindows, посылающую
 // сообщение WM_PAINT в функцию окна
 ShowWindow(hwnd, nCmdShow);
 UpdateWindow(hwnd);

 // Запускаем цикл обработки сообщений
 while(GetMessage(&msg, 0, 0, 0)) {
     TranslateMessage(&msg); // Создаем символьные сообщения
     DispatchMessage(&msg);
 }

// Возвращаем значение WParam, переданное в качестве параметра функции PostQuitMessage
 // в процессе инициирования завершения работы приложения из функции окна.
 // Затем завершаем работу приложения
 return msg.wParam;
}

// =====================================
// Функция InitApp Вызывается из функции WinMain для инициализации приложения.
// Выполняет регистрацию класса окна
// =====================================

BOOL InitApp(HINSTANCE hInstance)
{
 ATOM aWndClass; // атом для кода возврата
 WNDCLASS wc; // структура для регистрации класса окна

 // Записываем нулевые значения во все поля структуры
 memset(&wc, 0, sizeof(wc));

// Указатель на функцию окна, обрабатывающую сообщения, предназначенные для всех окон,
 // созданных на основе данного класса
wc.lpfnWndProc = (WNDPROC) WndProc;

 // Идентификатор приложения, которое создало данный класс
 wc.hInstance = hInstance;

 // Идентификатор пиктограммы, используемой для окно данного класса
 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

 // Идентификатор курсора, используемого для окно данного класса
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);

 // Цвет фона окна
 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

 // Имя, которое присваивается создаваемому классу и используется при создании окон данного класса
 wc.lpszClassName = (LPSTR)szClassName;

 // Регистрация класса
 aWndClass = RegisterClass(&wc);

 // Возвращаем результат регистрации класса
 return (aWndClass != 0);
}

// =====================================
// Функция WndProc НЕ ВЫЗЫВАЕТСЯ ни из одной функции приложения.
// Эту функцию вызывает Windows в процессе обработки сообщений.
// Для этого адрес функции WndProc указывается при регистрации класса окна.
// Функция выполняет обработку сообщений главного окна приложения
// =====================================

LRESULT CALLBACK _export WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 // Выполняем обработку сообщений. Идентификатор сообщения передается через параметр msg
 switch (msg) {


     // Это сообщение приходит, когда вы завершаете
     // работу приложения при стандартным для
     // Windows способом
     case WM_CREATE:
         {
          // Создаем таймер, посылающий сообщения функции окна примерно раз в секунду
          SetTimer(hwnd, CLOCK_TIMER1, 1000, NULL);
          break;
         }
         case WM_TIMER:
         {
          // Вызываем перерисовку экрана
          InvalidateRect(hwnd, NULL, FALSE);
          break;
         }
         case WM_PAINT:   // Перерисовка экрана
         {
          HDC        hdc;
          PAINTSTRUCT ps;
          char   Buf[80];
          int    nBuf;
          time_t t;
          struct tm *ltime;
          HPEN hpen;
          short chas;

         hdc = BeginPaint(hwnd, &ps);
         /*hpen = CreatePen(PS_SOLID, 5, RGB(0,0,255));
         SelectObject(hdc, hpen); */
         // Определяем время и его отдельные компоненты
         time(&t);
         ltime = localtime(&t);
         // Подготавливаем буфер, заполняя его строкой с текущим временем
         nBuf = sprintf(Buf, "%02d:%02d:%02d", ltime->tm_hour, ltime->tm_min,
                        ltime->tm_sec);
         SetWindowText(hEdit,Buf);
         Ellipse(hdc,0,0,100,100);
         hpen = CreatePen(PS_SOLID, 5, RGB(255,0,0));
         SelectObject(hdc, hpen);
         MoveToEx(hdc, 50, 50, NULL);
         chas=ltime->tm_hour;
         if(chas>=12)chas-=12;
         chas=chas*5+(ltime->tm_min/10);
         LineTo(hdc,koord[chas][0],koord[chas][1]);
         hpen = CreatePen(PS_SOLID, 3, RGB(0,0,255));
         SelectObject(hdc, hpen);
         MoveToEx(hdc, 50, 50, NULL);
         LineTo(hdc,koord[ltime->tm_min][0],koord[ltime->tm_min][1]);
         hpen = CreatePen(PS_SOLID, 1, RGB(0,0,0));
         SelectObject(hdc, hpen);
         MoveToEx(hdc, 50, 50, NULL);
         LineTo(hdc,koord[ltime->tm_sec][0],koord[ltime->tm_sec][1]);
         EndPaint(hwnd, &ps);
         break;
       }
     case WM_DESTROY: {
          // Инициируем завершение работы приложения,
          // помещая в очередь приложения сообщение
          // WM_QUIT. Это приведет к завершению
          // цикла обработки сообщений в функции WinMain
          KillTimer(hwnd, CLOCK_TIMER1);
          PostQuitMessage(0);
          return 0;
     }
 }

 // Все сообщения, которые не обрабатываются нашей функцией окна,
 //ДОЛЖНЫ передаваться функции DefWindowProc
 return DefWindowProc(hwnd, msg, wParam, lParam);
}

PM MAIL WWW ICQ MSN   Вверх
And234
Дата 21.12.2005, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



У Petzold - а замечательный пример.
Книга Программирование Windows 95 (WINAPI) в двух томах.

PM MAIL ICQ   Вверх
Neitron
Дата 21.12.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



Masja
Тригонометрия тебе поможет.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Exekutor
Дата 21.12.2005, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: 1
Всего: 4



Используй для нахождения координат следующие данные - длину стрелки и координаты центра часов. пусть x1 и y1 - координаты центра тогда отрезок длиной L исходящий из центра будет иметь конечную точку в координатах:
x = x1 + L * cos(a * перевод в радианы)
y = y1 + L * sin(a * перевод в радианы)
а - угол смещения. перевод в радианы - это константа. я ее не помню может кто подскажет... smile
А насчет времени - в билдере есть процедура GetSystemTime или чего-то типа того поройся и найдешь нужное

Это сообщение отредактировал(а) Exekutor - 21.12.2005, 16:53


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
And234
Дата 21.12.2005, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



Часы ниже.

Присоединённый файл ( Кол-во скачиваний: 31 )
Присоединённый файл  clock.cpp 5,69 Kb
PM MAIL ICQ   Вверх
And234
Дата 28.12.2005, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



попробуй это
Цитата(And234 @ 21.12.2005, 18:14)
Присоединённый файл ( Кол-во скачиваний: 2 )
переделать для bilder. У меня его нет. Посмотри как переменные изменяются при пошаговой обработке. но в VC60 проблем нет.
PS всего

Добавлено @ 09:00
Форточка хоть видна или нет?
PM MAIL ICQ   Вверх
Mal Hack
Дата 28.12.2005, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 2
Всего: 261



PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.