boinc/client/win/wingui_sswindow.cpp

244 lines
6.5 KiB
C++
Executable File

// The contents of this file are subject to the BOINC Public License
// Version 1.0 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
// http://boinc.berkeley.edu/license_1.0.txt
//
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// License for the specific language governing rights and limitations
// under the License.
//
// The Original Code is the Berkeley Open Infrastructure for Network Computing.
//
// The Initial Developer of the Original Code is the SETI@home project.
// Portions created by the SETI@home project are Copyright (C) 2002
// University of California at Berkeley. All Rights Reserved.
//
// Contributor(s):
//
#include "boinc_win.h"
#include "wingui_sswindow.h"
#include "parse.h"
/////////////////////////////////////////////////////////////////////////
// CMainWindow message map and member functions
BEGIN_MESSAGE_MAP(CSSWindow, CWnd)
ON_WM_CLOSE()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_PAINT()
ON_WM_TIMER()
END_MESSAGE_MAP()
//////////
// CSSWindow::CSSWindow
// arguments: void
// returns: void
// function: sets initial rect for window and other members
CSSWindow::CSSWindow()
{
// Use a 640x480 window randomly positioned at (0-49,0-49)
int nX = rand() % 50;
int nY = rand() % 50;
// Start off in no graphics mode
ShowSSWindow(false);
m_hBOINCIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON));
}
// CMainWindow::SetMode
// arguments: nMode: the new mode
// returns: void
// function: destroys the current window and creates a new window
// in the new mode
void CSSWindow::ShowSSWindow(bool show_win)
{
RECT WindowRect = {0,0,0,0};
PAINTSTRUCT ps;
CDC* pdc;
RECT winRect;
if (!show_win) {
// If there's a window, destroy it
if (GetSafeHwnd()) DestroyWindow();
// Make sure the cursor is visible again
while(ShowCursor(true) < 0);
return;
}
CString strWndClass = AfxRegisterWndClass(0);
DWORD dwExStyle;
DWORD dwStyle;
// Get the dimensions of the screen
HDC screenDC=::GetDC(NULL);
WindowRect.left = WindowRect.top = 0;
WindowRect.right=GetDeviceCaps(screenDC, HORZRES);
WindowRect.bottom=GetDeviceCaps(screenDC, VERTRES);
::ReleaseDC(NULL, screenDC);
dwExStyle=WS_EX_TOPMOST;
dwStyle=WS_POPUP;
// Hide the cursor
while(ShowCursor(false) >= 0);
CreateEx(dwExStyle, strWndClass, "DEFAULT BOINC Graphics",
dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, WindowRect,
NULL, 0, NULL);
ShowWindow(SW_SHOW);
SetFocus();
// Fill the window with black
pdc = BeginPaint(&ps);
pdc->SetBkColor(RGB(0,0,0));
GetClientRect(&winRect);
pdc->FillSolidRect(&winRect, RGB(0,0,0));
EndPaint(&ps);
}
// CMainWindow::DefWindowProc
// arguments: message: message received
// wParam: message's wparam
// lParam: message's lparam
// returns: dependent on message
// function: handles messages as a screensaver would
LRESULT CSSWindow::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
CPoint mousePos;
switch(message) {
case WM_KEYDOWN:
case WM_KEYUP:
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
gstate.ss_logic.stop_ss();
return 0;
case WM_MOUSEMOVE:
GetCursorPos(&mousePos);
if(mousePos.x != m_MousePos.x && mousePos.y != m_MousePos.y)
gstate.ss_logic.stop_ss();
return 0;
}
return CWnd::DefWindowProc(message, wParam, lParam);
}
//////////
// CSSWindow::OnClose
// arguments: void
// returns: void
// function: hides the window
void CSSWindow::OnClose()
{
ShowSSWindow(false);
}
//////////
// CSSWindow::OnCreate
// arguments: lpcs: a pointer to the create structure
// returns: 0 if successful, otherwise -1
// function: gets mouse position for screensaver and starts timer
int CSSWindow::OnCreate(LPCREATESTRUCT lpcs)
{
if (CWnd::OnCreate(lpcs)) {
return -1;
}
GetCursorPos(&m_MousePos);
// Set up the timer for painting this window
m_uPaintTimerID = SetTimer(PAINT_TIMER, PAINT_WAIT, (TIMERPROC) NULL);
// Initial position is (0,0)
m_nPosX = m_nPosY = 0;
m_nTextPosX = -10000;
m_nTextPosY = 0;
// Initial velocity is (1-5,1-5)
m_nDX = (rand() % 5)+1;
m_nDY = (rand() % 5)+1;
SetRect(&oldWinRect, 0, 0, 0, 0);
SetRect(&oldTextRect, 0, 0, 0, 0);
return 0;
}
//////////
// CSSWindow::OnDestroy
// arguments: void
// returns: void
// function: kills timer
void CSSWindow::OnDestroy()
{
KillTimer(m_uPaintTimerID);
}
//////////
// CSSWindow::OnPaint
// arguments: null
// returns: null
// function: clears the window and draws the bouncing icon if necessary
void CSSWindow::OnPaint()
{
PAINTSTRUCT ps;
CDC* pdc;
RECT winRect, textRect;
// Fill the window with black
pdc = BeginPaint(&ps);
pdc->SetBkColor(RGB(0,0,0));
GetClientRect(&winRect);
if (gstate.ss_logic.do_blank) {
pdc->FillSolidRect(&winRect, RGB(0,0,0));
} else
// Draw the bouncing BOINC icon if we're not in blank screen mode
if (gstate.ss_logic.do_boinc_logo_ss) {
pdc->FillSolidRect(&oldTextRect, RGB(0,0,0));
pdc->SetTextColor(RGB(255,255,255));
// Draw status text
SetRect(&textRect, m_nTextPosX, m_nTextPosY, m_nTextPosX, m_nTextPosY);
pdc->DrawText(gstate.ss_logic.ss_msg, &textRect, DT_CALCRECT);
m_nTextPosX += 2;
if (m_nTextPosX + (textRect.right-textRect.left) < 0)
m_nTextPosX = textRect.left - textRect.right;
pdc->DrawText(gstate.ss_logic.ss_msg, &textRect, DT_LEFT);
if (m_nTextPosX > winRect.right) {
m_nTextPosX = -10000;
m_nTextPosY = rand() % (winRect.bottom-winRect.top);
}
CopyRect(&oldTextRect, &textRect);
// Draw the bouncing icon
m_nPosX += m_nDX;
m_nPosY += m_nDY;
if (m_nPosX <= winRect.left || (m_nPosX+32) >= winRect.right) m_nDX *= -1;
if (m_nPosY <= winRect.top || (m_nPosY+32) >= winRect.bottom) m_nDY *= -1;
if (m_nPosX < winRect.left) m_nPosX = winRect.left;
if ((m_nPosX+32) > winRect.right) m_nPosX = winRect.right-32;
if (m_nPosY < winRect.top) m_nPosY = winRect.top;
if ((m_nPosY+32) > winRect.bottom) m_nPosY = winRect.bottom-32;
pdc->FillSolidRect(&oldWinRect, RGB(0,0,0));
pdc->DrawIcon(m_nPosX, m_nPosY, m_hBOINCIcon);
SetRect(&oldWinRect, m_nPosX, m_nPosY, m_nPosX+32, m_nPosY+32);
}
EndPaint(&ps);
}
//////////
// CSSWindow::OnTimer
// arguments: uEventID: id of timer signaling event
// returns: null
// function: redraw the window if needed
void CSSWindow::OnTimer(UINT uEventID)
{
// Paint our own window
if(uEventID == m_uPaintTimerID &&
(gstate.ss_logic.do_boinc_logo_ss || gstate.ss_logic.do_blank)) {
Invalidate();
OnPaint();
}
}