- 浏览: 181051 次
文章分类
- 全部博客 (158)
- java (4)
- Android (3)
- oracle (2)
- IT人士如何节电 (5)
- json (1)
- web (1)
- acm_dfs (1)
- 组合数学 (1)
- 图论 (1)
- C (1)
- ACM搜索专题 (1)
- html+css+javascript (1)
- windows32 (1)
- MyEclipse (1)
- 产品思考 (1)
- c++ (1)
- 程序与生活 (1)
- 技术 (1)
- SQL Server (1)
- Android 移动开发 (1)
- 垃圾产品--linux (1)
- 学习与科研方法 (1)
- tomcat (1)
- ACM----动态规划 (1)
- 算法 (1)
- Python (1)
- 教程 (1)
- 数据库 (1)
- 浏览器 (1)
- 业界 (1)
- Go语言编程 (1)
- 软件开发 (1)
- linux、unix (1)
- 开发相关 (1)
- openoffice (1)
- DirectX (1)
- 统计分析与数据挖掘 (1)
- Andriod (1)
- SQL (1)
- oracle 体系结构 (1)
- ATL/WTL (1)
- KMP (1)
- 线段树 (1)
- AnGo (1)
- UVA_OJ (1)
- DP (1)
- APUE/UNP (1)
- redmine (1)
最新评论
-
美丽的小岛:
while (true) {
pool.execute(new ...
Java多线程 Web服务器简单实现 -
chemistry_ken:
Google自己都没有应用用这门语言,说明还有很长的一段路走啊 ...
[置顶] 为什么我们需要一门新语言——Go语言 -
zui4yi1:
agile,新进的公司就是采用敏捷开发的。了解AGILE,其实 ...
敏捷的坏态度 -
free0007:
...
程序与生活:程序员要保持好奇心 -
haohao-xuexi02:
witcheryne 写道昨天一不小心手贱: git co * ...
为了我的幸福
这一节是本系列文章中最重要的部分,因为CPicsiCreatorDlg类是Main子窗口的实现类,它是PicSi的功能主体。有了第2节作为基础,相信大多数朋友对CPicSiCreatorDlg的主框架是不陌生的。因此,本节将重点阐述关键思路,而代码的实现细节不在文中说明了。我会在文章的末尾将所涉及的代码贴出,若理解过程中碰到什么问题或者疑问,可随时提出。
更多详细信息请查看java教程网 http://www.itchm.com/forum-59-1.html
CPicsiCreatorDlg与CAboutDlg一样,都是CDialogImpl的派生类。因此它也通过Create方法来创建实例对象;同时,它也有自己的消息映射,能够处理窗口消息。
题外话:可能有的朋友觉得类名CPicsiDreatorDlg太长,对的,我也觉得有点长。不过,好的命名规范是需要尽量做到见名知义的,名称长点没关系,Ctrl + C/V,一点都不慢,还不易出错。
首先看CPicsiCreatorDlg的成员变量,窗口类的成员变量一般分为两类:控制成员变量和数据成员变量。建议将它们分成两团定义,而不要交叉定义,这样可使代码更清晰一些。
控制成员变量很好理解,就是窗口中控制(控件)在类中对应的变量。我们总是通过控制成员变量来对控制加以维护的。数据成员变量是算法所需的变量,如本例中,m_fileList是一个链表,它用来保存文件名列表,而m_strOutputPath即输出路径字符串。
接下来就需要定义若干方法来响应窗口消息了。Windows编程的本质就是“以消息为基础,事件驱动之(Message based and Event driven)”。也就是说,任何一个Windows程序,它的整个生命周期说白了就是在不停地捕获消息,不停地调用方法对消息进行响应。因此,窗口类有着非常明显的特点,其主体一定是消息映射和响应方法。同时,每个类又可能含有一些成员变量以及一些私有成员方法,供消息的响应方法使用或调用。当然,它也可以拥有少量的公共方法,供父窗口调用。
每个窗口类都应该响应WM_INITDIALOG消息,窗口在被初始化时,它将被抛出,用OnInitDialog方法响应它,OnInitDialog将实现窗口相关的初始化。此外,如果窗口尺寸是可调整的话,WM_SIZE消息一般也需被处理,定义OnSize方法来响应该消息。在OnSize方法的末尾,将bHandled置为FALSE,表示WM_SIZE消息并不被当前窗口类独占,它还可以被其它窗口处理。而return 1表示允许操作系统自己再对WM_SIZE做进一步的处理,比如重绘窗口背景;如果return 0的话,操作系统是不会做进一步操作的,这对于调整窗口大小来说,可能会造成程序异常。当然,大多数消息的响应方法返回值都应该是0。
AddFile方法是CPicsiCreatorDlg类唯一一个public方法,它的作用是将szFilePath所指向的文件名添加到m_fileList链表中,并且在Listview控制中显示该文件的名称、尺寸、创建时间等信息。AddFile方法在程序中仅仅被主窗口调用,参见MainDlg::OnDropFIles方法。
接下来就是依次响应控制消息:
- IDC_BTN_SETPATH - 用户单击Set按钮,设置输出路径;
- IDC_BTN_OPEN - 用户单击Open按钮,打开输出目录;
- IDC_BTN_CLEAR - 用户单击Clear按钮,清空文件列表;
- IDC_BTN_OK - 用户单击Open按钮,开始生成内涵图;
- IDC_LIST_ORDINARY通知消息NM_DBLCLK - 用户在Listview控制中双击鼠标左键,打开选中的文件;
- IDC_LIST_ORDINARY通知消息NM_RCLICK - 用户在Listview控制右击鼠标,弹出右键菜单;
- ID_POP1_OPEN - 用户选中右键菜单项Open,打开选中的文件;
- ID_POP1_DELETE - 用户选中右键菜单项Delete,删除选中的文件;
- ID_POP1_UP - 用户选中右键菜单项Up,将选中的文件往上移一位;
- ID_POP1_DOWN - 用户选中右键菜单项Down,将选中的文件往下移一位;
- ID_POP1_TOP - 用户选中右键菜单项Top,将选中的文件置顶;
- ID_POP1_BOTTOM - 用户选中右键菜单项Bottom,将选中的文件置底。
简要说明一下CPicsiCreatorDlg类中的私有方法:
- get_appdata_path - 获得PicSi配置文件在AppData目录的全路径,配置文件里保存着输出路径(output path)。
- read_output_path - 从PicSi配置文件中读取输出路径并保存到m_strOutputPath成员变量中。
- write_output_path - 将输出路径字符串m_strOutputPath写入PicSi配置文件中。
- IsValid - 当用户单击OK按钮后,程序将首先检查文件列表是否符合规则“至少两个文件,首个文件必须是jpg文件”,只有再确认之后再正式生成内涵图。IsVaild起到检查文件列表是否符合规则的作用。
- get_rar_exe_path - 获得rar.exe文件的全路径,rar.exe用于压缩文件。
- get_copy_bat_path - 获得copy.bat文件的全路径,copy.bat包含copy命令,拼接jpg和rar文件,制作内涵图。
- get_temporary_rar_path - 获得临时rar文件的路径。
- delete_temporary_rar - 删除临时rar文件。
- build_rar_command_line - 装配rar.exe命令。
- build_copy_command_line - 装配copy命令。
- execute_subprocess - 执行子进程,传入参数即命令行字符串。
- shell_open_selected_file - 打开被选中的文件。
- refresh_list_view - 刷新Listview。
CPicSiCreatorDlg窗口类的所有代码如下所示:
// CPicsiCreatorDlg class CPicsiCreatorDlg : public CDialogImpl<CPicsiCreatorDlg> { private: CButton m_btnOK; CButton m_btnClear; CStatic m_static; CEdit m_editPath; CButton m_btnSet; CButton m_btnOpen; CListViewCtrl m_list; ATL::CAtlList<WTL::CString> m_fileList; WTL::CString m_strOutputPath; public: enum { IDD = IDD_DLG_CREATOR }; void AddFile(LPCTSTR szFilePath) throw() { ATLASSERT(szFilePath != NULL); POSITION pos = m_fileList.GetHeadPosition(); // check if alreay added while(pos != NULL) { WTL::CString strFilePath = m_fileList.GetAt(pos); if(::lstrcmpi(szFilePath, strFilePath) == 0) { WTL::CString strMsg = _T("You have already added file \""); strMsg += szFilePath; strMsg += _T("\"!"); PS_MessageBox(strMsg, MB_ICONWARNING); return; } // end if m_fileList.GetNext(pos); } // end while int nCount = m_list.GetItemCount(); WTL::CString strFilename; PS_GetFilename(szFilePath, strFilename); m_list.AddItem(nCount, 0, strFilename); // add size OFSTRUCT os; HANDLE hFile = (HANDLE)::OpenFile(::CT2A(szFilePath), &os, OF_READ); BY_HANDLE_FILE_INFORMATION fileinfo; ::GetFileInformationByHandle(hFile, &fileinfo); TCHAR szSize[20]; _stprintf_s(szSize, _T("%d KB"), fileinfo.nFileSizeLow / 1024); m_list.AddItem(nCount, 1, szSize); // add creation time SYSTEMTIME st; FileTimeToSystemTime(&fileinfo.ftCreationTime, &st); TCHAR szCreationTime[24]; _stprintf_s(szCreationTime, _T("%d/%02d/%02d %02d:%02d"), st.wYear, st.wMonth, st.wDay, (st.wHour + 8)%24, st.wMinute); m_list.AddItem(nCount, 2, szCreationTime); // add file m_fileList.AddTail(szFilePath); } //message handler BEGIN_MSG_MAP(CPicsiCreatorDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_SIZE, OnSize) COMMAND_ID_HANDLER(IDOK, OnOK) COMMAND_ID_HANDLER(IDCANCEL, OnCancel) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) COMMAND_ID_HANDLER(IDC_BTN_SETPATH, OnButtonSetpath) COMMAND_ID_HANDLER(IDC_BTN_OPEN, OnButtonOpen) COMMAND_ID_HANDLER(IDC_BTN_CLEAR, OnButtonClear) COMMAND_ID_HANDLER(IDC_BTN_OK, OnButtonOK) NOTIFY_HANDLER(IDC_LIST_ORDINARY, NM_DBLCLK, OnListDoubleClick) NOTIFY_HANDLER(IDC_LIST_ORDINARY, NM_RCLICK, OnListRightClick) COMMAND_ID_HANDLER(ID_POP1_OPEN, OnMenuOpen) COMMAND_ID_HANDLER(ID_POP1_DELETE, OnMenuDelete) COMMAND_ID_HANDLER(ID_POP1_UP, OnMenuUp) COMMAND_ID_HANDLER(ID_POP1_DOWN, OnMenuDown) COMMAND_ID_HANDLER(ID_POP1_TOP, OnMenuTop) COMMAND_ID_HANDLER(ID_POP1_BOTTOM, OnMenuBottom) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { m_btnOK.Attach(GetDlgItem(IDC_BTN_OK)); m_btnClear.Attach(GetDlgItem(IDC_BTN_CLEAR)); m_static.Attach(GetDlgItem(IDC_STATIC)); m_editPath.Attach(GetDlgItem(IDC_EDIT_PATH)); m_btnSet.Attach(GetDlgItem(IDC_BTN_SETPATH)); m_btnOpen.Attach(GetDlgItem(IDC_BTN_OPEN)); m_list.Attach(GetDlgItem(IDC_LIST_ORDINARY)); // add colums LVCOLUMN lvc = { 0 }; lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_CENTER; lvc.pszText = _T("File Name"); lvc.cx = 300; m_list.InsertColumn(0, &lvc); lvc.pszText = _T("File Size"); lvc.cx = 80; m_list.InsertColumn(1, &lvc); lvc.pszText = _T("Creation Time"); lvc.cx = 145; m_list.InsertColumn(2, &lvc); if( !read_output_path() || m_strOutputPath.GetLength() <= 0) m_strOutputPath.Empty(); m_editPath.SetWindowText(m_strOutputPath); return TRUE; } // OnSize LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if( wParam != SIZE_MINIMIZED ) { int nWidth = LOWORD(lParam); int nHeight = HIWORD(lParam); // change layout m_static.SetWindowPos(NULL, 4, 8, 88, 16, SWP_NOACTIVATE | SWP_NOZORDER); m_editPath.SetWindowPos(NULL, 92, 4, 228, 24, SWP_NOACTIVATE | SWP_NOZORDER); m_btnSet.SetWindowPos(NULL, 320, 4, 22, 24, SWP_NOACTIVATE | SWP_NOZORDER); m_btnOpen.SetWindowPos(NULL, 344, 4, 48, 24, SWP_NOACTIVATE | SWP_NOZORDER); m_btnOK.SetWindowPos(NULL, 420, 4, 48, 24, SWP_NOACTIVATE | SWP_NOZORDER); m_btnClear.SetWindowPos(NULL, 470, 4, 48, 24, SWP_NOACTIVATE | SWP_NOZORDER); m_list.SetWindowPos(NULL, 0, 32, nWidth, nHeight - 32, SWP_NOACTIVATE | SWP_NOZORDER); } bHandled = FALSE; return 1; } LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { //EndDialog(wID); return 0; } LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { //EndDialog(wID); return 0; } LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { bHandled = FALSE; return 1; } LRESULT OnButtonSetpath(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { CFolderDialog dlg(NULL,_T("Set Output Directory"), BIF_NEWDIALOGSTYLE | BIF_EDITBOX | BIF_RETURNONLYFSDIRS); if(m_strOutputPath != _T("")) dlg.SetInitialFolder(m_strOutputPath, TRUE); if( dlg.DoModal() == IDOK ) { m_strOutputPath = dlg.GetFolderPath(); m_editPath.SetWindowText(m_strOutputPath); if( !write_output_path() ) PS_MessageBox(_T("Save output path failed!"), MB_ICONWARNING); } return 0; } LRESULT OnButtonOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { ::ShellExecute(NULL, _T("open"), NULL, NULL, m_strOutputPath, SW_NORMAL); return 0; } LRESULT OnButtonClear(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { m_list.DeleteAllItems(); m_fileList.RemoveAll(); return 1; } LRESULT OnButtonOK(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { if(m_strOutputPath.IsEmpty()) { PS_MessageBox(_T("Output cannot be empty, set output path first!"), MB_ICONWARNING); return 0; } if(!IsValid() ){ PS_MessageBox(_T("At least two files and the first one must be a *.jpg file!"), MB_ICONERROR); return 0; } if( !delete_temporary_rar() ) { PS_MessageBox(_T("Clear temporary rar file failed!"), MB_ICONERROR); return 0; } WTL::CString strCommandLine; if(!build_rar_command_line(strCommandLine)) { PS_MessageBox(_T("Create connotative jpg failed!"), MB_ICONERROR); return 0; } if(!execute_subprocess(strCommandLine.GetBuffer(128))) { PS_MessageBox(_T("Create connotative jpg failed!"), MB_ICONERROR); return 0; } if(!build_copy_command_line(strCommandLine)) { PS_MessageBox(_T("Create connotative jpg failed!"), MB_ICONERROR); delete_temporary_rar(); return 0; } if(!execute_subprocess(strCommandLine.GetBuffer(128))) { delete_temporary_rar(); return 0; } delete_temporary_rar(); PS_MessageBox(_T("Create connotative jpg succeed!"), MB_ICONINFORMATION); return 0; } LRESULT OnListDoubleClick(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) { shell_open_selected_file(); return 0; } LRESULT OnListRightClick(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) { int nSelect = m_list.GetSelectedIndex(); if(nSelect < 0) return 0; CMenu menu; menu.LoadMenu(IDR_MENU_POP); CMenuHandle oMenu = menu.GetSubMenu(0); if(nSelect == 0) { oMenu.EnableMenuItem(ID_POP1_UP, MF_BYCOMMAND | MF_GRAYED); oMenu.EnableMenuItem(ID_POP1_TOP, MF_BYCOMMAND | MF_GRAYED); } if(nSelect == m_list.GetItemCount() - 1) { oMenu.EnableMenuItem(ID_POP1_DOWN, MF_BYCOMMAND | MF_GRAYED); oMenu.EnableMenuItem(ID_POP1_BOTTOM, MF_BYCOMMAND | MF_GRAYED); } POINT pt; ::GetCursorPos(&pt); oMenu.TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, m_hWnd); return 0; } LRESULT OnMenuOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { shell_open_selected_file(); return 0; } LRESULT OnMenuDelete(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { int nSelect = m_list.GetSelectedIndex(); if(nSelect < 0) return 0; POSITION pos = m_fileList.GetHeadPosition(); for(int i = 0; i < nSelect; i++) m_fileList.GetNext(pos); m_fileList.RemoveAt(pos); refresh_list_view(); return 0; } LRESULT OnMenuUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { int nSelect = m_list.GetSelectedIndex(); if(nSelect < 0) return 0; POSITION pos = m_fileList.GetHeadPosition(); for(int i = 0; i < nSelect; i++) m_fileList.GetNext(pos); POSITION posPrev = pos; m_fileList.GetPrev(posPrev); m_fileList.SwapElements(pos, posPrev); refresh_list_view(); return 0; } LRESULT OnMenuDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { int nSelect = m_list.GetSelectedIndex(); if(nSelect < 0) return 0; POSITION pos = m_fileList.GetHeadPosition(); for(int i = 0; i < nSelect; i++) m_fileList.GetNext(pos); POSITION posLatter = pos; m_fileList.GetNext(posLatter); m_fileList.SwapElements(pos, posLatter); refresh_list_view(); return 0; } LRESULT OnMenuTop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { int nSelect = m_list.GetSelectedIndex(); if(nSelect < 0) return 0; POSITION pos = m_fileList.GetHeadPosition(); for(int i = 0; i < nSelect; i++) m_fileList.GetNext(pos); m_fileList.MoveToHead(pos); refresh_list_view(); return 0; } LRESULT OnMenuBottom(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { int nSelect = m_list.GetSelectedIndex(); if(nSelect < 0) return 0; POSITION pos = m_fileList.GetHeadPosition(); for(int i = 0; i < nSelect; i++) m_fileList.GetNext(pos); m_fileList.MoveToTail(pos); refresh_list_view(); return 0; } private: // get appdata path BOOL get_appdata_path(WTL::CString& strPath) throw() { if(!PS_GetAppDataDirectory(strPath)) return FALSE; PS_PathAppendBackslash(strPath); strPath += _T("PicSi"); if( !PS_IsDirectory(strPath) ) { if( ::CreateDirectory(strPath, NULL) == 0 ) return FALSE; } strPath += _T("\\cfg"); return TRUE; } // read output path BOOL read_output_path() throw() { CString strAppdataPath; if(!get_appdata_path(strAppdataPath)) return FALSE; ATL::CComPtr<IStream> spStream; HRESULT hr = ::SHCreateStreamOnFile(strAppdataPath, STGM_READ | STGM_SHARE_DENY_WRITE, &spStream); if(FAILED(hr)) return FALSE; ULONG nCount; hr = spStream->Read(m_strOutputPath.GetBufferSetLength(MAX_PATH), MAX_PATH, &nCount); m_strOutputPath.ReleaseBuffer(); if(FAILED(hr)) return FALSE; return TRUE; } // write output path BOOL write_output_path() throw() { CString strAppdataPath; if(!get_appdata_path(strAppdataPath)) return FALSE; ATL::CComPtr<IStream> spStream; HRESULT hr = ::SHCreateStreamOnFile(strAppdataPath, STGM_WRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE, &spStream); if(FAILED(hr)) return FALSE; ULONG nCount; hr = spStream->Write(m_strOutputPath, MAX_PATH, &nCount); if(FAILED(hr)) return FALSE; return TRUE; } // check valid BOOL IsValid() throw() { int nCount = m_list.GetItemCount(); if(nCount < 2) return FALSE; TCHAR szText[MAX_PATH]; int nTotal = m_list.GetItemText(0, 0, szText, MAX_PATH); WTL::CString strPath = szText; strPath.MakeLower(); int nPos = strPath.Find(_T(".jpg")); if(nPos < 0 || nPos < nTotal - 4) return FALSE; return TRUE; } // get rar exe path BOOL get_rar_exe_path(WTL::CString& strRarExePath) throw() { if(!PS_GetInstallationDirectory(strRarExePath)) return FALSE; else { if(!PS_PathAppendBackslash(strRarExePath)) return FALSE; strRarExePath += _T("Rar.exe"); } return TRUE; } // get copy bat path BOOL get_copy_bat_path(WTL::CString& strCopyBatPath) throw() { if(!PS_GetInstallationDirectory(strCopyBatPath)) return FALSE; else { if(!PS_PathAppendBackslash(strCopyBatPath)) return FALSE; strCopyBatPath += _T("copy.bat"); } return TRUE; } // get temporary rar path BOOL get_temporary_rar_path(WTL::CString& strPath) throw() { strPath = m_strOutputPath; if(!PS_PathAppendBackslash(strPath)) return FALSE; strPath += _T("picsi_temporary.rar"); return TRUE; } // delete temporary rar BOOL delete_temporary_rar() throw() { WTL::CString strRarPath; get_temporary_rar_path(strRarPath); if( ::DeleteFile(strRarPath) == 0 && ::GetLastError() != ERROR_FILE_NOT_FOUND) return FALSE; return TRUE; } // build command line BOOL build_rar_command_line(WTL::CString& strCmd) throw() { if( !get_rar_exe_path(strCmd) ) return FALSE; PS_AddDoubleQuotationMarks(strCmd); strCmd += _T(" a -ep1 "); WTL::CString strRarPath; if( !get_temporary_rar_path(strRarPath) ) return FALSE; PS_AddDoubleQuotationMarks(strRarPath); strCmd += strRarPath; // append source file name WTL::CString strTmp; POSITION pos = m_fileList.GetHeadPosition(); m_fileList.GetNext(pos); while(pos != NULL) { strTmp = m_fileList.GetAt(pos); PS_AddDoubleQuotationMarks(strTmp); strCmd += _T(" "); strCmd += strTmp; m_fileList.GetNext(pos); } return TRUE; } // build copy command line BOOL build_copy_command_line(WTL::CString& strCmd) throw() { if( !get_copy_bat_path(strCmd) ) return FALSE; PS_AddDoubleQuotationMarks(strCmd); strCmd += _T(" "); // append jpg file WTL::CString strJpgPath = m_fileList.GetHead(); PS_AddDoubleQuotationMarks(strJpgPath); strCmd += strJpgPath; strCmd += _T(" "); // append rar file WTL::CString strRarPath; if( !get_temporary_rar_path(strRarPath) ) return FALSE; PS_AddDoubleQuotationMarks(strRarPath); strCmd += strRarPath; strCmd += _T(" "); // append result file WTL::CString strResultFile; TCHAR szFilename[MAX_PATH]; m_list.GetItemText(0, 0, szFilename, MAX_PATH); PS_GetFilename(szFilename, strResultFile); PS_PathAppendBackslash(m_strOutputPath); strResultFile = m_strOutputPath + strResultFile; PS_AddDoubleQuotationMarks(strResultFile); strCmd += strResultFile; return TRUE; } // execute subprocess BOOL execute_subprocess(LPTSTR szCommandLine) throw() { ATLASSERT(szCommandLine != NULL); STARTUPINFO si = { 0 }; si.cb = sizeof(si); PROCESS_INFORMATION pi = { 0 }; if( !CreateProcess( NULL, szCommandLine, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi ) ) { DWORD dwCode = ::GetLastError(); return FALSE; } WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); return TRUE; } // shell open selected file void shell_open_selected_file() throw() { int nSelect = m_list.GetSelectedIndex(); if(nSelect < 0) return; POSITION pos = m_fileList.GetHeadPosition(); for(int i = 0; i < nSelect; ++i) m_fileList.GetNext(pos); ::ShellExecute(NULL, _T("open"), m_fileList.GetAt(pos), NULL, NULL, SW_NORMAL); } // refresh list view void refresh_list_view() throw() { m_list.DeleteAllItems(); POSITION pos = m_fileList.GetHeadPosition(); WTL::CString strFilePath; int i = 0; while(pos != NULL) { strFilePath = m_fileList.GetAt(pos); WTL::CString strFilename; PS_GetFilename(strFilePath, strFilename); m_list.AddItem(i, 0, strFilename); // add size OFSTRUCT os; HANDLE hFile = (HANDLE)::OpenFile(::CT2A(strFilePath), &os, OF_READ); BY_HANDLE_FILE_INFORMATION fileinfo; ::GetFileInformationByHandle(hFile, &fileinfo); TCHAR szSize[20]; _stprintf_s(szSize, _T("%d KB"), fileinfo.nFileSizeLow / 1024); m_list.AddItem(i, 1, szSize); // add creation time SYSTEMTIME st; FileTimeToSystemTime(&fileinfo.ftCreationTime, &st); TCHAR szCreationTime[24]; _stprintf_s(szCreationTime, _T("%d/%02d/%02d %02d:%02d"), st.wYear, st.wMonth, st.wDay, (st.wHour + 8) % 24, st.wMinute); m_list.AddItem(i, 2, szCreationTime); i++; m_fileList.GetNext(pos); } } };
相关推荐
《PicSi安装程序:轻松创建内涵图的利器》 内涵图,作为一种独特的网络表达方式,以其独特的幽默感和丰富的信息量深受网友喜爱。而PicSi安装程序正是一款专为制作内涵图而设计的免费工具,它让普通用户也能轻松地将...
近年来,随着科技的快速发展,辅助生殖技术已经从最初的第一代试管婴儿技术(IVF-ET),发展到现在的第四代,其中包括了单精子注射技术(ICSI)、胚胎移植技术、卵子胞浆内单精子注射技术(PICSI)等。其中,第四代...
基于S7-300PLC与MCGS6.2的饮料罐装生产线自动化控制系统设计,包含仿真、程序、IO表与电气原理,实现自动操作、灌装报警及瓶数记录功能。,基于PLC的饮料罐装生产线控制系统设计。 S7-300PLC MCGS6.2仿真 仿真,程序,IO表,电气原理图,6500字说明。 实现功能有: (1)系统通过开关设定为自动操作模式,一旦启动,则传送带的驱动电机启动并一直保持到停止开关动作或罐装设备下的传感器检测到一个瓶子时停止;瓶子装满饮料后,传送带驱动电机必须自动启动,并保持到又检测到一个瓶子或停止开关动作。 (2)当瓶子定位在灌装设备下时,停顿1秒,罐装设备开始工作,灌装过程为5秒钟,罐装过程应有报警显示,5秒后停止并不再显示报警。 (2)用两个传感器和若干个加法器检测并记录空瓶数和满瓶数,一旦系统启动,必须记录空瓶和满瓶数,设最多不超过99999999瓶。 (4)可以手动对计数器清零(复位)。 ,关键词:S7-300PLC; MCGS6.2仿真; 传送带驱动电机; 传感器检测; 瓶装; 空瓶数; 满瓶数; 报警显示; 自动操作模式; 灌装设备。,基于S7-300PLC的饮料罐装
python加密货币时间序列预测源码+数据集-最新出炉 加密货币分析: 对各种加密货币的数据进行分析和研究。可能会使用到从各种来源收集的数据,包括但不限于加密货币的价格、市值、交易量、交易时间等信息。 探索加密货币市场的趋势和模式,例如价格的波动情况、不同加密货币之间的相关性等。 数据处理与操作: 可能使用 Python 语言(Kaggle 上常用的数据分析语言),并运用一些数据处理和分析的库,如 pandas 用于数据的读取、清洗、整理和转换操作,将原始的加密货币数据转换为更易于分析的格式。 可视化展示: 通过可视化工具,如 matplotlib 或 seaborn 库,将加密货币的信息以图表的形式展示出来,以帮助直观地理解数据中的关系和趋势。 统计分析或预测: 可能会进行一些基本的统计分析,如计算加密货币价格的均值、中位数、标准差等统计量,以描述数据的特征。 或者使用机器学习或时间序列分析的方法对加密货币的价格进行预测,根据历史数据预测未来价格走势。 例如,使用 scikit-learn 进行简单的回归分析: 数据挖掘与特征提取: 挖掘加密货币数据中的特征,如找出影响价格的关键因素,对数据中的特征进行筛选和提取,以帮助更好地理解加密货币的市场行为。
类和对象、继承、封装、多态、接口、异常
gee python相关教程
夜间灯光强度(平均灯光强度)的高低反映了一个地区城市化发展的水平,平均灯光强度越高,说明该地区城市群越多,城市化程度越高。夜间灯光数据现在越来越广泛地应用于经济增长分析、经济地理、城市经济学、数字经济等众多领域。 本数据包括三套: [1]中国类DMSP-OLS灯光数据1992-202 [2]中国超长序列灯光数据1984-2020 [3]全球类NPP-VIIRS夜间灯光数据2000-2022 包括:全国各省、市、县夜间灯光数据 矫正后夜间灯光数据 细分:标准差、平均值、总值、最大值和最小值
工程项目总监绩效考核表
首先解释一下什么叫转移支付。其实,这和养老金的中央调剂是一样的。 每年,地方都要向中央缴纳财政。而中央又要根据各地方的财政实力,给予转移支付。比如一些经济弱省,本身财政收入就不够支出的,还得上交一部分给中央,怎么维持财政运转?由于各省市直接的财政收入能力存在差异,中央为实现各个地方的公共服务水平平等,于是便有了财政转移支付制度。 简单理解就是富省养穷省。 2022年全国一般预算内财政收入203703亿元,给地方转移支付了97144.75亿元,转移支付数额创下新高。
基于门控卷积和堆叠自注意力的离线手写汉字识别算法研究.pdf
【数据介绍】 作为第二大人类部门用水,高质量的工业用水格网数据对于水资源研究和管理至关重要。中国工业用水格网数据(China Industrial Water Withdrawal dataset, CIWW)基于超过 40 万家企业数据、月度工业产品产量数据和连续工业用水统计数据制作得到的一套1965-2020年逐月中国工业用水数据集,其空间分辨率为 0.1°和 0.25°。数据集包括工业用水、企业数量和企业生产总值(辅助数据)等变量,可被用于水文、地理学、环境、可持续发展等方面科学研究。 【数据来源】 数据来源为《中国经济普查年鉴》(省级工业取水量、工业产出)、《中国工业企业数据库》(企业地理位置、产值)、《中国工业产品产量数据库》(工业产品月生产量),以及《中国水资源公报》和(Zhou et al, 2020, PNAS)的工业用水量数据。 【数据处理】 首先通过2008年企业分布数据、经济普查年鉴中分省分部门的工业用水量和工业产值计算得到分省分部门工业用水效率和工业产品产量数据,得到了2008年逐月工业用水数据。然后结合中国水资源公报和相关文献中省级工业用水数据,以2008年工业用水的时空格局作为基础分配工业用水数据,最终得到1965-2020年逐月工业用水的格网数据。详细方法见High-resolution mapping of monthly industrial water withdrawal in China from 1965 to 2020 (Hou et al, 2024, ESSD). 将数据集与统计数据记录和其他数据集进行了验证,结果表示在时间尺度和空间尺度上都与统计数据具有一致性,相比已有工业用水数据有更好的精度。
65 -质量管理部经理绩效考核表1
11 -电脑部经理绩效考核表1
内容概要:本文提供了针对大学生英语竞赛写作准备的重要资源——一系列通用的英文句子模板。这些模板涵盖了现代经济社会的各种话题,从科技进步到环境保护,以及个人品质和社会责任等,并且适用于论述类文章、观点对比和个人见解的表达。文章通过对每一句话的应用环境解释和语法提示,确保使用者可以在实际写作中正确且有效地应用这些表达方式。 适合人群:正在准备参加大学生英语竞赛的学生及其他希望提高书面表达能力的学习者。 使用场景及目标:考生能够在竞赛时间内迅速构建思路完整的文章,增强语言表达的流利性和规范性;帮助学习者积累高级词汇,提升英语写作水平并培养良好的思维逻辑。 阅读建议:结合历年优秀范文进行深入学习,熟悉不同类型话题下的表述方法;练习将提供的句子融入自身创作的文章中,通过不断修订和完善来巩固记忆。同时也可以用于日常的英语写作训练当中。
法律事务专员绩效考核表
1、文件内容:apache-commons-digester-javadoc-1.8.1-19.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apache-commons-digester-javadoc-1.8.1-19.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
永磁同步电机磁场定向控制(矢量控制)Simulink仿真模型波形展现与解析,永磁同步电机的磁场定向控制(矢量控制)simulink仿真模型,波形完美 ,核心关键词:永磁同步电机; 磁场定向控制(矢量控制); Simulink仿真模型; 波形完美;,永磁同步电机矢量控制仿真模型:磁场完美调控,波形精确无误
07 -储运部经理绩效考核表1