From 9fa6ed155f4e2582f045d281f652360db8e707c9 Mon Sep 17 00:00:00 2001 From: sje Date: Wed, 1 Nov 2006 13:13:19 +0000 Subject: git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@1 4f64403b-2f21-0410-a795-97e2b3489a10 --- alarms/timewindow.cpp | 420 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 420 insertions(+) create mode 100644 alarms/timewindow.cpp (limited to 'alarms/timewindow.cpp') diff --git a/alarms/timewindow.cpp b/alarms/timewindow.cpp new file mode 100644 index 0000000..fe98dd2 --- /dev/null +++ b/alarms/timewindow.cpp @@ -0,0 +1,420 @@ +#include "timewindow.h" + +HDC hdc; +HGLRC hglrc; + +HWND pluginwind = 0; +int FrameId = 0; + +// Select the pixel format for a given device context +BOOL SetDCPixelFormat(HDC hDC) { + int nPixelFormat; + + static PIXELFORMATDESCRIPTOR pfd = { + sizeof(PIXELFORMATDESCRIPTOR), // Size of this structure + 1, // Version of this structure + + PFD_DRAW_TO_WINDOW | // Draw to window (not bitmap) + + PFD_SUPPORT_OPENGL | // Support OpenGL calls + PFD_DOUBLEBUFFER, // Double-buffered mode + PFD_TYPE_RGBA, // RGBA Color mode + 24, // Want 24bit color + 0,0,0,0,0,0, // Not used to select mode + 0,0, // Not used to select mode + 0,0,0,0,0, // Not used to select mode + 32, // Size of depth buffer + 0, // Not used to select mode + 0, // Not used to select mode + PFD_MAIN_PLANE, // Draw in main plane + 0, // Not used to select mode + 0,0,0 + }; // Not used to select mode + + // Choose a pixel format that best matches that described in pfd + if((nPixelFormat = ChoosePixelFormat(hDC, &pfd)) == 0) { + MessageBox(0, "ChoosePixelFormat failed", "Error", MB_OK); + return FALSE; + } + + // Set the pixel format for the device context + if(SetPixelFormat(hDC, nPixelFormat, &pfd) == FALSE) { + MessageBox(0, "SetPixelFormat failed", "Error", MB_OK); + return FALSE; + } + + return TRUE; +} + +int InitGL() { + // enable depth testing + glEnable(GL_DEPTH_TEST); + + glClearColor(0, 0, 0, 0); + + glEnable(GL_SCISSOR_TEST); + + // back face culling + //glEnable(GL_CULL_FACE); + + //glEnable(GL_LIGHTING); + + glShadeModel(GL_SMOOTH); + //glShadeModel(GL_FLAT); + + glEnable(GL_SCISSOR_TEST); + glClearColor(0.4151, 0.4151, 0.4151, 1); + + return 0; +} + +int SizeGL(int width, int height) { + if(width == 0 || height == 0) return 0; + + GLfloat n_range = 0.5, x_range, y_range; + + glViewport(0, 0, width, height); + glScissor(0, 0, width, height); + + // prevent divide by zero + if(width == 0) width = 1; + if(height == 0) height = 1; + + // Establish clipping volume (left, right, bottom, top, near, far) + if (width <= height) { + x_range = n_range; + y_range = n_range*height/width; + } else { + x_range = n_range*width/height; + y_range = n_range; + } + + // Reset projection matrix stack + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glFrustum(-x_range, x_range, y_range, -y_range, n_range, 50 /*n_range * 100*/); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + return 0; +} + +void drawSmallMinute() { + + GLfloat size = 0.08f; + + glBegin(GL_POLYGON); + glColor3f(1, 1, 1); + glVertex3f(-size, -0.5*size, 0); + glVertex3f(-size, 0.5*size, 0); + glVertex3f(size, 0.5*size, 0); + glVertex3f(size, -0.5*size, 0); + glEnd(); +} + +void drawLargeMinute() { + + GLfloat size = 0.08f; + + glBegin(GL_POLYGON); + glColor3f(1, 1, 1); + glVertex3f(-size, -1.25*size, 0); + glVertex3f(-size, 1.25*size, 0); + glVertex3f(size, 1.25*size, 0); + glVertex3f(size, -1.25*size, 0); + glEnd(); +} + +void drawHourHand() { + + glBegin(GL_POLYGON); + glColor3f(0.7f, 0.7f, 0.85f); + glVertex3f(0, 0, 0); + glVertex3f(-0.1f, 0.8f*1.5f, 0); + glVertex3f(0, 1.5f, 0); + glVertex3f(0.1f, 0.8f*1.5f, 0); + glEnd(); +} + +void drawMinuteHand() { + + glBegin(GL_POLYGON); + glColor3f(0.7f, 0.85f, 0.7f); + glVertex3f(0, 0, 0); + glVertex3f(-0.15f, 0.8f*2.1f, 0); + glVertex3f(0, 2.1f, 0); + glVertex3f(0.15f, 0.8f*2.1f, 0); + glEnd(); +} + +void drawSecondsHand() { + + glBegin(GL_POLYGON); + glColor3f(0.85f, 0.7f, 0.7f); + glVertex3f(-0.02f, 0, 0); + glVertex3f(-0.02f, 2.1f, 0); + glVertex3f(0.02f, 2.1f, 0); + glVertex3f(0.02f, 0, 0); + glEnd(); +} + +int RenderGL(HWND hwnd, HDC hdc) { + + SYSTEMTIME ctime; + //GLfloat rot; + //int i; + char buf[512]; + + GetLocalTime(&ctime); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + + glLoadIdentity(); + glTranslated(0, 0, -30); + + //gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); + glPushMatrix(); + +/* + for (i=0;i<60;i++) { + glPushMatrix(); + rot = (GLfloat)i/60*360; + glRotatef(-rot, 0, 0, 1.0); + glTranslatef(0, 2.2f, 0); + if (i%5!=0) drawSmallMinute(); + else drawLargeMinute(); + glPopMatrix(); + } + + glPopMatrix(); + + glPushMatrix(); + rot = (GLfloat)(ctime.wSecond)/60*360; + glRotatef(-rot, 0, 0, 1.0); + drawSecondsHand(); + glPopMatrix(); + + glPushMatrix(); + rot = (GLfloat)(ctime.wMinute)/60*360 + (GLfloat)(ctime.wSecond)/300*360/12; + glRotatef(-rot, 0, 0, 1.0); + drawMinuteHand(); + glPopMatrix(); + + glPushMatrix(); + rot = (GLfloat)(ctime.wHour%12)/12*360 + (GLfloat)(ctime.wMinute)/60*360/12; + glRotatef(-rot, 0, 0, 1.0); + drawHourHand(); + + */ + GetLocalTime(&ctime); + GetTimeFormat(LOCALE_USER_DEFAULT, 0, &ctime, 0, buf, 512); + draw_string_centered(buf); + + glPopMatrix(); + + SwapBuffers(hdc); + + return 0; +} + +LRESULT CALLBACK FrameContainerWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { + switch(msg) { + case WM_SIZE: + { + HWND child = (HWND)GetWindowLong(hwnd, GWL_USERDATA); + RECT r; + GetClientRect(hwnd, &r); + + //SetWindowPos(Frames[framepos].hWnd,HWND_TOP,0,DEFAULT_TITLEBAR_HEIGHT,width,height-DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW); + SetWindowPos(child, HWND_TOP, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_SHOWWINDOW); + } + break; + case WM_CLOSE: + return 0; + } + + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +LRESULT CALLBACK FrameWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { + PAINTSTRUCT ps; + RECT r; + //HDC hdc; + + switch(msg) { + + case WM_CREATE: + hdc = GetDC(hwnd); + + if(SetDCPixelFormat(hdc) == FALSE) { + return FALSE; + } + + hglrc = wglCreateContext(hdc); + + wglMakeCurrent(hdc, hglrc); + + GetClientRect(hwnd, &r); + + InitGL(); + SizeGL(r.right - r.left, r.bottom - r.top); + wglMakeCurrent(hdc, NULL); + + SetTimer(hwnd, 1011, 20, 0); + + return 0; + + case WM_ERASEBKGND: + //RenderGL(hwnd, hdc); + return TRUE; + + case WM_PAINT: + //ps.fErase = FALSE; + if(BeginPaint(hwnd, &ps)) { + glScissor(ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.left); + + wglMakeCurrent(hdc, hglrc); + + RenderGL(hwnd, hdc); + + wglMakeCurrent(hdc, NULL); + + EndPaint(hwnd, &ps); + } + //wglMakeCurrent(NULL, NULL); + return 0; + + case WM_MOVE: + case WM_SIZE: + if(hdc) { + wglMakeCurrent(hdc, hglrc); + + //SizeGL(LOWORD(lParam), HIWORD(lParam)); + + GetClientRect(hwnd, &r); + SizeGL(r.right - r.left, r.bottom - r.top); + + wglMakeCurrent(hdc, NULL); + //RenderGL(hwnd, hdc); + + InvalidateRect(hwnd, 0, FALSE); + } + + //return DefWindowProc(hwnd, msg, wParam, lParam); + return TRUE; + + case WM_DESTROY: + KillTimer(hwnd, 1011); + hdc = GetDC(hwnd); + wglMakeCurrent(hdc,NULL); + wglDeleteContext(hglrc); + ReleaseDC(hwnd, hdc); + + //DestroyWindow(hwnd); + //return TRUE; + break; + + case WM_TIMER: + //RenderGL(hwnd, hdc); + InvalidateRect(hwnd, 0, FALSE); + return 0; + + }; + + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +int CreateFrame(HWND parent) +{ + WNDCLASS wndclass; + wndclass.style = 0; //CS_PARENTDC | CS_HREDRAW | CS_VREDRAW; + wndclass.lpfnWndProc = FrameWindowProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = hInst; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); + wndclass.hbrBackground = 0; //(HBRUSH)(COLOR_3DFACE+1); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = "TestFrame"; + RegisterClass(&wndclass); + + //HWND pluginwind = CreateWindow("TestFrame",Translate("Test"), + // WS_BORDER | WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, + // 0,0,0,0, parent, NULL,hInst,NULL); + + if(ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) { + + pluginwind = CreateWindow("TestFrame",Translate("Test"), + (WS_CHILD | WS_CLIPCHILDREN) & ~CS_VREDRAW & ~CS_HREDRAW, + 0,0,100,100, parent, NULL,hInst,NULL); + + CLISTFrame Frame; + + memset(&Frame,0,sizeof(Frame)); + Frame.name=(char *)malloc(255); + memset(Frame.name,0,255); + + strcpy(Frame.name,"TestFrame"); + + Frame.cbSize=sizeof(CLISTFrame); + Frame.hWnd=pluginwind; + Frame.align=alBottom; + Frame.Flags=F_VISIBLE|F_SHOWTB|F_SHOWTBTIP; + Frame.height=30; + + FrameId=CallService(MS_CLIST_FRAMES_ADDFRAME,(WPARAM)&Frame,0); + + } else { + wndclass.style = 0;//CS_HREDRAW | CS_VREDRAW; + wndclass.lpfnWndProc = FrameContainerWindowProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = hInst; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); + wndclass.hbrBackground = 0; //(HBRUSH)(COLOR_3DFACE+1); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = "TestFrameContainer"; + RegisterClass(&wndclass); + + //pluginwind = CreateWindow(WS_EX_TOOLWINDOW, "TestFrame",Translate("Test"), + // WS_POPUPWINDOW | WS_THICKFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, + // 0,0,100,100, parent, NULL,hInst,NULL); + + //ShowWindow(pluginwind, SW_SHOW); + //UpdateWindow(pluginwind); + + HWND framewind = CreateWindowEx(WS_EX_TOOLWINDOW, "TestFrameContainer",Translate("Test"), + WS_POPUPWINDOW | WS_THICKFRAME | WS_VISIBLE | WS_CAPTION, + 0,0,100,100, parent, NULL,hInst,NULL); + + pluginwind = CreateWindow("TestFrame",Translate("Test"), + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE, + 0,0,100,100, framewind, NULL,hInst,NULL); + + SetWindowLong(framewind, GWL_USERDATA, (LONG)pluginwind); + + ShowWindow(framewind, SW_SHOW); + UpdateWindow(framewind); + } + + return 0; +} + +void InitFrame() +{ + CreateFrame((HWND)CallService(MS_CLUI_GETHWND, 0, 0)); +} + +void DeinitFrame() +{ + if(ServiceExists(MS_CLIST_FRAMES_REMOVEFRAME)) { + CallService(MS_CLIST_FRAMES_REMOVEFRAME, (WPARAM)FrameId, 0); + } + DestroyWindow(pluginwind); +} -- cgit v1.2.3