⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 picturescreensvr.cpp

📁 "Visual C++.net实践与提高-深入Windows编程"的源代码
💻 CPP
字号:
// PictureScreenSvr.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "PictureScreenSvr.h"
#include "scrnsave.h"

#pragma comment( lib, "scrnsave" )

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPictureScreenSvrApp

/*
BEGIN_MESSAGE_MAP(CPictureScreenSvrApp, CWinApp)
	//{{AFX_MSG_MAP(CPictureScreenSvrApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG
	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPictureScreenSvrApp construction

CPictureScreenSvrApp::CPictureScreenSvrApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CPictureScreenSvrApp object

// CPictureScreenSvrApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CPictureScreenSvrApp initialization

BOOL CPictureScreenSvrApp::InitInstance()
{
	// Standard initialization
	// If you are not using these features and wish to reduce the size
	//  of your final executable, you should remove from the following
	//  the specific initialization routines you do not need.

#ifdef _AFXDLL
	Enable3dControls();			// Call this when using MFC in a shared DLL
#else
	Enable3dControlsStatic();	// Call this when linking to MFC statically
#endif

	// Since the dialog has been closed, return FALSE so that we exit the
	//  application, rather than start the application's message pump.
	return FALSE;
}
*/
#define EVENT_REFRESH	20		// 定时器索引值
int m_cxscreen = ::GetSystemMetrics(SM_CXSCREEN);		//屏幕宽,单位:像素
int m_cyscreen = ::GetSystemMetrics(SM_CYSCREEN);		//屏幕高,单位:像素
int m_xoffset;				// 当前画面显示的横向位置
int m_yoffset = (m_cyscreen - 480) / 2;			// 当前画面显示的纵向位置,初始为中间
int m_nSteps = 2;		// 画面滚动速度


LRESULT WINAPI ScreenSaverProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_PAINT:
		{
			::AfxSetResourceHandle(hMainInstance);
			
			CWnd* pWnd = CWnd::FromHandle(hWnd);
			CRect rect;
			pWnd->GetClientRect(&rect);
			
			CPaintDC dc(pWnd);
			if (fChildPreview)
			{
				dc.SetMapMode(MM_ANISOTROPIC);
				dc.SetViewportExt(rect.Width(), rect.Height());
				dc.SetWindowExt(m_cxscreen, m_cyscreen);
			}
			
			rect.right = m_xoffset - 1;
			if (rect.right > rect.left)
				dc.FillSolidRect(rect, RGB(0, 0, 0));
			
			CBitmap bitmap;
			bitmap.LoadBitmap(IDB_BITMAP);
			CDC dcmem;
			dcmem.CreateCompatibleDC(&dc);
			CBitmap* pold = (CBitmap*)dcmem.SelectObject(&bitmap);
			dc.BitBlt(m_xoffset, m_yoffset, 640, 480, &dcmem, 0, 0, SRCCOPY);
			
			
			dcmem.SelectObject(pold);
			bitmap.DeleteObject();
			
			return TRUE;
		}
	case WM_CREATE:
		::LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN);
		::LoadString(hMainInstance, idsAppName, szAppName, APPNAMEBUFFERLEN);
		m_nSteps = ::GetPrivateProfileInt(szAppName, _T("滚动速度"), 1, szIniFile);
		::SetTimer(hWnd, EVENT_REFRESH, 50, NULL);
		m_xoffset = -640;
		m_yoffset = (m_cyscreen - 480) / 2;
		break;
		
	case WM_DESTROY:
		::KillTimer(hWnd, EVENT_REFRESH);
		break;
		
	case WM_TIMER:
		{
			m_xoffset += m_nSteps;
			if (m_xoffset > m_cxscreen)
			{
				m_xoffset = -640;
			}
			RECT rect;
			::GetClientRect(hWnd, &rect);
			::InvalidateRect(hWnd, &rect, FALSE);
		}
		break;
	}
	
	return DefScreenSaverProc(hWnd, message, wParam, lParam);
}

BOOL WINAPI RegisterDialogClasses (HANDLE hInst)
{
	return TRUE;
}

BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:
		{
			::LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN);
			::LoadString(hMainInstance, idsAppName, szAppName, APPNAMEBUFFERLEN);
			m_nSteps = ::GetPrivateProfileInt(szAppName, _T("滚动速度"), 1, szIniFile);
			
			CScrollBar* pBar = (CScrollBar*)CWnd::FromHandle(GetDlgItem(hDlg, IDC_SCROLLBAR));
			pBar->SetScrollRange(1, 10);
			pBar->SetScrollPos(m_nSteps);
		}
		return TRUE;
		
	case WM_COMMAND:
		if (wParam == IDOK)
		{
			::LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN);
			::LoadString(hMainInstance, idsAppName, szAppName, APPNAMEBUFFERLEN);
			TCHAR buf[3];
			::memset(buf, 0, sizeof(TCHAR) * 3);
			wsprintf(buf, _T("%d"), m_nSteps);
			::LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN);
			::LoadString(hMainInstance, idsAppName, szAppName, APPNAMEBUFFERLEN);
			::WritePrivateProfileString(szAppName, _T("滚动速度"), buf, szIniFile);
			::EndDialog(hDlg, IDOK);
		}
		else ::EndDialog(hDlg, IDCANCEL);
		return TRUE;
		
	case WM_HSCROLL:
		{
			CScrollBar* pBar = (CScrollBar*)CWnd::FromHandle((HWND)lParam);
			switch (LOWORD(wParam))
			{
			case SB_BOTTOM:
				m_nSteps = 10;
				break;
				
			case SB_TOP:
				m_nSteps = 1;
				break;
				
			case SB_PAGEDOWN:
				m_nSteps += 2;
				if (m_nSteps > 10)	m_nSteps = 10;
				break;
				
			case SB_PAGEUP:
				m_nSteps -= 2;
				if (m_nSteps < 1)	m_nSteps = 1;
				break;
				
			case SB_LINEDOWN:
				if (m_nSteps < 10)	m_nSteps++;
				break;
				
			case SB_LINEUP:
				if (m_nSteps > 1)	m_nSteps--;
				break;
				
			case SB_THUMBPOSITION:
				m_nSteps = HIWORD(wParam);
				break;
			}
			pBar->SetScrollPos(m_nSteps);
		}
		return TRUE;
		
	default:
		break;
	}
	
	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -