Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2010, 00:23   #1
Praid
 
Регистрация: 17.04.2010
Сообщений: 7
По умолчанию Аналоговые часы (WinAPI + GDI + C++) ?

Задали написать программу выводящую на экран изображение работающих часов, у которых есть секунудная и минутная стрелка. Нашел bmp изображение часов (без стрелок) создал по нему регион, вывел изображение часов (без стрелок), добавил обработчики событий что бы можно было перетаскивать часы левой кнопкой мыши, а выключать правой.
В общем не знаю как реализовать движение стрелок, у меня получается что стрелки вы водятся на не исчезают при изменение координат. Как сделать так что бы казалось что стрелка движется ? И что бы когда часы были закрыты другим окном они не сбивались ?
Вот сам проект. http://rghost.ru/1594117

А вот код СPP:
Цитата:
// Clock-3.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "Clock-3.h"
#include <math.h>
#include <conio.h>
#include <windows.h>


#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
HBITMAP maskBitmap;
HWND hWnd;

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstanc e);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;

// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_CLOCK3, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CLOCK3));

....................

....................

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HDC hdcBits;

switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
hdcBits=::CreateCompatibleDC(hdc);
SelectObject(hdcBits, maskBitmap);
BitBlt(hdc, 0, 0, 280, 280, hdcBits, 0, 0, SRCCOPY);
// SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
// SetLayeredWindowAttributes(hWnd, 0, 220, LWA_ALPHA);

{ // секундная стрелка
HPEN hpen,hPenOld;
hpen = CreatePen(PS_SOLID,2,RGB(255,100,10 0));
hPenOld = (HPEN)SelectObject(hdc,hpen);

MoveToEx(hdc,119,119,NULL);
LineTo(hdc,119,35);

SelectObject(hdc,hPenOld);
DeleteObject(hpen);
}

{ // минутная стрелка
HPEN hpen,hPenOld;
hpen = CreatePen(PS_SOLID,3,RGB(80,80,80)) ;
hPenOld = (HPEN)SelectObject(hdc,hpen);

MoveToEx(hdc,119,119,NULL);
LineTo(hdc,155,65);

SelectObject(hdc,hPenOld);
DeleteObject(hpen);
}

{ // заглушка в центре циферблата
HPEN hpen,hPenOld;
hpen = CreatePen(PS_SOLID,3,RGB(170,170,17 0));
hPenOld = (HPEN)SelectObject(hdc,hpen);
HBRUSH hBrush,hBrushOld;
hBrush = CreateSolidBrush(RGB(80,0,0));
hBrushOld = (HBRUSH)SelectObject(hdc,hBrush);

Ellipse(hdc,113,113,125,125);

SelectObject(hdc,hBrushOld);
DeleteObject(hBrush);
SelectObject(hdc,hPenOld);
DeleteObject(hpen);
return WM_PAINT;
}

DeleteDC(hdcBits);
EndPaint(hWnd, &ps);
break;

case WM_NCHITTEST:
{
return HTCAPTION;
}

case WM_NCRBUTTONUP:

{
PostQuitMessage(0);
}

default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
WinAPI изучаю всего две недели.
Спасибо за ответ !
Praid вне форума Ответить с цитированием
Старый 12.05.2010, 16:07   #2
Praid
 
Регистрация: 17.04.2010
Сообщений: 7
По умолчанию

В общем подсказали что надо использовать двойной буфер или обновлять изображение без стрелок, а потом рисовать новое положение стрелки.
Объясните как рисовать стрелки через двойной буфер ? И как обновлять изображение без стрелок ?
Praid вне форума Ответить с цитированием
Старый 12.05.2010, 17:03   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

1) Рисуем на временном холсте часы (их фон)
2) Рисуем на нем час. стрелку
3) Рисуем на нем мин. стрелку
4) Рисуем на нем сек. стрелку
5) Рисуем временный холст на экран
6) Рисуем "заглушку"
7) Иди на 1)

Временным холстом может послужить HBitMap.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 15.05.2010, 19:39   #4
Praid
 
Регистрация: 17.04.2010
Сообщений: 7
По умолчанию

А как сделать что бы стрелка поворачивалась меньше чем на один градус ?

Вот сделал свой таймер:
Код:
			int sec=0,sec2=0;
			SYSTEMTIME st;
            GetSystemTime(&st);
			sec2 = st.wSecond;
			do
			 {
			   SYSTEMTIME st;
               GetSystemTime(&st);
			   sec = st.wSecond;
			}
			while (sec!=sec2+1);
Но он сильно грузит проц и часы подлагивают когда пытаешься их переместить.
Можно ли заменить SetTimer другим таймеров без отправки сообщений ?
Praid вне форума Ответить с цитированием
Старый 15.05.2010, 19:45   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
меньше чем на один градус ?
Меньше, чем на 1 градус? О_о Вообще-то секундная стрелка поворачивается на 6 градусов. 1\6-я секунды? Дюже быстро хотите.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GDI+ Dimarik Общие вопросы .NET 4 03.05.2010 20:54
Аналоговые часы hamlook Microsoft Office Excel 13 09.03.2010 11:08
Аналоговые часы skalt12 Общие вопросы Delphi 12 07.07.2009 15:01
GDI EdNovice Win Api 4 12.02.2008 09:14