desktopconvexdlg.cpp

来自「MFC 函数实用手册 MFC 函数实用手册」· C++ 代码 · 共 207 行

CPP
207
字号
// DesktopConvexDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "DesktopConvex.h"
#include "DesktopConvexDlg.h"
#include "time.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CDesktopConvexDlg 对话框



CDesktopConvexDlg::CDesktopConvexDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDesktopConvexDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDesktopConvexDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CDesktopConvexDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_WM_TIMER()
	ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()


// CDesktopConvexDlg 消息处理程序

int x,y,oldx=-1,oldy=-1;
bool xflag = true, yflag = true;

BOOL CDesktopConvexDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO:在此添加额外的初始化代码
	CDC dc;
	dc.CreateDC((LPCTSTR)"DISPLAY",NULL,NULL,NULL);
	nScreenWidth = dc.GetDeviceCaps(HORZRES);
	nScreenHeight = dc.GetDeviceCaps(VERTRES);

	HDC HScreenDC = GetDesktopWindow()->GetDC()->GetSafeHdc();
	HDC hMemDC = CreateCompatibleDC(HScreenDC);
	HBITMAP hBmp = CreateCompatibleBitmap(HScreenDC, nScreenWidth, nScreenHeight);
	HBITMAP temp = CreateCompatibleBitmap(HScreenDC, 0, 0);

	CBitmap bmp;
	bmp.LoadBitmap(IDB_BITMAP1);
	HDC hMemDC2  = CreateCompatibleDC(HScreenDC);

	SelectObject(hMemDC, hBmp);
	SelectObject(hMemDC2, (HBITMAP)bmp);
	BitBlt(hMemDC, 0, 0, nScreenWidth, nScreenHeight, 
			HScreenDC, 1, 1, SRCCOPY);
	BitBlt(hMemDC, nScreenWidth - 200, nScreenHeight - 100, 200, 80, 
			hMemDC2, 0, 0, SRCAND);

	// 把复制图象后的hBmp置换出来
	hBmp = (HBITMAP)SelectObject(hMemDC, temp);

	// 不能直接使用hBmp,因为SelectObject、BitBlt后hBmp不被更改
	// 必须使用新的HGDIOBJ填充hMemDC,以把BitBlt后的hBmp置换出来。
	plens = new CLens(hBmp, AfxGetMainWnd()->GetDC()->GetSafeHdc());
	plens->m_nRadii=70;
	plens->Init();
	ShowWindow(SW_MAXIMIZE);
	ShowCursor(FALSE);
	//CenterWindow();
	dc.DeleteDC();

	DeleteDC(HScreenDC);
	DeleteDC(hMemDC);
	DeleteObject(hBmp);
	DeleteObject(temp);
	SetWindowPos(&wndTopMost, 0, 0, nScreenWidth, nScreenHeight, SWP_NOSIZE || SWP_NOMOVE);
	MoveWindow(0, 0, nScreenWidth, nScreenHeight, FALSE);

	SetTimer(1, 10, NULL);

	srand( (unsigned)time( NULL ) );
	rand();
	x = rand() * ( nScreenWidth - 2 * plens->m_nRadii ) / RAND_MAX + plens->m_nRadii;
	y = rand() * ( nScreenHeight - 2 * plens->m_nRadii ) / RAND_MAX + plens->m_nRadii;
	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CDesktopConvexDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
		plens->CopyBitmap();
		plens->Refraction(x, y);
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CDesktopConvexDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CDesktopConvexDlg::OnOK()
{
	// TODO: 在此添加专用代码和/或调用基类

	//CDialog::OnOK();
}

int a = 3;

void randa()
{
	srand( (unsigned)time( NULL ) );
	rand();
	a = rand() * 6 / RAND_MAX + 2;
}

void CDesktopConvexDlg::OnTimer(UINT nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(nIDEvent == 1)
		{
		if( x >= nScreenWidth - plens->m_nRadii ) 
		{
			xflag = false;
			randa();
		}
		if( x <= plens->m_nRadii )
		{
			xflag = true;
			randa();
		}

		if( y >= nScreenHeight - plens->m_nRadii )
		{
			yflag = false;
			randa();
		}
		if( y <= plens->m_nRadii )
		{
			yflag = true;
			randa();
		}

		if( xflag ) x+=a; else x-=a;
		if( yflag ) y+=a; else y-=a;

		plens->Refraction(x, y, oldx, oldy);
		oldx = x; oldy = y;
	}
	else if(nIDEvent == 2)
		SetTimer(1, 10, NULL);

	CDialog::OnTimer(nIDEvent);
}

void CDesktopConvexDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	KillTimer(2);
	POINT pt;
	GetCursorPos(&pt);
	x = pt.x; y = pt.y;
	plens->Refraction(x,y,oldx,oldy);
	oldx = x; oldy = y;
	KillTimer(1);
	SetTimer(2, 3000, NULL);
}

⌨️ 快捷键说明

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