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

📄 visual c++ 50 编 程 经 验.htm

📁 VC的一些技巧性文档
💻 HTM
📖 第 1 页 / 共 3 页
字号:
    <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(&quot;Failed to create toolbar\n&quot;);		return -1;      // fail to create	}	if (!m_wndStatusBar.Create(this) ||		!m_wndStatusBar.SetIndicators(indicators,		  sizeof(indicators)/sizeof(UINT)))	{		TRACE0(&quot;Failed to create status bar\n&quot;);		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(&amp;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-&gt;Create();		GetDlgItem(IDC_EXPORT)-&gt;EnableWindow(FALSE);	}	else//否则就激活它		m_Dlg-&gt;SetActiveWindow();	另外,再在要关闭提示对话框的地方,加入如下语句:	m_Dlg-&gt;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, &amp;e))       //以BatName的内容创建一个批处理文件	{		AfxMessageBox(&quot;不能创建文件&quot;+BatName);		return ;	}	char density[6];	sprintf(density,&quot;%d&quot;,mTotalBytes);</pre>    <p><font color="#FFFFFF">----</font> //mTotalBytes 是 由 其 他 函 数 设 定 的 变     量, 用 于 记 录 用 于 拷 入 或 拷 出 文 件 的 磁 盘 所 具 有 的 最     大 可 用 空 间 </p>    <pre>	CString Density=density;	CString string;	if (out)//说明是生成做压缩工作的批处理文件		string=&quot;arj a -v&quot;+Density;	else //说明是生成做解压缩工作的批处理文件		string=&quot;arj e -v&quot;+Density;	string+=&quot; ..\\&quot;+ArjPath+&quot;\\&quot;+ArjFileName+&quot; &quot;;	if (out)		string=string+&quot;..\\&quot;+TempPath+&quot;\\*.* -y -jm\n&quot;;	else		string=string+&quot;..\\&quot;+TempPath+&quot;\\ -y -jm\n&quot;;	f.WriteString(string);	string=&quot;dir &gt;&quot;+ExitFlag+&quot;\n&quot;;	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 &gt; 临 时 文 件 名 <br>    <font color="#FFFFFF">----</font> 或 者 是: <br>    <font color="#FFFFFF">----</font> ARJ E -V1440 被 解 压 缩 文 件 的 路 径 名+     文 件 名 解 压 缩 后 文 件 的 路 径 名+ 文 件 名 -Y -JM <br>    <font color="#FFFFFF">----</font> DIR &gt; 临 时 文 件 名 <ul type="square">      <li>在 需 要 调 用ARJ.EXE 进 行 压 缩/ 解 压 缩 的 类 中, 再 创 建 一         个 成 员 函 数, 不 妨 称 作RunBat(), 其 作 用 是 创 建 和 执 行 进         程 来 运 行 上 述 所 生 成 的 批 处 理 文 件, 并 在 适 当 时 候 撤         消 进 程。 </li>    </ul>    <pre>void CMyCompress::RunBat(CString         BatPath,CString fileName,CString ExitFlag){	CString lpApplicationName=BatPath+&quot;\\&quot;+fileName;           // 进 程 执 行 的 应 用 程 序 的 完 全 路 径 名	STARTUPINFO StartupInfo;// 创 建 进 程 所 需 的 信 息 结 构 变 量	GetStartupInfo(&amp;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,&amp;StartupInfo,&amp;pro_info)) 	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -