www.gusucode.com > VC++指定区域抓图、截屏小程序-源码程序 > VC++指定区域抓图、截屏小程序-源码程序/code/MainWnd.cpp

    //Download by http://www.NewXing.com
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	文件:MainWnd.cpp

	版权:Firebird Software Workroom 保留

	声明:本源程序的版权受《中华人民共和国著作权法》以及其
		  它相关法律和条约的保护。任何有机会得到本源程序的
		  个人和机构,未经作者明确授权,不得将本源程序用于
		  任何商业目的(直接的或间接的)。对于非商业目的的使
		  用 (包括复制、传播、编译和修改), 原则上没有特别
		  的限制条款,但请在相关文档中说明其来源,并尊重原
		  作者的署名权。

	编写:秦传安(chings)	2000.5

	联络:Tel:(0792)6323086	E_mail:chings@163.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "fclstd.h"
#include "resource.h"
#include "ScreenCap.h"
#include "FBCommDlg.h"
#include "CapForm.h"
#include "ResizeDlg.h"
#include "SetingDlg.h"
#include "MainWnd.h"
#include "about.h"

#define IDW_TABCTRLBAR		0xE851
#define IDW_COOLBAR			0xE852

#define ID_TRAYICON			9201//托盘图标的标识符
#define ID_HOTKEY			9202//热键的标识符
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMainWnd::CMainWnd()
{
	m_WndPlm.flags = WPF_RESTORETOMAXIMIZED;
	m_WndPlm.length = sizeof(WINDOWPLACEMENT);

	m_bIconMode = FALSE;//托盘图标的标志,TRUE:图标启动;FALSE:未启动
	m_nNewCount = 0;
	m_strDefDir[0] = '\0';
	m_strBackFile[0] = '\0';
	m_bHotkey = FALSE;
}

