📄 capturescreendlg.cpp
字号:
// CaptureScreenDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CaptureScreen.h"
#include "CaptureScreenDlg.h"
#include <ATLCONV.H>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//USES_CONVERSION;
#define MAX_LEN 260
/////////////////////////////////////////////////////////////////////////////
// CCaptureScreenDlg dialog
CCaptureScreenDlg::CCaptureScreenDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCaptureScreenDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCaptureScreenDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
i=1;
}
void CCaptureScreenDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCaptureScreenDlg)
DDX_Control(pDX, IDC_LIST1, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCaptureScreenDlg, CDialog)
//{{AFX_MSG_MAP(CCaptureScreenDlg)
ON_MESSAGE(WM_SHOWTASK,onShowTask)
ON_BN_CLICKED(IDC_BUTTON_CAPTURE, OnButtonCapture)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCaptureScreenDlg message handlers
BOOL CCaptureScreenDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// ERRCODE err;
strcpy(szCnPack,GetAppPathW());
strcat(szCnPack,"\\CNPackage.dat");
strcpy(szEnPack,GetAppPathW());
strcat(szEnPack,"\\ENPackage.dat");
strcpy(szDmPack,GetAppPathW());
strcat(szDmPack,"\\DMPackage.dat");
// err = jceInit(szCnPack,szEnPack,szDmPack);
// if (err != ERR_NONE) MessageBox(_T("TTS初始化错误!"));
SetTimer(1,30000,NULL);
NOTIFYICONDATA nid;
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
//strcpy(nid.szTip,TEXT("计划任务提醒")); //信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口
CRect rcClient;
m_List.GetClientRect(&rcClient);
int nWidth = rcClient.Width();
m_List.InsertColumn(0, _T("id"), LVCFMT_LEFT, 40, 0);
m_List.InsertColumn(1, _T("Address"), LVCFMT_LEFT, 60, 1);
m_List.InsertColumn(2, _T("CustomCode"), LVCFMT_LEFT, 60, 2);
m_List.InsertColumn(3, _T("CustomName"), LVCFMT_LEFT, 60, 2);
m_List.InsertColumn(4, _T("CustomPhone"), LVCFMT_LEFT, 60, 2);
m_List.InsertColumn(5, _T("Longitude"), LVCFMT_LEFT, 60, 2);
m_List.InsertColumn(6, _T("Latitude"), LVCFMT_LEFT, 60, 2);
return TRUE; // return TRUE unless you set the focus to a control
}
void CCaptureScreenDlg::OnButtonCapture()
{
CString szFileName;
szFileName.Format(_T("%d.bmp"),i);
CFile f;
CFileException e;
while(f.Open( szFileName,CFile::modeRead, &e ) )
{
i++;
szFileName.Format(_T("%d.bmp"),i);
}
char szIniPath[MAX_PATH] ;
memset(szIniPath,0,128);
strcpy(szIniPath,GetAppPathW());
char buffer[20];
_itoa( i, buffer, 10 );
strcpy(szIniPath,buffer);
strcat(szIniPath,".bmp");
OnScreenSave(szIniPath);
}
const char * CCaptureScreenDlg::GetAppPathW()
{
TCHAR szAppName[MAX_PATH]; // 父目录的路径, 最后不带"\"
TCHAR *pLastSlash;
char szFileName[_MAX_PATH];
memset(szFileName,0,128);
GetModuleFileName(NULL, szAppName, MAX_PATH);
pLastSlash = _tcsrchr(szAppName, _T('\\')); // 截掉文件名,只保留路径
if(pLastSlash!=NULL) *pLastSlash=_T('\0');
WideCharToMultiByte(CP_ACP, 0, szAppName, -1, szFileName, sizeof(szFileName), NULL, NULL);
return szFileName;
}
void CCaptureScreenDlg::OnScreenSave(const char *filename)
{
HDC hScrDC, hMemDC;
int width, height;
BYTE *lpBitmapBits = NULL;
//creates a device context for the screen device
hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
//get the screen point size
width = GetDeviceCaps(hScrDC, HORZRES);
height = GetDeviceCaps(hScrDC, VERTRES);
//creates a memory device context (DC) compatible with the screen device(hScrDC)
hMemDC = CreateCompatibleDC(hScrDC);
//and no compressing(biCompression=0)
BITMAPINFO RGB24BitsBITMAPINFO;
ZeroMemory(&RGB24BitsBITMAPINFO, sizeof(BITMAPINFO));
RGB24BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
RGB24BitsBITMAPINFO.bmiHeader.biWidth = width;
RGB24BitsBITMAPINFO.bmiHeader.biHeight = height;
RGB24BitsBITMAPINFO.bmiHeader.biPlanes = 1;
RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;
//use the function CreateDIBSection and SelectObject
//in order to get the bimap pointer : lpBitmapBits
HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&RGB24BitsBITMAPINFO,
DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);
HGDIOBJ previousObject = SelectObject(hMemDC, directBmp);
// copy the screen dc to the memory dc
BitBlt(hMemDC, 0, 0, width, height, hScrDC, 0, 0, SRCCOPY);
//bimap file header in order to write bmp file
BITMAPFILEHEADER bmBITMAPFILEHEADER;
ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));
bmBITMAPFILEHEADER.bfType = 0x4d42; //bmp
bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((width*height)*3); ///3=(24 / 8)
FILE *mStream = NULL;
if((mStream = fopen(filename,"wb")))
{
fwrite(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream);
fwrite(&(RGB24BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream);
fwrite(lpBitmapBits, 3*width*height, 1, mStream);
fclose(mStream);
}
DeleteObject(hMemDC);
DeleteObject(hScrDC);
DeleteObject(directBmp);
DeleteObject(previousObject);
char cVoice[64];
memset(cVoice, 0, 64);
sprintf(cVoice,"抓图成功");
// ERRCODE err = jcePlay(cVoice, NULL, NULL, (DWORD)this);
}
void CCaptureScreenDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
OnButtonCapture();
CDialog::OnTimer(nIDEvent);
}
BOOL CCaptureScreenDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
// jceStop();
KillTimer(1);
return CDialog::DestroyWindow();
}
LRESULT CCaptureScreenDlg::onShowTask(WPARAM wParam,LPARAM lParam)//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY,L"关闭");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
break;
}
case WM_LBUTTONUP://WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
NOTIFYICONDATA nid;
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
//strcpy(nid.szTip,TEXT("计划任务提醒")); //信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_DELETE,&nid); //在托盘区删除图标
ShowWindow(SW_HIDE); //隐藏主窗口
break;
}
}
return 0;
}
WCHAR * ANSI2Unicode(char *szProgID)
{
USES_CONVERSION;
return A2W(szProgID);
}
char * Unicode2ANSI(WCHAR * cName)
{
// LPTSTR lptName = NULL;
// char szANSIString [MAX_PATH];
// WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, lptName, -1,
// szANSIString, sizeof(szANSIString), NULL, NULL );
USES_CONVERSION;
return W2A(cName);
}
void CCaptureScreenDlg::OnButton1()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -