Шустрый

Профиль
Группа: Участник
Сообщений: 53
Регистрация: 14.11.2006
Репутация: нет Всего: нет
|
Итак изначально имеем вот это : Код | #include "windows.h" #include "math.h" #include <time.h> #include <conio.h> #define TIMER_SEC 1
static COLORREF arrowColors[3] = {RGB(0,255,0), RGB(0, 0, 255), RGB(255, 0, 0)}; static char* MONTH[12] ={" January", " February", " March", " April", " May", " June", " July", " August", " September", " October", " November", " December"}; int xCen; int yCen; POINT point; int angle[3]; BOOL flag = true;
POINT RotatePoint(POINT point, int angle) { POINT tempPoint; tempPoint.x = (point.x - xCen)*cos(2*3.14159 * angle / 360) - (point.y - yCen)*sin(2*3.14159 * angle / 360) + xCen; tempPoint.y = (point.x - xCen)*sin(2*3.14159 * angle / 360) + (point.y - yCen)*cos(2*3.14159 * angle / 360) + yCen; return tempPoint; }
void DrawArrows(HDC hdc, int angle[]);
void DrawClock(HDC hdc) { HBRUSH hBrush; LOGBRUSH lBrush; char digit[4];
SetBkMode(hdc, TRANSPARENT);
lBrush.lbStyle = BS_SOLID; lBrush.lbColor = RGB(255, 100, 55); hBrush = CreateBrushIndirect(&lBrush); SelectObject(hdc, hBrush); Ellipse(hdc, xCen-150, yCen-150, xCen+150, yCen+150); SelectObject(hdc, (HBRUSH)GetStockObject(LTGRAY_BRUSH)); Ellipse(hdc, xCen-140, yCen-140, xCen+140, yCen+140);
for(int i = 0; i < 360; i += 6) { point.x = xCen; point.y = yCen - 130; point = RotatePoint(point, i); if(i % 5 && i!=0) { lBrush.lbColor = RGB(255, 255, 100); hBrush = CreateBrushIndirect(&lBrush); SelectObject(hdc, hBrush); Ellipse(hdc, point.x-3, point.y-3, point.x+3, point.y+3); } else if(i%90 == 0) {
SetTextColor(hdc, RGB(0,0,0));//RGB(255, 200, 0)); if(i == 0) TextOut(hdc, point.x-9, point.y-8, digit, wsprintf(digit, "%d", 12)); else TextOut(hdc, point.x-6, point.y-6, digit, wsprintf(digit, "%d", i/30)); SetTextColor(hdc, RGB(0, 0, 0)); } else { lBrush.lbColor = RGB(0, 255, 200); hBrush = CreateBrushIndirect(&lBrush); SelectObject(hdc, hBrush); Ellipse(hdc, point.x-5, point.y-5, point.x+5, point.y+5); } }
DeleteObject(hBrush); }
void DrawArrows(HDC hdc, int angle[]) { HPEN hPen; HBRUSH hBrush; point.x = xCen;
for(int i = 0 ; i < 3; i++) { point.y = yCen - (90+i*20); if (i == 1) { /*hBrush=CreateSolidBrush(RGB(0,255,255)); SelectObject(hdc,hBrush); Ellipse(hdc,0,0,50,50); DeleteObject(hBrush);*/ } hPen = CreatePen(PS_SOLID, 10/pow(2.5,(double) i), arrowColors[i]); SelectObject(hdc, hPen); MoveToEx(hdc, xCen, yCen, NULL); LineTo(hdc, RotatePoint(point, angle[i]).x, RotatePoint(point, angle[i]).y);
SelectObject(hdc, (HPEN)GetStockObject(BLACK_PEN)); SelectObject(hdc, (HBRUSH)GetStockObject(GRAY_BRUSH)); Ellipse(hdc, xCen-15, yCen-15, xCen+15, yCen+15); } DeleteObject(hPen); }
LRESULT CALLBACK windowProc(HWND hWin, UINT uMessage, WPARAM wParam, LPARAM lParam) { HDC hDevCon; HBRUSH hBrush; LOGBRUSH myBrush; SYSTEMTIME sysTime; PAINTSTRUCT paintStruct; RECT rect; int i; time_t t; char Day[80]; char digit[10]; char *WeekDay[] = { "Duminica", "Luni", "Marti", "Miercuri","Joi" ,"Vineri", "Sambata" }; tm *dt; time(&t); dt = localtime(&t); GetSystemTime(&sysTime); GetClientRect(hWin, &rect); myBrush.lbStyle = BS_PATTERN ; //myBrush.lbHatch = HS_VERTICAL; myBrush.lbColor = BLACK_BRUSH;
hBrush = CreateBrushIndirect(&myBrush);
switch (uMessage) { case WM_CREATE: angle[0] = (sysTime.wHour*30) % 360; angle[1] = sysTime.wMinute*6; angle[2] = sysTime.wSecond*6; return 0;
case WM_SIZE: xCen = LOWORD(lParam)/2; yCen = HIWORD(lParam)/2; return 0;
case WM_PAINT: hDevCon = BeginPaint(hWin, &paintStruct); //--------------------BACKGROUND-------------------------------------- SelectObject(hDevCon, hBrush); Rectangle(hDevCon, rect.left, rect.top, rect.right, rect.bottom); DrawClock(hDevCon);
//--------------------DATE-------------------------------------------- myBrush.lbStyle = BS_SOLID; myBrush.lbColor = RGB(250, 250, 0); hBrush = CreateBrushIndirect(&myBrush); SelectObject(hDevCon, hBrush); Rectangle(hDevCon, xCen-45, yCen-70, xCen+45, yCen-50); //TextOut(hDevCon, xCen-50, yCen-47, MONTH[sysTime.wMonth-1], strlen(MONTH[sysTime.wMonth-1])); TextOut(hDevCon, xCen-35, yCen-68, digit, wsprintf(digit, "%02d.", sysTime.wDay)); TextOut(hDevCon, xCen-15, yCen-68, digit, wsprintf(digit, "%02d.", sysTime.wMonth)); TextOut(hDevCon, xCen+5, yCen-68, digit, wsprintf(digit, "%02d", sysTime.wYear)); i = wsprintf(Day,"%s", WeekDay[dt->tm_wday]); TextOut(hDevCon, xCen+55, yCen-7, Day, i); //TextOut(hDevCon, xCen+5, yCen-68, digit, wsprintf(Day,"%s", WeekDay[dt->tm_wday]));
//-------------------Digital clock----------------------------------- Rectangle(hDevCon, xCen-35, yCen+65, xCen+35, yCen+85); TextOut(hDevCon, xCen-30, yCen+68, digit, wsprintf(digit, "%02d:%02d:%02d", sysTime.wHour, sysTime.wMinute, sysTime.wSecond));
SelectObject(hDevCon, (HBRUSH)GetStockObject(WHITE_BRUSH)); DrawArrows(hDevCon, angle);
EndPaint(hWin, &paintStruct); return 0;
case WM_TIMER: angle[0]= (sysTime.wHour*30)%360; angle[1]= sysTime.wMinute*6; angle[2]= sysTime.wSecond*6; InvalidateRect(hWin, &rect, TRUE); return 0;
case WM_DESTROY: PostQuitMessage(0); return 0;
default: return DefWindowProc(hWin, uMessage, wParam, lParam); } DeleteObject(hBrush); return 0; }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ WNDCLASSEX windowClass; HWND hWin; char applicationName[] = "Work with the system timer"; char caption[] = "Laboratory work №6"; MSG message;
windowClass.cbClsExtra = 0; windowClass.cbSize = sizeof(windowClass); windowClass.cbWndExtra = 0; windowClass.hbrBackground = (HBRUSH)COLOR_WINDOW; windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); windowClass.hIcon = LoadIcon(NULL, IDI_INFORMATION); windowClass.hIconSm = LoadIcon(NULL, IDI_INFORMATION); windowClass.hInstance = hInstance; windowClass.lpfnWndProc = windowProc; windowClass.lpszClassName = applicationName; windowClass.lpszMenuName = 0; windowClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx(&windowClass); hWin = CreateWindow(applicationName, caption, WS_TILEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL); ShowWindow(hWin, SW_SHOWNORMAL); UpdateWindow(hWin);
SetTimer(hWin, TIMER_SEC, 1000, NULL); while(GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } KillTimer(hWin, TIMER_SEC); return message.wParam; } |
 Все работает прекрасно но надо сделать так чтобы когда секундная стрелка перескакивала на следующий кружок чтобы он загорался(красился в черный цвет),а когда она переключается на следующий то предыдущий изменяет цвет обратно какой был изначально и так далее...надеюсь понятно объяснил...Помогите пожалуйста,а то я понятия не имею как это сделать... И еще одна задачка посложнее: короче имеем вот это: Код | #include "windows.h" #include "math.h"
