?? visual c++ 50 編 程 經 驗.htm
字號:
<h3><font color="#FFFFFF">----</font> 在 通 過AppWizard 生 成 的 具 有 窗 口 框 架 結 構 的 應 用 程 序(SDI 和MDI) 中,MFC 類 庫 已 為 我 們 加 載 上 了 菜 單( 包 括 一 個 系 統 菜 單)、 工 具 條 和 狀 態 條。 但 有 時 由 于 特 殊 需 要, 我 們 可 能 希 望 在 自 己 的 應 用 程 序 中 事 先 不 加 載 菜 單、 工 具 條 和 狀 態 條。 這 時 就 需 要 我 們 手 動 地 刪 除 和 修 改 一 些 類 中 的 語 句。 </h3> <ul type="square"> <li>打 開MainFrm.cpp 文 件, 使 用 工 具 條 上 的 函 數 下 拉 列 表 框 找 到OnCreate() 函 數。 按 照 下 述 程 序 注 釋 掉 創 建 工 具 條 和 狀 態 條 部 分 的 語 句。 </li> </ul> <pre>int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;//在此處開始加注釋符號/* if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // TODO: Remove this if you don't want tool tips or a resizeable toolbar m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); // TODO: Delete these three lines if you don't want the toolbar to be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);在處結束注釋*/ return 0;}</pre> <ul type="square"> <li>在MainFrm.cpp 文 件 中, 使 用 工 具 條 上 的 函 數 下 拉 列 表 框 找 到PreCreateWindow() 函 數。 參 照 第 三 部 分 中 的 程 序, 加 入 特 定 的 窗 口 框 架 屬 性, 不 妨 把cs.style 設 置 成 如 下 形 式, 即 不 加 載 系 統 菜 單。 <br> // Create a window without min/max buttons,system menu, or sizable border <br> cs.style =WS_OVERLAPPED | WS_BORDER; </li> <li>在 主 應 用 程 序, 即 含 有 定 義theApp 全 程 變 量 的.cpp 文 件 中, 使 用 工 具 條 上 的 函 數 下 拉 列 表 框 找 到InitInstance() 函 數。 在“pDocTemplate = new CSingleDocTemplate” 一 句 中, 用NULL 替 換IDR_MAINFRAME。 如 下 段 程 序 所 示。 </li> </ul> <pre>BOOL CYourMainApp::InitInstance(){//.....此處略去一部分無關語句 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( NULL, //IDR_MAINFRAME, //用NULL替換IDR_MAINFRAME RUNTIME_CLASS(CNoBarDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CNoBarView)); AddDocTemplate(pDocTemplate);//.....此處略去一部分無關語句}</pre> <ul type="square"> <li>找 到Visual C++ 編 輯 器 的 工 具 條 上 的 編 譯 方 式 下 拉 列 表 框, 選 擇Win32 Release, 生 成Release 版 本 的 應 用 程 序。 </li> </ul> <p><font color="#FFFFFF">----</font> 至 此, 我 們 就 得 到 了 不 含 菜 單、 工 具 條 和 狀 態 條 結 構 的 應 用 程 序。 </p> <p> </p> <h3><font color="#FF0000">實 現 操 作 過 程 提 示 對 話 框 的 一 種 方 法 </font><font color="#FFFFFF">----</font> 在 使 用Windows95 進 行 文 件 拷 貝 或 者 刪 除 操 作 時, 您 一 定 見 到 過 那 種 具 有 飛 文 件 動 畫 的 操 作 過 程 提 示 對 話 框。 這 一 功 能 的 加 入 不 僅 使 我 們 能 夠 在 操 作 過 程 當 中 隨 時 取 消 操 作, 而 且 也 使 文 件 拷 貝 或 者 刪 除 操 作 變 得 生 動 活 潑。 其 實, 在 使 用Visual C++ 進 行 應 用 程 序 設 計 時, 我 們 也 可 以 使 用 下 述 方 法 在 適 當 位 置 加 入 自 己 的 操 作 過 程 提 示 對 話 框。 </h3> <ul type="square"> <li>為 每 一 個 操 作 過 程 提 示 對 話 框 創 建 一 個 對 話 框 類。 為 了 下 面 敘 述 方 便, 我 們 只 假 設 應 用 程 序 需 要 一 個 操 作 過 程 提 示 對 話 框 并 以“CModel” 作 為 對 應 的 對 話 框 類 的 名 字。 <br> </li> <li>使 用Visual C++ 提 供 的 資 源 編 輯 器 編 輯 提 示 對 話 框, 比 如 加 入 一 些 文 字 說 明 和 動 畫 等。 <br> </li> <li>在CModel 類 的 頭 文 件(Model.h) 中, 加 入 兩 個 成 員 變 量, <br> CWnd* m_pParent; // 指 向 調 用 該 提 示 對 話 框 的 框 架 類( 或 對 話 框 類), 即 它 的“ 父 類” int m_nID;// 記 錄 該 提 示 對 話 框 的ID 號 <br> 以 及 下 面 兩 個 成 員 函 數: <br> CModel(CWnd* pParent = NULL); // 舍 棄 原 有 的 構 造 函 數, 或 者 把 原 函 數 修 改 成 這 種 無 模 式 對 話 框 的 構 造 函 數 <br> BOOL Create(); // 該 函 數 將 調 用 創 建 基 類 的Create() 函 數 創 建 對 話 框 </li> <li>在Model.cpp 文 件 中, 加 入 相 應 函 數 的 實 現 部 分。 </li> </ul> <pre>CModel::CModel(CWnd* pParent /*=NULL*/) : CDialog(CModel::IDD, pParent){ m_pParent=pParent; m_nID=CModel::IDD; //{{AFX_DATA_INIT(CModel) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT}BOOL CModel::Create(){ return CDialog::Create(m_nID,m_pParent);}</pre> <ul type="square"> <li>同 時 按 下Ctrl 和W 鍵 或 直 接 單 擊 工 具 條 上 的ClassWizard 按 鈕, 打 開ClassWizard 對 話 框。 在 類 名(Class name) 列 表 框 中 選 擇 該 提 示 對 話 框 類, 在Object IDs 列 表 框 中 選 擇 該 類 的 類 名 后, 在 消 息(Messages) 列 表 框 中 選 擇PostNcDestroy 消 息 并 雙 擊 它, 這 時ClassWizard 就 會 在 該 對 話 框 類 中 加 入 一 個PostNcDestroy() 函 數。 該 函 數 將 會 在 對 話 框 窗 口 消 失 后, 由OnNcDestroy() 函 數 調 用。 因 此, 可 以 在 該 函 數 中 加 入 一 些 掃 尾 工 作, 例 如 數 據 傳 送, 釋 放 指 針 空 間 等。 </li> </ul> <pre>void CModel::PostNcDestroy() { // TODO: Add your specialized code here and/or call the base class delete this; CDialog::PostNcDestroy();}</pre> <ul type="square"> <li>在 要 調 用 提 示 對 話 框 類 的 類 的 頭 文 件 中, 先 包 含(#include)CModel 類 的 頭 文 件, 再 聲 明 一 個 指 向CModel 類 的 對 象 的 指 針, 如m_Dlg, 并 在 該 類 的 構 造 函 數 中, 加 入“m_Dlg = NULL;” 一 句。 然 后, 在 打 開 和 關 閉 提 示 對 話 框 的 函 數 中 加 入 如 下 一 段 程 序: </li> </ul> <pre> if (m_Dlg==NULL) {//如果當前沒用提示對話框在活動,就創建一個 m_Dlg = new CModel(this); m_Dlg->Create(); GetDlgItem(IDC_EXPORT)->EnableWindow(FALSE); } else//否則就激活它 m_Dlg->SetActiveWindow(); 另外,再在要關閉提示對話框的地方,加入如下語句: m_Dlg->DestroyWindow(); m_Dlg=NULL;</pre> <p><font color="#FFFFFF">----</font> 至 此, 您 已 經 擁 有 了 自 己 的 過 程 操 作 提 示 對 話 框。 不 過, 它 還 不 具 有 動 畫 和 隨 時 取 消 操 作 的 功 能。 您 不 妨 嘗 試 著 加 入 這 些 功 能。 另 外, 筆 者 也 曾 嘗 試 過 用 下 面 介 紹 的 方 法 實 現 過 程 操 作 提 示 對 話 框。 兩 種 方 法 比 較, 可 謂 各 有 千 秋。 如 果 您 希 望 上 面 設 計 的 過 程 提 示 對 話 框 能 夠 被 多 個 應 用 程 序 共 享, 那 么 最 好 把 提 示 對 話 框 作 為 獨 立 的 進 程 來 調 用。 但 是, 當 您 還 希 望 在 提 示 對 話 框 與 調 用 者 之 間 傳 輸 數 據 的 話, 似 乎 這 一 部 分 介 紹 的 實 現 方 法 更 簡 潔 且 更 有 效。 </p> <h3><font color="#FF0000">應 用 進 程 實 現 對 其 他 應 用 程 序 的 調 用</font></h3> <h3><font color="#FFFFFF">----</font> 在 我 們 設 計 的 應 用 程 序 中, 很 可 能 會 用 到 其 他 應 用 程 序 來 完 成 某 一 特 定 功 能。 例 如, 當 我 們 為 了 便 于 數 據 的 傳 輸 而 對 諸 多 文 件 進 行 壓 縮 和 解 壓 縮 時, 一 種 作 法 是 我 們 自 己 設 計 一 個 這 樣 的 壓 縮/ 解 壓 縮 程 序, 然 后 以 動 態 鏈 接 庫(DLL) 或 者 函 數 庫 的 形 式 由 主 應 用 程 序 調 用。 但 更 方 便 而 且 高 效 的 作 法 是 利 用 現 有 的 這 方 面 的 優 秀 軟 件, 比 如ARJ.EXE, 并 以 進 程 的 形 式 調 用 它, 再 在 適 當 時 候 關 閉 它。 下 面 將 以 上 面 所 述 為 例, 具 體 介 紹 后 一 種 方 法 的 實 現 過 程。 </h3> <ul type="square"> <li>在 需 要 調 用ARJ.EXE 進 行 壓 縮/ 解 壓 縮 的 類 中, 創 建 一 個 成 員 函 數, 不 妨 稱 作CreateBat(), 其 作 用 是 生 成 一 個 批 處 理 文 件。 由 該 批 處 理 文 件 調 用ARJ.EXE, 并 給 出 具 體 壓 縮/ 解 壓 縮 參 數。 之 后, 再 利 用MS-DOS 的DIR 命 令 生 成 一 個 臨 時 文 件, 以 作 為 壓 縮/ 解 壓 縮 工 作 完 成 的 標 志。 </li> </ul> <pre>void CMyCompress:: CreateBat(CString BatPath,CString ArjPath, CString BatName,CString ArjFileName, CString TempPath,CString ExitFlag,BOOL out){ LPTSTR lpBuffer; UINT uSize; HANDLE hHeap; uSize=(GetCurrentDirectory(0,NULL))*sizeof(TCHAR); hHeap=GetProcessHeap(); lpBuffer=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,uSize); GetCurrentDirectory(uSize,lpBuffer); //得知當前目錄信息,以便根據需要變換目錄 if (lpBuffer!=BatPath) //diferent dir SetCurrentDirectory(BatPath); CStdioFile f; CFileException e; if (!f.Open( BatName, CFile::modeCreate|CFile::modeWrite, &e)) //以BatName的內容創建一個批處理文件 { AfxMessageBox("不能創建文件"+BatName); return ; } char density[6]; sprintf(density,"%d",mTotalBytes);</pre> <p><font color="#FFFFFF">----</font> //mTotalBytes 是 由 其 他 函 數 設 定 的 變 量, 用 于 記 錄 用 于 拷 入 或 拷 出 文 件 的 磁 盤 所 具 有 的 最 大 可 用 空 間 </p> <pre> CString Density=density; CString string; if (out)//說明是生成做壓縮工作的批處理文件 string="arj a -v"+Density; else //說明是生成做解壓縮工作的批處理文件 string="arj e -v"+Density; string+=" ..\\"+ArjPath+"\\"+ArjFileName+" "; if (out) string=string+"..\\"+TempPath+"\\*.* -y -jm\n"; else string=string+"..\\"+TempPath+"\\ -y -jm\n"; f.WriteString(string); string="dir >"+ExitFlag+"\n"; f.WriteString(string); f.Close(); SetCurrentDirectory(lpBuffer);//回復到原來的目錄下}</pre> <p><font color="#FFFFFF">----</font> 該 函 數 執 行 后, 將 生 成 一 個 批 處 理 文 件, 內 容 大 致 是: <br> <font color="#FFFFFF">----</font> ARJ A -V1440 壓 縮 后 文 件 的 路 徑 名+ 文 件 名 被 壓 縮 文 件 的 路 徑 名+ 文 件 名 -Y -JM <br> <font color="#FFFFFF">----</font> DIR > 臨 時 文 件 名 <br> <font color="#FFFFFF">----</font> 或 者 是: <br> <font color="#FFFFFF">----</font> ARJ E -V1440 被 解 壓 縮 文 件 的 路 徑 名+ 文 件 名 解 壓 縮 后 文 件 的 路 徑 名+ 文 件 名 -Y -JM <br> <font color="#FFFFFF">----</font> DIR > 臨 時 文 件 名 <ul type="square"> <li>在 需 要 調 用ARJ.EXE 進 行 壓 縮/ 解 壓 縮 的 類 中, 再 創 建 一 個 成 員 函 數, 不 妨 稱 作RunBat(), 其 作 用 是 創 建 和 執 行 進 程 來 運 行 上 述 所 生 成 的 批 處 理 文 件, 并 在 適 當 時 候 撤 消 進 程。 </li> </ul> <pre>void CMyCompress::RunBat(CString BatPath,CString fileName,CString ExitFlag){ CString lpApplicationName=BatPath+"\\"+fileName; // 進 程 執 行 的 應 用 程 序 的 完 全 路 徑 名 STARTUPINFO StartupInfo;// 創 建 進 程 所 需 的 信 息 結 構 變 量 GetStartupInfo(&StartupInfo); StartupInfo.lpReserved=NULL; StartupInfo.lpDesktop=NULL; StartupInfo.lpTitle=NULL; StartupInfo.dwX=0; StartupInfo.dwY=0; StartupInfo.dwXSize=200; StartupInfo.dwYSize=300; StartupInfo.dwXCountChars=500; StartupInfo.dwYCountChars=500; StartupInfo.dwFlags=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow=SW_HIDE; // 說 明 進 程 將 以 隱 藏 的 方 式 在 后 臺 執 行 StartupInfo.cbReserved2=0; StartupInfo.lpReserved2=NULL; StartupInfo.hStdInput=stdin; StartupInfo.hStdOutput=stdout; StartupInfo.hStdError=stderr; LPTSTR lpBuffer; UINT uSize; HANDLE hHeap; uSize=(GetCurrentDirectory(0,NULL))*sizeof(TCHAR); hHeap=GetProcessHeap(); lpBuffer=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,uSize); GetCurrentDirectory(uSize,lpBuffer); // 得 知 當 前 目 錄 信 息, 以 便 根 據 需 要 變 換 目 錄 if (lpBuffer!=BatPath) //diferent dir SetCurrentDirectory(BatPath);// 創 建 進 程 if (CreateProcess(lpApplicationName,NULL,NULL, NULL,FALSE,CREATE_DEFAULT_ERROR_MODE, NULL,NULL,&StartupInfo,&pro_info)) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -