
Новичок
Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.4.2005
Где: Челябинск
Репутация: нет Всего: 3
|
 У меня такая проблема - не знаю как связать стрелки с реальным временем. Помогите доделать, пожалуйста. Вот код того, что сделала, правда в нем может быть много лишнего, т.к. основа взята из одного из предыдущих заданий... С координатами немного пролетела... да и вид не очень симпатичный... потом подгоню все. Если вдруг у кого найдутся свои написанные часики - буду рада, если поделитесь. С++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); }
|
|