const int step=5; BOOL fOpenMouth = true; BOOL fRMove; BOOL fStart = false; BOOL fRotate = false; COLORREF myColor = RGB(255, 255, 255); int xCen; int yCen; struct { long buttonStyle; char* buttonCaption; } myButton[11] = { BS_GROUPBOX, "Orientation", BS_AUTORADIOBUTTON, "Left", BS_AUTORADIOBUTTON, "Center", BS_AUTORADIOBUTTON, "Right", BS_GROUPBOX, "Color", BS_AUTOCHECKBOX, "Red", BS_AUTOCHECKBOX, "Yellow", BS_AUTOCHECKBOX, "Blue", BS_GROUPBOX, "Movement", BS_DEFPUSHBUTTON, "Go Around", BS_DEFPUSHBUTTON, "Stop" };
void ClearScreen(HDC hdc, RECT rect) { SelectObject(hdc, (HBRUSH)GetStockObject(WHITE_BRUSH)); SelectObject(hdc, (HPEN)GetStockObject(WHITE_PEN)); Rectangle(hdc, 150, 10, rect.right-10, rect.bottom-10); SelectObject(hdc, (HPEN)GetStockObject(BLACK_PEN)); } POINT RotatePoint(POINT point, int angle) { POINT tempPoint; tempPoint.x = (point.x - xCen)*cos(2*3.14159 * angle / 360) - (point.y - yCen)*sin(2*3.14159 * angle / 360) + xCen; tempPoint.y = (point.x - xCen)*sin(2*3.14159 * angle / 360) + (point.y - yCen)*cos(2*3.14159 * angle / 360) + yCen; return tempPoint; } class bigHead { public: POINT centerPoint;
bigHead() { centerPoint.x = 220; centerPoint.y = 240; } //---------------------------------------------------------------------- void DrawBigHead(HDC hdc, COLORREF color) { HBRUSH hBrush; LOGBRUSH lBrush;
lBrush.lbStyle = BS_SOLID; lBrush.lbColor = color; hBrush = CreateBrushIndirect(&lBrush); SelectObject(hdc, hBrush);
if (fOpenMouth) { if (fRMove) rDrawWithOpenMouth(hdc); else lDrawWithOpenMouth(hdc); } else { if (fRMove) rDrawWithoutOpenMouth(hdc); else lDrawWithoutOpenMouth(hdc); } SelectObject(hdc, (HBRUSH)GetStockObject(WHITE_BRUSH)); } //---------------------------------------------------------------------- void rDrawWithoutOpenMouth(HDC hdc) { Ellipse(hdc, centerPoint.x-25, centerPoint.y-25, centerPoint.x+25, centerPoint.y+25); //Draw BigHead //Draw BigHead's Smile MoveToEx(hdc, centerPoint.x+25, centerPoint.y, NULL); LineTo(hdc, centerPoint.x, centerPoint.y); SelectObject(hdc, (HBRUSH)GetStockObject(BLACK_BRUSH)); Ellipse(hdc, centerPoint.x-2, centerPoint.y-20, centerPoint.x+10, centerPoint.y-10); //Draw BigHead's eye } //---------------------------------------------------------------------- void rDrawWithOpenMouth(HDC hdc) { Pie(hdc, centerPoint.x-25, centerPoint.y-25, centerPoint.x+25, centerPoint.y+25, centerPoint.x+50, centerPoint.y-25, centerPoint.x+50, centerPoint.y+25); //Draw BigHead Open Mouth SelectObject(hdc, (HBRUSH)GetStockObject(BLACK_BRUSH)); Ellipse(hdc, centerPoint.x-2, centerPoint.y-20, centerPoint.x+10, centerPoint.y-10); //Draw BigHead's eye Arc(hdc, centerPoint.x-10, centerPoint.y-10, centerPoint.x+5, centerPoint.y+5, centerPoint.x-15, centerPoint.y-25, centerPoint.x-15, centerPoint.y+25); } //---------------------------------------------------------------------- void lDrawWithoutOpenMouth(HDC hdc) { Ellipse(hdc, centerPoint.x-25, centerPoint.y-25, centerPoint.x+25, centerPoint.y+25); //Draw BigHead SelectObject(hdc, (HBRUSH)GetStockObject(BLACK_BRUSH)); Ellipse(hdc, centerPoint.x-7, centerPoint.y-20, centerPoint.x+5, centerPoint.y-10); //Draw BigHead's eye //Draw BigHead's Smile MoveToEx(hdc, centerPoint.x-25, centerPoint.y, NULL); LineTo(hdc, centerPoint.x, centerPoint.y); } //---------------------------------------------------------------------- void lDrawWithOpenMouth(HDC hdc) { Pie(hdc, centerPoint.x-25, centerPoint.y-25, centerPoint.x+25, centerPoint.y+25, centerPoint.x-40, centerPoint.y+25, centerPoint.x-40, centerPoint.y-25); //Draw BigHead Open Mouth SelectObject(hdc, (HBRUSH)GetStockObject(BLACK_BRUSH)); Ellipse(hdc, centerPoint.x-7, centerPoint.y-20, centerPoint.x+5, centerPoint.y-10); //Draw BigHead's eye Arc(hdc, centerPoint.x-2, centerPoint.y-10, centerPoint.x+13, centerPoint.y+5, centerPoint.x+15, centerPoint.y+25, centerPoint.x+15, centerPoint.y-25); } //---------------------------------------------------------------------- void DrawPhotoBigHead(HDC hdc, COLORREF color) { HBRUSH hBrush; LOGBRUSH lBrush;
lBrush.lbStyle = BS_SOLID; lBrush.lbColor = color; hBrush = CreateBrushIndirect(&lBrush); SelectObject(hdc, hBrush);
Ellipse(hdc, centerPoint.x-25, centerPoint.y-25, centerPoint.x+25, centerPoint.y+25); //Draw BigHead SelectObject(hdc, (HBRUSH)GetStockObject(BLACK_BRUSH)); Ellipse(hdc, centerPoint.x-15, centerPoint.y-20, centerPoint.x-3, centerPoint.y-10); //Draw BigHead's Left eye Ellipse(hdc, centerPoint.x, centerPoint.y-20, centerPoint.x+12, centerPoint.y-10); //Draw BigHead's Right eye //Draw BigHead's Smile Arc(hdc, centerPoint.x-15, centerPoint.y-15, centerPoint.x+15, centerPoint.y+15, centerPoint.x-25, centerPoint.y+5, centerPoint.x+25, centerPoint.y+5); SelectObject(hdc, (HBRUSH)GetStockObject(WHITE_BRUSH)); } }; int xChar; int yChar; bigHead BigHead; LRESULT CALLBACK windowProc(HWND hWin, UINT uMessage, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT paintStruct; RECT rectangle; static HWND hButton[11]; TEXTMETRIC txtMetric; int displacement = 0; GetClientRect(hWin, &rectangle); switch (uMessage) { case WM_CREATE: SetTimer(hWin, 1, 100, NULL); hdc = GetDC(hWin);
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); GetTextMetrics(hdc, &txtMetric); xChar = txtMetric.tmAveCharWidth; yChar = txtMetric.tmHeight; ReleaseDC(hWin, hdc); for(int i = 0; i < 11; i++) { if(i%4 != 0) { hButton[i] = CreateWindow("button", myButton[i].buttonCaption, WS_CHILD | WS_VISIBLE | myButton[i].buttonStyle, 2*xChar, yChar*(1+2*i)+displacement, 10*xChar, yChar*7/4, hWin, (HMENU)i, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); } else { if(i) displacement += 2*xChar; hButton[i] = CreateWindow("button", myButton[i].buttonCaption, WS_CHILD | WS_VISIBLE | myButton[i].buttonStyle, xChar, yChar*(1+2*i)+displacement, 15*xChar, yChar*35/4, hWin, (HMENU)i, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); } } return 0; case WM_SIZE: xCen = 140 + (LOWORD(lParam)-150)/2; yCen = 20 + (HIWORD(lParam)-10)/2; return 0; case WM_PAINT: hdc = BeginPaint(hWin, &paintStruct); SetBkMode(hdc, TRANSPARENT); SetBkColor(hdc, GetSysColor(COLOR_BTNFACE)); SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT)); ClearScreen(hdc, rectangle); EndPaint(hWin, &paintStruct); return 0; case WM_COMMAND: fStart = true; hdc = GetDC(hWin); switch(LOWORD(wParam)) { case 1: ClearScreen(hdc, rectangle); fRMove = true; BigHead.DrawBigHead(hdc, myColor); break; case 2: ClearScreen(hdc, rectangle); BigHead.DrawPhotoBigHead(hdc, myColor); break; case 3: ClearScreen(hdc, rectangle); fRMove = false; BigHead.DrawBigHead(hdc, myColor); break; case 5: if(SendMessage(hButton[5], BM_GETCHECK, 0, 0)) { EnableWindow(hButton[6], false); EnableWindow(hButton[7], false); myColor = RGB(255, 0, 0); } else { EnableWindow(hButton[6], true); EnableWindow(hButton[7], true); myColor = RGB(255, 255, 255); } break; case 6: if(SendMessage(hButton[6], BM_GETCHECK, 0, 0)) { EnableWindow(hButton[5], false); EnableWindow(hButton[7], false); myColor = RGB(255, 255, 0); } else { EnableWindow(hButton[5], true); EnableWindow(hButton[7], true); myColor = RGB(255, 255, 255); } break; case 7: if(SendMessage(hButton[7], BM_GETCHECK, 0, 0)) { EnableWindow(hButton[5], false); EnableWindow(hButton[6], false); myColor = RGB(0, 168, 255); } else { EnableWindow(hButton[5], true); EnableWindow(hButton[6], true); myColor = RGB(255, 255, 255); } break; case 9: fRotate = true; break; case 10: fRotate = false; break; } ReleaseDC(hWin, hdc); return 0; case WM_TIMER: if(fStart) { hdc = GetDC(hWin); if(fRotate) BigHead.centerPoint = RotatePoint(BigHead.centerPoint, 3); ClearScreen(hdc, rectangle); if(fOpenMouth) fOpenMouth = false; else fOpenMouth = true;
if(!SendMessage(hButton[2], BM_GETCHECK, 0, 0)) BigHead.DrawBigHead(hdc, myColor); else BigHead.DrawPhotoBigHead(hdc, myColor); ReleaseDC(hWin, hdc); } return 0; case WM_DESTROY: KillTimer(hWin, 1); PostQuitMessage(0); return 0; default: return DefWindowProc(hWin, uMessage, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ WNDCLASSEX windowClass; HWND hWin; char applicationName[] = "Buttons, boxes, etc."; char caption[] = "Laboratory work №7"; MSG message; windowClass.cbClsExtra = 0; windowClass.cbSize = sizeof(windowClass); windowClass.cbWndExtra = 0; windowClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); windowClass.hIcon = LoadIcon(NULL, IDI_INFORMATION); windowClass.hIconSm = LoadIcon(NULL, IDI_INFORMATION); windowClass.hInstance = hInstance; windowClass.lpfnWndProc = windowProc; windowClass.lpszClassName = applicationName; windowClass.lpszMenuName = 0; windowClass.style = CS_HREDRAW | CS_VREDRAW; RegisterClassEx(&windowClass); hWin = CreateWindow(applicationName, caption, WS_TILEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 630, 480, NULL, NULL, hInstance, NULL); ShowWindow(hWin, SW_SHOWNORMAL); UpdateWindow(hWin); while(GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; }
|
 Нужно соединить часы и то что чуть выше и в результате должно получится чтото вроде этого: возможность выбирать какие стрелки отображаются(например только часы и секунды без минут,или все 3,или вообще ни одной) то есть чтобы галочкой выбрать можно было(на месте выбора цвета во 2-ой проге)...А на месте выбора направления(где можно только одну из трех выбрать) нужно тоже сделать возможность выбора стрелок,но на этот раз только одной из трех.ПРИМЕЧАНИЕ: в любом случае,отображается или нет секундная стрелка, кружочки должны загоратся как при норм. циркуляции стрелки, то есть стрелка типа ходит как всегда но при этом на экране она не отображается... БУДУ БЛАГОДАРЕН ЗА ЛЮБУЮ ПОМОЩЬ!!!
|