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 + -
显示快捷键?