CMainWnd::~CMainWnd()
{
}
////////////////////////////////////////////////////////////////////////////////////////
LRESULT CMainWnd::WindowProc(UINT msg,WPARAM wParam,LPARAM lParam)
{
	LRESULT lResult = 0;

	switch(msg)
	{
	case FBNM_TRAYICON://托盘图标的消息标识符
		{
			if(wParam != ID_TRAYICON)//不是本程序定义的托盘图标,则返回。
				return 0;

			if(lParam == WM_RBUTTONUP)//右键,弹出菜单
				m_TrayIcon.PopupMenu();
			else if(lParam == WM_LBUTTONDBLCLK)//左键双击,开关主窗口
			{
				if(IsShow())
					ShowWindow(m_hWnd,SW_HIDE);
				else
					ShowWindow(m_hWnd,SW_SHOW);
			}

			lResult = 1;
		}
		break;
	case WM_SHOWWINDOW:
		ShowStateChange((BOOL)wParam);
		break;
	//用户单击最小化按钮,则启动托盘图标。
	case WM_SYSCOMMAND:
		if(wParam == SC_MINIMIZE)
		{
			ShowWindow(m_hWnd,SW_HIDE);
			if(!m_bIconMode)
			{
				m_bIconMode = TRUE;
				m_TrayIcon.SetIcon(LoadIcon(GetInstance(),
								   MAKEINTRESOURCE(IDI_MAINICON)));
				m_TrayIcon.Open();
				m_wndToolBar.CheckedButton(ID_ICONMODE,TRUE);
			}
		}
		else
			lResult = DefWindowProc(m_hWnd,msg,wParam,lParam);
		break;
	case WM_DRAWCLIPBOARD:
		{
			int fmt = CountClipboardFormats();
			if(fmt == CF_BITMAP)
			{
				m_wndToolBar.EnableButton(ID_EDITPASTE,TRUE);
				m_wndMenuBar.EnableMenuItem(ID_EDITPASTE,TRUE);
			}
			else
			{
				m_wndToolBar.EnableButton(ID_EDITPASTE,FALSE);
				m_wndMenuBar.EnableMenuItem(ID_EDITPASTE,FALSE);
			}
		}
		break;
	case WM_CLOSE:
		GetWindowPlacement(m_hWnd,&m_WndPlm);
	case WM_HOTKEY:
		if(wParam == ID_HOTKEY)
			OnCapScreen();
		break;
	default:
		lResult = CFBFrameWnd::WindowProc(msg,wParam,lParam);
		break;
	}

	return lResult;
}
////////////////////////////////////////////////////////////////////////////////////////
BOOL CMainWnd::OnCreate()
{
	//创建CoolBar,用于加载工具栏和菜单栏。
	if(!m_wndCoolBar.Create(NULL,this,CBS_BORDER_RECT|CBS_GRIPPER,26,26,IDW_COOLBAR))
		return FALSE;

	//创建并加载菜单栏。
	if(!m_wndMenuBar.Create(this,NULL,IDW_MAINMENU))
		return FALSE;
	HMENU hMenu = LoadMenu(GetInstance(), MAKEINTRESOURCE(IDM_MAINMENU));
	if(!m_wndMenuBar.LoadMenu(hMenu,FALSE))
		return FALSE;

	CB_BANDINFO cbif;
	cbif.bShow = TRUE;
	cbif.cxMinSize = 300;
	cbif.cyMinSize = 20;
	cbif.nLines = 0;
	cbif.hWnd = m_wndMenuBar.m_hWnd;
	cbif.uID = IDM_MAINMENU;
	cbif.cchText = 0;
	m_wndCoolBar.AddBand(&cbif);

	//创建并加载工具栏
	if(!m_wndToolBar.Create(this,NULL,IDW_TOOLBAR))
		return FALSE;

	if(!m_wndToolBar.LoadToolBar(IDT_TOOLBAR))
		return FALSE;

	cbif.cchText = 0;
	cbif.cxMinSize = 300;
	cbif.cxText = NULL;
	cbif.cyMinSize = 22;
	cbif.hWnd = m_wndToolBar.m_hWnd;
	cbif.nLines = 1;
	cbif.uID = IDW_TOOLBAR;
	m_wndCoolBar.AddBand(&cbif);

	m_wndCoolBar.Docking(CB_DOCK_TOP);
	
	//创建状态栏
	if(!m_wndStatusBar.Create(this,IDW_STATUSBAR))
		return FALSE;
	int pParts[4];
	pParts[0] = 180;
	pParts[1] = 240;
	pParts[2] = 300;
	pParts[3] = 420;
	m_wndStatusBar.SetParts(4,pParts);
	m_wndStatusBar.SetText(0,"就绪");

	//创建客户视图
	if(!m_wndChildView.Create(this,IDW_TABCTRLBAR,CCS_TOP|TCS_FOCUSNEVER))
		return FALSE;

	HICON hIcon = LoadIcon(GetInstance(),MAKEINTRESOURCE(IDI_MAINICON));
	m_TrayIcon.Create(this,ID_TRAYICON,hIcon,"屏幕捕快");
	m_TrayIcon.SetMenu(IDR_POPUP);

	CScreenCap* pApp = GetApp();

	if(!pApp->RegGetBinary("Config","Setings",(LPBYTE)&m_setings,sizeof(APP_SETINGS)))
	{
		m_setings.bAutoShowWnd = TRUE;
		m_setings.chKey = 'K';
		m_setings.clrGradHi = RGB(203,185,156);
		m_setings.clrGradLo = RGB(158,139,117);
		m_setings.clrViewBack = RGB(0,128,128);
		m_setings.nDefaultFmt = 0;
		m_setings.nStartMode = 0;
		m_setings.nToolBarBackMod = 1;
		m_setings.uHotkeyMod = MOD_CONTROL;
		m_setings.nGradStyle = 3;
	}

	if(!pApp->RegGetString("Config","DefaultSaveDir",m_strDefDir,MAX_PATH))
		lstrcpy(m_strDefDir,"c:\\windows\\temp\\");

	if(m_setings.nToolBarBackMod == 1)
		m_wndCoolBar.UseGradientBk(m_setings.clrGradLo,m_setings.clrGradHi,m_setings.nGradStyle);
	else if(m_setings.nToolBarBackMod == 2)
	{
		if(pApp->RegGetString("Config","ToolBarBkFile",m_strBackFile,MAX_PATH))
		{
			HBITMAP hbmp = (HBITMAP)LoadImage(NULL,m_strBackFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
			if(hbmp)
				m_wndCoolBar.SetBkBitmap(hbmp);
			else
				m_setings.nToolBarBackMod = 0;
		}
		else
			m_setings.nToolBarBackMod = 0;
	}

	m_wndChildView.m_clrBack = m_setings.clrViewBack;

	SetClipboardViewer(m_hWnd);

	InitUI();

	m_bHotkey = RegisterHotKey(m_hWnd,ID_HOTKEY,
						m_setings.uHotkeyMod,m_setings.chKey);

	return TRUE;
}
///////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::InitUI()
{
	m_wndToolBar.EnableButton(ID_FILECLOSE,FALSE);
	m_wndToolBar.EnableButton(ID_FILE_CLOSEALL,FALSE);
	m_wndToolBar.EnableButton(ID_FILESAVE,FALSE);
	m_wndToolBar.EnableButton(ID_FILE_SAVEAS,FALSE);
	m_wndToolBar.EnableButton(ID_FILEPRINT,FALSE);
	m_wndToolBar.EnableButton(ID_EDITCOPY,FALSE);
	m_wndToolBar.EnableButton(ID_EDITCUT,FALSE);
	m_wndToolBar.EnableButton(ID_SELECT,FALSE);
	m_wndToolBar.EnableButton(ID_CROP,FALSE);
	m_wndToolBar.EnableButton(ID_RESIZE,FALSE);

	m_wndMenuBar.EnableMenuItem(ID_FILECLOSE,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_FILE_CLOSEALL,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_FILESAVE,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_FILE_SAVEAS,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_FILEPRINT,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_EDITCOPY,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_EDITCUT,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_SELECT,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_CROP,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_RESIZE,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_FILEPRINTPREVIEW,FALSE);
	m_wndMenuBar.EnableMenuItem(ID_FILEPRINTSETUP,FALSE);

	m_wndToolBar.CheckedButton(ID_SELECT,FALSE);
	m_wndMenuBar.CheckMenuItem(ID_SELECT,FALSE);

	m_wndStatusBar.SetText(0,"就绪");
	m_wndStatusBar.SetText(1,"");
	m_wndStatusBar.SetText(2,"");
	m_wndStatusBar.SetText(3,"");
}
///////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::UpdateUI()
{
	CImageView* pImg = (CImageView*)m_wndChildView.GetActiveView();
	if((!pImg)? TRUE : pImg->IsEmpty())
	{
		InitUI();
		return;
	}

	m_wndToolBar.EnableButton(ID_FILECLOSE,TRUE);
	m_wndToolBar.EnableButton(ID_FILE_CLOSEALL,TRUE);
	m_wndToolBar.EnableButton(ID_FILESAVE,TRUE);
	m_wndToolBar.EnableButton(ID_FILE_SAVEAS,TRUE);
	m_wndToolBar.EnableButton(ID_FILEPRINT,TRUE);
	m_wndToolBar.EnableButton(ID_EDITCOPY,TRUE);
	m_wndToolBar.EnableButton(ID_EDITCUT,TRUE);
	m_wndToolBar.EnableButton(ID_SELECT,TRUE);
	m_wndToolBar.EnableButton(ID_RESIZE,TRUE);

	m_wndMenuBar.EnableMenuItem(ID_FILECLOSE,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_FILE_CLOSEALL,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_FILESAVE,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_FILE_SAVEAS,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_FILEPRINT,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_EDITCOPY,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_EDITCUT,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_SELECT,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_RESIZE,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_FILEPRINTPREVIEW,TRUE);
	m_wndMenuBar.EnableMenuItem(ID_FILEPRINTSETUP,TRUE);

	if(pImg->m_bCanSel && !IsRectEmpty(&pImg->m_rcSel))
	{
		m_wndToolBar.EnableButton(ID_CROP,TRUE);
		m_wndMenuBar.EnableMenuItem(ID_CROP,TRUE);
	}
	else
	{
		m_wndToolBar.EnableButton(ID_CROP,FALSE);
		m_wndMenuBar.EnableMenuItem(ID_CROP,FALSE);
	}

	m_wndToolBar.CheckedButton(ID_SELECT,pImg->m_bCanSel);
	m_wndMenuBar.CheckMenuItem(ID_SELECT,pImg->m_bCanSel);

	char str[16];
	char tmp[8];
	LPIMAGE_INFO pii = pImg->GetImageInfo();

	ltoa(pii->cx,tmp,10);
	lstrcpy(str,"宽:");
	lstrcat(str,tmp);
	m_wndStatusBar.SetText(1,str);

	ltoa(pii->cy,tmp,10);
	lstrcpy(str,"高:");
	lstrcat(str,tmp);
	m_wndStatusBar.SetText(2,str);

	ltoa(pii->nPixelFmt,tmp,10);
	lstrcpy(str,"像素格式:");
	lstrcat(str,tmp);
	lstrcat(str," 位");
	m_wndStatusBar.SetText(3,str);

	m_wndStatusBar.SetText(0,"就绪");
}
///////////////////////////////////////////////////////////////////////////////////////
//关闭图标按钮
void CMainWnd::OnClose()
{
	if(m_bIconMode)
		m_TrayIcon.Close();

	m_setings.clrViewBack = m_wndChildView.m_clrBack;
	CScreenCap* pApp = GetApp();
	pApp->RegSetBinary("Config","Setings",(LPBYTE)&m_setings,sizeof(APP_SETINGS));
	pApp->RegSetString("Config","DefaultSaveDir",m_strDefDir,MAX_PATH);
	pApp->RegSetString("Config","ToolBarBkFile",m_strBackFile,MAX_PATH);
}
///////////////////////////////////////////////////////////////////////////////////////
//计算窗口布局
void CMainWnd::ReCalcLayout()
{
	RECT rc;
	GetClientRect(m_hWnd,&rc);

	SendMessage(m_wndCoolBar.m_hWnd,FBWM_SETSIZE,0,(LPARAM)&rc);
	SendMessage(m_wndStatusBar.m_hWnd,FBWM_SETSIZE,0,(LPARAM)&rc);
	SendMessage(m_wndChildView.m_hWnd,FBWM_SETSIZE,0,(LPARAM)&rc);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//处理命令消息
void CMainWnd::OnCommand(UINT uCode,UINT uID,HWND hwndCtrl)
{
	switch(uID)
	{
	case ID_VIEWTOOLBAR://显示或隐藏工具栏
		{
			BOOL flag = m_wndMenuBar.GetMenuItemCheckState(uID);
			m_wndMenuBar.CheckMenuItem(uID,!flag);
			m_wndCoolBar.ShowBand(IDW_TOOLBAR,!flag);
		}
		break;
	case ID_VIEWSTATUSBAR://显示过或藏状态栏
		{
			BOOL flag = m_wndMenuBar.GetMenuItemCheckState(uID);
			m_wndMenuBar.CheckMenuItem(uID,!flag);
			int show = SW_SHOW;
			if(flag)
				show = SW_HIDE;
			ShowWindow(m_wndStatusBar.m_hWnd,show);
			ReCalcLayout();
		}
		break;
	case ID_ABOUT://显示关于对话框
		{
			CAboutDlg About;
			About.Create(this,IDD_ABOUTBOX);
			About.DoModal();
		}
		break;
	case ID_APP_EXIT://退出
		GetWindowPlacement(m_hWnd,&m_WndPlm);
		PostQuitMessage(0);
		OnClose();
		break;
	case ID_FILEOPEN:
		OnFileOpen();
		break;
	case ID_FILESAVE:
		OnFileSave();
		break;
	case ID_FILE_SAVEAS:
		OnSaveAs();
		break;
	case ID_FILECLOSE:
		m_wndChildView.Remove(m_wndChildView.GetCurSel());
		UpdateUI();
		break;
	case ID_FILE_CLOSEALL:
		m_wndChildView.RemoveAll();
		UpdateUI();
		break;
	case ID_FILEPRINT:
		OnFilePrint();
		break;
	case ID_CAPSCREEN:
		OnCapScreen();
		break;
	case ID_CAPOBJECT:
		OnCapObject();
		break;
	case ID_CAPSELECT:
		OnCapSelect();
		break;
	case ID_OPENMAINWND:
		{
			if(IsShow())
				ShowWindow(m_hWnd,SW_HIDE);
			else
				ShowWindow(m_hWnd,SW_SHOW);
		}
		break;
	case ID_ICONMODE:
		{
			if(m_bIconMode)
			{
				ShowWindow(m_hWnd,SW_SHOW);
				m_TrayIcon.Close();
				m_bIconMode = FALSE;
			}
			else
			{
				m_bIconMode = TRUE;
				m_TrayIcon.Open();
				ShowWindow(m_hWnd,SW_HIDE);
			}
			m_wndToolBar.CheckedButton(uID,m_bIconMode);
			m_wndMenuBar.CheckMenuItem(uID,m_bIconMode);
		}
		break;
	case ID_SELECT:
		if(m_wndToolBar.GetButtonState(ID_SELECT) & TBSTATE_CHECKED)
		{
			m_wndChildView.EnableSelect(FALSE);
			m_wndToolBar.CheckedButton(uID,FALSE);
			m_wndMenuBar.CheckMenuItem(uID,FALSE);
		}
		else
		{
			m_wndChildView.EnableSelect(TRUE);
			m_wndToolBar.CheckedButton(uID,TRUE);
			m_wndMenuBar.CheckMenuItem(uID,TRUE);
		}
		break;
	case ID_CROP:
		OnCrop();
		break;
	case ID_RESIZE:
		{
			CImageView* pImg = (CImageView*)m_wndChildView.GetActiveView();
			if(!pImg)
				break;

			CResizeDlg dlg;
			dlg.Create(this,IDD_RESIZE);
			if(dlg.DoModal() == IDOK)
			{
				pImg->LoadFromHandle(dlg.m_hBmpTemp);
				UpdateUI();
			}
			else
			{
				pImg->CalcSize();
				DeleteObject(dlg.m_hBmpTemp);
			}

			pImg->Invalidate();
		}
		break;
	case ID_EDITPASTE:
		OnPaste();
		break;
	case ID_EDITCOPY:
		OnCopy();
		break;
	case ID_EDITCUT:
		OnCut();
		break;
	case ID_SETBACKCOLOR:
		OnSetBackColor();
		break;
	case ID_SETINGS:
		OnSetings();
		break;
	default:
		break;
	}
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnCustomNotify(UINT code,UINT uID,LPARAM lParam)
{
	switch(code)
	{
	case FB_TTN_SHOWING://ToolTip显示的时候发此消息
		m_wndStatusBar.SetText(0,(LPSTR)lParam);
		break;
	case FB_TTN_HIDEN://ToolTip消失的时候发此消息
		m_wndStatusBar.SetText(0,"就绪");
		break;
	case FB_TABN_SELCHANGED:
		UpdateUI();
		break;
	case FB_IVN_SELECTED:
		m_wndToolBar.EnableButton(ID_CROP,TRUE);
		m_wndMenuBar.EnableMenuItem(ID_CROP,TRUE);
		break;
	}
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnFileOpen()
{
	CFileDlg *pDlg = new CFileDlg();
	LPTSTR szFilter = "所有支持文件\0*.bmp;*.jpg;*.jpeg;*.gif\0";
	
	pDlg->Create(this,szFilter,TRUE);
	if(pDlg->DoModal() != IDOK)return;

	LPTSTR szFile = pDlg->GetFileFullPath();

	int n = lstrlen(szFile);
	int i;
	for(i=n-1;i>0;i--)
	{
		if(szFile[i] == '.')
			break;
	}

	if(lstrcmpi(szFile+i+1,"BMP") == 0)
		m_wndChildView.AddImage(szFile);
	else
	{
		if(GetApp()->GetVersion() == 0)
			VersionTip();
		else
		{
			HBITMAP hbmp = LoadFromFile(szFile);
			m_wndChildView.AddImage(hbmp,pDlg->GetFileName());
		}
	}
	delete pDlg;
	UpdateUI();
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnFileSave()
{
	CImageView* pImg = (CImageView*)m_wndChildView.GetActiveView();
	if(!pImg)return;

	CFileDlg OpenDlg;
	LPTSTR strFilter;
	if(m_setings.nDefaultFmt == 0)
	{
		strFilter = "位图文件\0*.bmp\0";
		OpenDlg.m_OpenData.lpstrDefExt = "bmp";
	}
	else if(m_setings.nDefaultFmt == 1)
	{
		strFilter = "JPG文件\0*.jpg\0";
		OpenDlg.m_OpenData.lpstrDefExt = "jpg";
	}
	else if(m_setings.nDefaultFmt == 2)
	{
		strFilter = "GIF文件\0*.gif\0";
		OpenDlg.m_OpenData.lpstrDefExt = "gif";
	}

	OpenDlg.m_OpenData.lpstrInitialDir = m_strDefDir;
	OpenDlg.Create(this,strFilter,FALSE);
	if(OpenDlg.DoModal() != IDOK)return;

	LPTSTR szFile = OpenDlg.GetFileFullPath();
	BOOL bRet;

	if(GetApp()->GetVersion() != 0)
	{
		LPIMAGE_INFO pii = pImg->GetImageInfo();
		bRet = SaveToFile(pii->hBmp,szFile);
	}
	else
		bRet = m_wndChildView.SaveCurrentImage(szFile);

	if(bRet)
		m_wndChildView.SetCaption(m_wndChildView.GetCurSel(),OpenDlg.GetFileName());
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnSaveAs()
{
	if(GetApp()->GetVersion() == 0)
		VersionTip();
	else
	{
		CFileDlg *pDlg = new CFileDlg();
		LPTSTR szFilter = "位图文件\0*.bmp\0JPG文件\0*.jpg;*.jpeg\0GIF文件\0*.gif\0";
	
		pDlg->Create(this,szFilter,FALSE);
		if(pDlg->DoModal() != IDOK)return;

		LPTSTR szFile = pDlg->GetFileFullPath();

		CImageView* pImg = (CImageView*)m_wndChildView.GetActiveView();
		LPIMAGE_INFO pii = pImg->GetImageInfo();
		SaveToFile(pii->hBmp,szFile);
	}
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnFilePrint()
{
	CPrintDlg dlg;
	dlg.Create(this,PD_RETURNDC);
	if(dlg.DoModal() != IDOK)return;

	if(!(GetDeviceCaps(dlg.m_ptd.hDC, RASTERCAPS) & RC_BITBLT))
	{
		MessageBox(NULL,"打印机不支持位图打印","错误",MB_OK|MB_ICONWARNING);
		return;
	}

	int cx = GetDeviceCaps(dlg.m_ptd.hDC,HORZRES);
	int cy = GetDeviceCaps(dlg.m_ptd.hDC,VERTRES);
	int x,y,ratio;

	CImageView* pImg = (CImageView*)m_wndChildView.GetActiveView();
	LPIMAGE_INFO pii = pImg->GetImageInfo();

	if((pii->cx <= cx) && (pii->cy <= cy))
	{
		x = (int)(cx - pii->cx)/2;
		y = (int)(cy - pii->cy)/2;
	}
	else
	{
		if(pii->cx > pii->cy)
			ratio = (int)cx/pii->cx;
		else
			ratio = (int)cy/pii->cy;
		cx = pii->cx*ratio;
		cy = pii->cy*ratio;
	}

	char filename[_MAX_FNAME];
	m_wndChildView.GetCaption(m_wndChildView.GetCurSel(),filename,_MAX_FNAME);

	HDC hdc = CreateCompatibleDC(dlg.m_ptd.hDC);
	SelectObject(hdc,pii->hBmp);

	DOCINFO di;
	di.cbSize = sizeof(DOCINFO);
	di.fwType = 0;
	di.lpszDocName = filename;
	di.lpszOutput = NULL;
	di.lpszDatatype = NULL;

	if(StartDoc(dlg.m_ptd.hDC,&di) > 0)
		StretchBlt(dlg.m_ptd.hDC,x,y,cx,cy,hdc,0,0,pii->cx,pii->cy,SRCCOPY);
	else
		MessageBox(NULL,"执行打印作业时产生错误,可能是打印机没准备好。","错误",MB_OK|MB_ICONWARNING);
	EndDoc(dlg.m_ptd.hDC);
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnCopy()
{
	CImageView* pImg = (CImageView*)m_wndChildView.GetActiveView();
			
	if(!pImg)return;
	if(pImg->IsEmpty())return;
	if(!OpenClipboard(m_hWnd))return;

	LPIMAGE_INFO pii = pImg->GetImageInfo();
	HDC hdc = GetDC(NULL);
	HBITMAP hbmp = CImageView::CopyBitmap(hdc,pii->hBmp);

	EmptyClipboard();
	SetClipboardData(CF_BITMAP,(HANDLE)hbmp);
	CloseClipboard();

	ReleaseDC(NULL,hdc);
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnCut()
{
	OnCopy();

	CImageView* pImg = (CImageView*)m_wndChildView.GetActiveView();
	if(!pImg)return;

	pImg->SetEmpty();
	UpdateUI();
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnPaste()
{
	if(CountClipboardFormats() != CF_BITMAP)
		return;

	if(!OpenClipboard(m_hWnd))
		return;

	HBITMAP hbmp = (HBITMAP)GetClipboardData(CF_BITMAP);
	if(!hbmp)return;

	HDC hdc = GetDC(NULL);
	HBITMAP hBitmap = CImageView::CopyBitmap(hdc,hbmp);

	CImageView* pImg = (CImageView*)m_wndChildView.GetActiveView();
	if((!pImg)? FALSE : pImg->IsEmpty())
	{
		pImg->LoadFromHandle(hBitmap);
		pImg->Invalidate();
		UpdateUI();
	}
	else
	{
		char name[_MAX_FNAME];
		char tmp[8];
		ltoa(m_nNewCount+1,tmp,10);
		lstrcpy(name,"新图片");
		lstrcat(name,tmp);

		if(m_wndChildView.AddImage(hBitmap,name) != -1)
		{
			m_nNewCount++;
			UpdateUI();
		}
	}

	CloseClipboard();
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnSetBackColor()
{
	CColorDlg dlg;
	dlg.Create(this,m_wndChildView.m_clrBack);
	if(dlg.DoModal() == IDOK)
		m_wndChildView.ChangeBkColor(dlg.GetSelColor());
}
/////////////////////////////////////////////////////////////////////////////////////
//抓取指定矩形
void CMainWnd::CaptureRect(HDC hdcScreen,LPRECT prc,BOOL bFullScreen)
{
	HDC hdc = CreateCompatibleDC(hdcScreen);
	HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,prc->right - prc->left,
									 prc->bottom - prc->top);
	SelectObject(hdc,hbmp);

	BitBlt(hdc,0,0,prc->right - prc->left,prc->bottom - prc->top,
		   hdcScreen,prc->left,prc->top,SRCCOPY);

	char name[_MAX_FNAME];
	char tmp[8];
	ltoa(m_nNewCount+1,tmp,10);
	lstrcpy(name,"新图片");
	lstrcat(name,tmp);

	if(m_wndChildView.AddImage(hbmp,name) != -1)
	{
		m_nNewCount++;
		UpdateUI();
	}
	DeleteDC(hdc);

	if(!bFullScreen || m_setings.bAutoShowWnd || !m_bIconMode)
	{
		ShowWindow(m_hWnd,SW_SHOW);
		BringWindowToTop(m_hWnd);
	}
}
/////////////////////////////////////////////////////////////////////////////////////
//抓全屏
void CMainWnd::OnCapScreen()
{
	HWND hWnd = GetWindow(m_hWnd,GW_HWNDNEXT);
	ShowWindow(m_hWnd,SW_HIDE);
	BringWindowToTop(hWnd);
	EnableWindow(hWnd,TRUE);

	Sleep(100);

	HDC hDeskDC = GetDC(NULL);
	RECT rc;
	rc.left = 0;
	rc.top = 0;
	rc.right = rc.left + GetSystemMetrics(SM_CXSCREEN);
	rc.bottom = rc.top + GetSystemMetrics(SM_CYSCREEN);

	CaptureRect(hDeskDC,&rc,TRUE);
}
/////////////////////////////////////////////////////////////////////////////////////
//抓指定对象
void CMainWnd::OnCapObject()
{
	HWND hWnd = GetWindow(m_hWnd,GW_HWNDNEXT);
	ShowWindow(m_hWnd,SW_HIDE);
	BringWindowToTop(hWnd);
	EnableWindow(hWnd,TRUE);

	Sleep(100);

	CCapForm form;

	char WinPath[MAX_PATH];
	GetWindowsDirectory(WinPath, MAX_PATH);
	lstrcat(WinPath,"\\winhlp32.exe");
	HMODULE hModule = LoadLibrary(WinPath);
	if (hModule) {
		HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
		if (hHandCursor)
			form.m_hCursor = CopyCursor(hHandCursor);
	}
	FreeLibrary(hModule);

	form.Create(NULL,IDD_CAPFORM);
	form.m_nCapFlag = 1;
	form.DoModal();

	HWND hwnd = WindowFromPoint(form.m_ptEnd);
	RECT rc;
	GetWindowRect(hwnd,&rc);
	CaptureRect(form.m_hScreenDC,&rc);
	DeleteDC(form.m_hScreenDC);
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnCapSelect()
{
	HWND hWnd = GetWindow(m_hWnd,GW_HWNDNEXT);
	ShowWindow(m_hWnd,SW_HIDE);
	BringWindowToTop(hWnd);
	EnableWindow(hWnd,TRUE);

	Sleep(100);

	CCapForm form;

	form.m_hCursor = LoadCursor(NULL,IDC_CROSS);
	form.m_nCapFlag = 2;
	form.Create(this,IDD_CAPFORM);
	form.DoModal();

	if(!IsRectEmpty(&form.m_rcSel))
		CaptureRect(form.m_hScreenDC,&form.m_rcSel);
	DeleteDC(form.m_hScreenDC);
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnCrop()
{
	CImageView* pImg = (CImageView*)m_wndChildView.GetActiveView();
	if(!pImg)
		return;

	if(IsRectEmpty(&pImg->m_rcSel))
	{
		MessageBox(NULL,"尚未选择裁剪的区域","提示",MB_OK);
		return;
	}

	pImg->Crop();

	UpdateUI();
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::ShowStateChange(BOOL bShow)
{
	if(m_bIconMode)
	{
		LPTSTR pText;
		HICON hIcon;
		if(!bShow)
		{
			pText = "打开主窗口(&M)";
			hIcon = LoadIcon(GetInstance(),MAKEINTRESOURCE(IDI_MAINICON));
		}
		else
		{
			pText = "关闭主窗口(&M)";
			hIcon = LoadIcon(GetInstance(),MAKEINTRESOURCE(IDI_ICON1));
		}

		m_TrayIcon.ModifyIcon(hIcon);

		HMENU hMenu = m_TrayIcon.GetMenu();
		HMENU hSub = GetSubMenu(hMenu,0);
		ModifyMenu(hSub,ID_OPENMAINWND,MF_BYCOMMAND|MF_STRING,ID_OPENMAINWND,pText);
	}
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnSetings()
{
	CSetingDlg dlg;
	dlg.Create(this,IDD_SETINGDLG);
	if(dlg.DoModal() != IDOK)
		return;

	LPAPP_SETINGS pas = dlg.GetSetings();

	if(pas->nToolBarBackMod == 1)
	{
		if((pas->clrGradHi != m_setings.clrGradHi) ||
		   (pas->clrGradLo != m_setings.clrGradLo) ||
		   (pas->nGradStyle != m_setings.nGradStyle) ||
		   (pas->nToolBarBackMod != m_setings.nToolBarBackMod))
		{
		   m_wndCoolBar.UseGradientBk(pas->clrGradLo,
									  pas->clrGradHi,
									  pas->nGradStyle);
		   m_wndCoolBar.Invalidate();
		}
	}
	else if(pas->nToolBarBackMod == 0)
	{
		m_wndCoolBar.SetBkMode(0);
		m_wndCoolBar.Invalidate();
	}
	else if(pas->nToolBarBackMod == 2)
	{
		if((pas->nToolBarBackMod != m_setings.nToolBarBackMod) ||
			(lstrcmpi(m_strBackFile,dlg.m_strBackFile) != 0))
		{
			lstrcpy(m_strBackFile,dlg.m_strBackFile);
			if(m_strBackFile[0] != '\0')
			{
				HBITMAP hbmp = (HBITMAP)LoadImage(NULL,m_strBackFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
				if(hbmp)
					m_wndCoolBar.SetBkBitmap(hbmp);
				else
					m_wndCoolBar.SetBkMode(0);
			}
			else
				m_wndCoolBar.SetBkMode(0);

			m_wndCoolBar.Invalidate();
		}
	}

	m_wndChildView.ChangeBkColor(pas->clrViewBack);

	if((pas->uHotkeyMod != m_setings.uHotkeyMod) ||
		(pas->chKey != m_setings.chKey))
	{
		if(m_bHotkey)
			UnregisterHotKey(m_hWnd,ID_HOTKEY);
		RegisterHotKey(m_hWnd,ID_HOTKEY,pas->uHotkeyMod,pas->chKey);
	}

	memcpy(&m_setings,pas,sizeof(APP_SETINGS));
	lstrcpy(m_strDefDir,dlg.m_strDefDir);
}
/////////////////////////////////////////////////////////////////////////////////////
void CMainWnd::VersionTip()
{
	char szText[] = "亲爱的用户:"
		"\n    你得到的屏幕捕快是一个演示版,很遗憾"
		"\n它只能支持位图文件(BMP格式 )。要想使它成"
		"\n为正式版并不难,你只要向作者索要一个DLL "
		"\n(动态连接库)即可(完全免费)。"
		"\n    联系办法可参看关于对话框。";
	MessageBox(NULL,szText,"特别提示",MB_OK);
}