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

📄 scrsnapview.cpp

📁 visual c++ 实例编程
💻 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 + -