📄 scrsnapview.cpp
字号:
// ScrSnapView.cpp : implementation of the CScrSnapView class
//
#include "stdafx.h"
#include "ScrSnap.h"
#include "ScrSnapDoc.h"
#include "ScrSnapView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////
//类名:CScrSnapView
//功能:视图类的操作
//作者:徐景周(jingzhou_xu@163.net)
//组织:未来工作室(Future Studio)
//日期:2001.12.1
///////////////////////////////////////
bool bCreate=false; //系统区图标已显示
#define WM_TRAYNOTIFY WM_USER + 100 //自定义系统托盘消息函数
/////////////////////////////////////////////////////////////////////////////
// CScrSnapView
IMPLEMENT_DYNCREATE(CScrSnapView, CScrollView)
BEGIN_MESSAGE_MAP(CScrSnapView, CScrollView)
//{{AFX_MSG_MAP(CScrSnapView)
ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotification) //自定义系统托盘消息涵数
ON_WM_CREATE()
ON_COMMAND(ID_POPMENU_SHOWHIDE, OnPopmenuShowhide)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScrSnapView construction/destruction
CScrSnapView::CScrSnapView()
{
// TODO: add construction code here
}
CScrSnapView::~CScrSnapView()
{
}
BOOL CScrSnapView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CScrSnapView drawing
void CScrSnapView::OnDraw(CDC* pDC)
{
CScrSnapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CScrSnapView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CScrSnapView printing
BOOL CScrSnapView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CScrSnapView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CScrSnapView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CScrSnapView diagnostics
#ifdef _DEBUG
void CScrSnapView::AssertValid() const
{
CScrollView::AssertValid();
}
void CScrSnapView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CScrSnapDoc* CScrSnapView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CScrSnapDoc)));
return (CScrSnapDoc*)m_pDocument;
}
#endif //_DEBUG
int CScrSnapView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
//创建系统区图标
m_hIcon[0] = AfxGetApp()->LoadIcon(IDR_MAINFRAME); //系统区显示图标为主程序图标
if(!bCreate)//由于是多文档模式,故在创建系统图标时应先判断是否已创建过
{
if (!m_TrayIcon.Create(this,
IDR_POPMENU,
_T("轻松抓图1.0版"),
m_hIcon,
1, //一幅图标
1000, //延时1秒变化
WM_TRAYNOTIFY))
{
AfxMessageBox(_T("错误:创建系统图标失败!"), MB_OK | MB_ICONSTOP);
return -1;
}
else
bCreate=true; //置已创建过标志
}
bShow=false; //置窗体初始显示标志为假,既已显示
return 0;
}
LRESULT CScrSnapView::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
//系统区创建的图标映射涵数
return m_TrayIcon.OnTrayNotification(wParam, lParam);
}
//WINDOWS NT/98下安全关机或注销的调用涵数
void WinShutdown(UINT ShutdownFlag)
{
OSVERSIONINFO oi;
oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&oi);
//如果是NT/2000下需先设置相关权限
if (oi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE handle;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(handle, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
}
//WIN98下关机或注销时可直接调用下面涵数既可
::ExitWindowsEx(ShutdownFlag,0);
}
//在显示窗体动画效果前,先寻找系统区位置
BOOL CALLBACK FindTrayWnd(HWND hwnd, LPARAM lParam)
{
TCHAR szClassName[256];
GetClassName(hwnd, szClassName, 255);
// 比较窗口类名
if (_tcscmp(szClassName, _T("TrayNotifyWnd")) == 0)
{
CRect *pRect = (CRect*) lParam;
::GetWindowRect(hwnd, pRect);
return TRUE;
}
// 当找到时钟窗口时表示可以结束了
if (_tcscmp(szClassName, _T("TrayClockWClass")) == 0)
{
CRect *pRect = (CRect*) lParam;
CRect rectClock;
::GetWindowRect(hwnd, rectClock);
pRect->right = rectClock.left;
return FALSE;
}
return TRUE;
}
//显示窗口动画效果
void CScrSnapView::WinAnimation(bool ShowFlag)
{
CRect rect(0,0,0,0);
// 查找托盘窗口
CWnd* pWnd = FindWindow("Shell_TrayWnd", NULL);
if (pWnd)
{
pWnd->GetWindowRect(rect);
EnumChildWindows(pWnd->m_hWnd, FindTrayWnd, (LPARAM)&rect);
//rect 为托盘区矩形
CRect rcWnd;
GetWindowRect(rcWnd);
if(ShowFlag) //窗体滑向系统区
DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rcWnd,rect);
else //窗体从系统区滑出
DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rect,rcWnd);
}
}
//显示或隐藏主窗体
void CScrSnapView::OnPopmenuShowhide()
{
pFrame=AfxGetApp()->GetMainWnd();
if(bShow) //是否进行窗体动画,窗体已显示则不进行
{
WinAnimation(false); //窗体动画从系统区滑出
pFrame->ShowWindow(SW_SHOW);
}
else //是否进行窗体动画,窗体已隐藏则不进行
{
pFrame->ShowWindow(SW_HIDE);
WinAnimation(true); //窗体动画滑入到系统区中
}
bShow=!bShow; //显示隐藏标志位取反
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -