#include #include "abstractWatchGUI.h" #include "binaryWatchGUI.h" const unsigned short int BINARY_VALUES[6] = {32, 16, 8, 4, 2, 1}; binaryWatch::binaryWatch (): watchObject () { penBorder = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); brushLED[0] = CreateSolidBrush(RGB(0, 0, 0)); brushLED[1] = CreateSolidBrush(RGB(240, 8, 30)); brushMain = CreateSolidBrush(RGB(22, 81, 169)); brushButtons = CreateSolidBrush(RGB(0, 255, 0)); } binaryWatch::~binaryWatch () { DeleteObject(penBorder); DeleteObject(brushLED[0]); DeleteObject(brushLED[1]); DeleteObject(brushMain); DeleteObject(brushButtons); } int binaryWatch::checkMouseClick (int x, int y) { //NW corner if ((x >= watchStartX && x <= (watchStartX + buttonSize)) && (y >= watchStartY && y <= (watchStartY + buttonSize))) { //Make sure it is within the triangle if (((x - watchStartX) + (y - watchStartY)) <= buttonSize) { return ACTION_BUTTON; } }//SW corner else if ((x >= watchStartX && x <= (watchStartX + buttonSize)) && (y >= faceEndY && y <= (faceEndY + buttonSize))) { if (((x - watchStartX) - (y - faceEndY)) < 0) { return MODE_BUTTON; } }//NE corner else if ((x >= faceEndX && x <= (faceEndX + buttonSize)) && (y >= watchStartY && y <= (watchStartY + buttonSize))) { if (((x - faceEndX) - (y - watchStartY)) >= 0) { return GUI_BUTTON; } } //SE corner else if ((x >= faceEndX && x <= (faceEndX + buttonSize)) && (y >= faceEndY && y <= (faceEndY + buttonSize))) { if (((x - faceEndX) + (y - faceEndY)) >= buttonSize) { return RESET_BUTTON; } } return -1; } void binaryWatch::repaintGUI (HDC hdc, int size) { ratio = size; buttonSize = (ratio * 2); faceStartX = (watchStartX + buttonSize); faceStartY = (watchStartY + buttonSize); faceEndX = (faceStartX + (11 * ratio)); faceEndY = (faceStartY + (5 * ratio)); POINT pointsFace[9] = { faceStartX, watchStartY, //top, indented from left faceEndX, watchStartY, //top, indented from right (faceEndX + buttonSize), faceStartY, //indented from top, right (faceEndX + buttonSize), faceEndY, //indented from bottom, right faceEndX, (faceEndY + buttonSize), //bottom, indented from right faceStartX, (faceEndY + buttonSize), //bottom, indented from left watchStartX, faceEndY, //indented from bottom, left watchStartX, faceStartX, //indented from top, left faceStartX, watchStartY}; //top, indented from left POINT pointsButtonAction[4] = { watchStartX, watchStartY, faceStartX, watchStartY, watchStartX, faceStartY, watchStartX, watchStartY}; POINT pointsButtonGUI[4] = { (faceEndX + buttonSize), watchStartY, faceEndX, watchStartY, (faceEndX + buttonSize), faceStartY, (faceEndX + buttonSize), watchStartY}; POINT pointsButtonMode[4] = { watchStartX, (faceEndY + buttonSize), faceStartX, (faceEndY + buttonSize), watchStartX, faceEndY, watchStartX, (faceEndY + buttonSize)}; POINT pointsButtonReset[4] = { (faceEndX + buttonSize), (faceEndY + buttonSize), faceEndX, (faceEndY + buttonSize), (faceEndX + buttonSize), faceEndY, (faceEndX + buttonSize), (faceEndY + buttonSize)}; HPEN penPrevious = (HPEN)SelectObject(hdc, penBorder); HBRUSH brushPrevious = (HBRUSH)SelectObject(hdc, brushMain); Polygon(hdc, pointsFace, 9); SelectObject(hdc, brushButtons); Polygon(hdc, pointsButtonAction, 4); Polygon(hdc, pointsButtonGUI, 4); Polygon(hdc, pointsButtonMode, 4); Polygon(hdc, pointsButtonReset, 4); SelectObject(hdc, penPrevious); SelectObject(hdc, brushPrevious); resetTime(); } void binaryWatch::repaintTime (HDC hdc, int hour, int min, int sec) { int currentTime[3][6]; int timeBuffer[3] = {hour, min, sec}; int fromLeft = 0; int fromTop = 0; for (int i = 0; i < 3; i++) { for (int k = 0; k < 6; k++) { currentTime[i][k] = (timeBuffer[i] >= BINARY_VALUES[k]); if (timeBuffer[i] >= BINARY_VALUES[k]) { timeBuffer[i] -= BINARY_VALUES[k]; } } } HPEN penPrevious = (HPEN)SelectObject(hdc, penBorder); HBRUSH brushPrevious = (HBRUSH)SelectObject(hdc, brushButtons); //Do all LED's of the same type first instead of switching brushes multiple times for (int on = 0; on < 2; on++) { SelectObject(hdc, brushLED[on]); fromTop = faceStartY; for (int row = 0; row < 3; row++) { fromLeft = faceStartX; for (int col = 0; col < 6; col++) { //Only repaint LED's which have changed if (on == currentTime[row][col] && currentTime[row][col] != previousTime[row][col]) { Ellipse(hdc, fromLeft, fromTop, (fromLeft + ratio), (fromTop + ratio)); previousTime[row][col] = currentTime[row][col]; } fromLeft += (2 * ratio); } fromTop += (2 * ratio); } } SelectObject(hdc, penPrevious); SelectObject(hdc, brushPrevious); } void binaryWatch::resetTime () { for (int i = 0; i < 3; i++) { for (int k = 0; k < 6; k++) { previousTime[i][k] = 2; } } }