📄 myscreenwnd.cpp
字号:
// MyScreenWnd.cpp : implementation file
//
#include "stdafx.h"
#include "MyScreenSaver.h"
#include "MyScreenWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
LPCSTR CMyScreenWnd::lpszClassName=NULL;
/////////////////////////////////////////////////////////////////////////////
// CMyScreenWnd
CMyScreenWnd::CMyScreenWnd()
{
//设定定时器ID
m_TimerID = 1;
//设定m_Point的初值
m_Point.x = -1;
m_Point.y =-1;
}
CMyScreenWnd::~CMyScreenWnd()
{
}
BEGIN_MESSAGE_MAP(CMyScreenWnd, CWnd)
//{{AFX_MSG_MAP(CMyScreenWnd)
ON_WM_TIMER()
ON_WM_DESTROY()
ON_WM_SYSCOMMAND()
ON_WM_KEYDOWN()
ON_WM_LBUTTONDOWN()
ON_WM_MBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_ACTIVATE()
ON_WM_ACTIVATEAPP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyScreenWnd message handlers
/**********************************************************************
函数名:Create
用途: 注册窗口类、创建窗口
参数:
返回值:
**********************************************************************/
BOOL CMyScreenWnd::Create()
{
if (lpszClassName==NULL)
{
//注册类,IDC_NOCURSOR为新建光标的ID(需要用户自己绘制)
//这个光标没有任何图案
lpszClassName=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
::LoadCursor(AfxGetResourceHandle(),MAKEINTRESOURCE(IDC_NOCURSOR)));
}
//得到显示屏的长度和宽度
CRect rect(0,0,::GetSystemMetrics(SM_CXSCREEN),
::GetSystemMetrics(SM_CYSCREEN));
//创建一个全屏窗口
CreateEx(WS_EX_TOPMOST,lpszClassName,_T(""),WS_VISIBLE | WS_POPUP,
rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,
GetSafeHwnd(),NULL,NULL);
//设置定时器,2秒换一幅图
SetTimer(m_TimerID,FRAME_TIME,NULL);
return TRUE;
}
/**********************************************************************
函数名:DrawBitmap
用途: 绘制屏保需要的BMP图象
参数: dc[in],客户区DC,nIndex[in],显示的图象编号索引
返回值:
**********************************************************************/
void CMyScreenWnd::DrawBitmap(CDC& dc,int nIndex)
{
CDC dcMem;
//创建一个兼容DC
dcMem.CreateCompatibleDC(&dc);
CBitmap m_Bitmap;
//装载Bitmap
m_Bitmap.LoadBitmap(IDB_BITMAP1+nIndex);
dcMem.SelectObject(m_Bitmap);
//位图拷贝
dc.StretchBlt(0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN),
&dcMem,0,0,FRAME_WIDTH,FRAME_HEIGHT,SRCCOPY);
}
void CMyScreenWnd::OnTimer(UINT nIDEvent)
{
CClientDC ClientDC(this);
static int nIndex=0;
nIndex %= FRAME_NUM;
DrawBitmap(ClientDC,nIndex++);
CWnd::OnTimer(nIDEvent);
}
void CMyScreenWnd::OnDestroy()
{
//清除定时器
KillTimer(m_TimerID);
}
void CMyScreenWnd::OnSysCommand(UINT nID, LPARAM lParam)
{
//关闭屏保程序
PostMessage(WM_CLOSE);
}
void CMyScreenWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//关闭屏保程序
PostMessage(WM_CLOSE);
}
void CMyScreenWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
//关闭屏保程序
PostMessage(WM_CLOSE);
}
void CMyScreenWnd::OnMButtonDown(UINT nFlags, CPoint point)
{
//关闭屏保程序
PostMessage(WM_CLOSE);
}
void CMyScreenWnd::OnRButtonDown(UINT nFlags, CPoint point)
{
//关闭屏保程序
PostMessage(WM_CLOSE);
}
void CMyScreenWnd::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_Point==CPoint(-1,-1))
{
//记录上一次鼠标所在位置
m_Point=point;
}
else if (m_Point!=point) //如果上次鼠标的位置和本次不一致则说明鼠标移动了
{ //此时应该关闭屏保程序
//关闭屏保程序
PostMessage(WM_CLOSE);
}
}
void CMyScreenWnd::OnActivate(UINT nState,CWnd* pWndOther,BOOL bMinimized)
{
CWnd::OnActivate(nState,pWndOther,bMinimized);
if (nState==WA_INACTIVE)
PostMessage(WM_CLOSE);
}
void CMyScreenWnd::OnActivateApp(BOOL bActive,HTASK hTask)
{
CWnd::OnActivateApp(bActive,hTask);
if (!bActive)
PostMessage(WM_CLOSE);
}
void CMyScreenWnd::PostNcDestroy()
{
delete this;
CWnd::PostNcDestroy();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -