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

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

📁 VC的一些技巧性文档
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<html><body background="di2001.jpg"><head><meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title> Visual C++5.0编程经验</title><style type="text/css"><!--.10V {font-size: 9pt; font-family: 宋体;text-decoration:none;color="0000ff";}.12V {font-size: 12pt; font-family: 宋体;}--></style></head><body bgcolor="#FFFFFF"><h2 align="center"><font size="6" color="#0000FF">Visual C++ 5.0 编 程 经 验</font></h2><div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="80%">  <tr>    <td valign="top"><p align="left"><font size="4">作者:北京大学计算机系-蒋志华</font>     </p>    <h3><font color="#A30004">另 一 种 改 变 窗 口 标 题 的 方 法</font></h3>    <h3><font color="#FFFFFF">----</font> 在1997 年9 月1 日 出 版 的《 计 算 机 世     界》 上 有 一 篇 名 为《Visual C++ 4.0 编 程 经 验 谈》 的 文 章, 其     中 提 到 过 一 种 改 变 窗 口 标 题 的 方 法, 即 在 应 用 程 序 的     框 架 类CMainFrame 类( 注: 它 是CFrameWnd 类 的 派 生 类) 的 成 员 函     数PreCreateWindow() 中 修 改CFrameWnd 类 的 成 员 变 量m_strTitle 的 值。 这     种 方 法 的 不 足 之 处 就 是 只 能 一 次 性 的 设 置 窗 口 标 题     的 内 容, 不 能 在 程 序 运 行 过 程 中 随 时 修 改 它。 比 如 当     需 要 把 鼠 标 的 当 前 坐 标 在 窗 口 标 题 上 显 示 时, 我 们 就     要 使 用 到Visual C++ 提 供 的 全 程 函 数 BOOL SetWindowText( HWND hWnd,     LPCTSTR lpString )。 这 个 函 数 实 际 上 是 一 个Win32 函 数。 它 的 第     一 个 参 数 要 求 是 一 个 窗 口 框 架 的 句 柄, 而 第 二 个 参 数     要 求 是 一 个 指 向 一 个 常 量 字 符 串 的32 位 指 针, 即LPCTSTR     类 型 的 变 量。 通 常 情 况 下, 我 们 往 往 会 在 应 用 程 序 的     文 档 类 或 视 类 中 动 态 改 变 窗 口 标 题 的 内 容, 从 而 没 有     现 成 的 指 向 窗 口 框 架 的 句 柄 供 我 们 使 用, 因 此 我 们 还     需 要 在 使 用SetWindowText() 函 数 前 先 调 用 另 一 个Win32 函 数AfxGetMainWnd(),     来 获 得 一 个 指 向 应 用 程 序 的 框 架 类 的 指 针, 例 如 使 用     语 句 </h3>    <p><font color="#FFFFFF">----</font> CWnd* m_pCWnd= AfxGetMainWnd() </p>    <p><font color="#FFFFFF">----</font> 然 后, 再 以 如 下 形 式 调 用SetWindowText()     函 数: </p>    <p><font color="#FFFFFF">----</font> SetWindowText(*m_pCWnd, (LPCTSTR) m_WindowText);//     m_WindowText 可 以 是 一 个CString 类 的 变 量 </p>    <p><font color="#FFFFFF">----</font> 如 何 把 多 于256 色 的 位 图 作 为 资     源 加 入 到 应 用 程 序 中 </p>    <p><font color="#FFFFFF">----</font> 曾 经 使 用 过Visual C++ 进 行 应 用 程 序     开 发 的 同 行 们 都 知 道,Visual C++ 5.0 以 前 版 本 中 自 带 的 位     图 编 辑 器 不 能 浏 览 和 编 辑256 色 以 上 的 位 图, 并 且 资 源     文 件 中 也 不 允 许 嵌 入(Import)256 色 以 上 的 位 图 作 为 资 源(     否 则, 在 应 用 程 序 运 行 时 会 报 错)。 这 一 特 性 使 得 我 们     用Visual C++ 开 发 应 用 程 序 时 不 得 不 使 用 其 他 方 法 来 增 强     界 面 图 画 的 美 观 性, 于 是 就 有 使 用Visual C++ 开 发 应 用 程     序 内 核, 用Visual Basic 开 发 界 面 部 分 的 组 合 方 法。 好 在Visual     C++ 5.0 中 这 个 问 题 有 了 改 善。 首 先, 位 图 编 辑 器 可 以 创     建 并 编 辑256 色 的 位 图 了。 另 外,Visual C++ 5.0 允 许 程 序 员 把256     色 以 上 的 位 图 嵌 入 到 资 源 中, 尽 管 仍 然 无 法 在Visual C++     的 位 图 编 辑 器 中 浏 览, 并 且 还 要 求 必 须 选 择Win32 Release     作 为 编 译 方 式 生 成 可 执 行 的 应 用 程 序。 另 外 一 个 限 制     条 件 是 作 为 资 源 的256 色 以 上 的 位 图 不 能 由 应 用 程 序 内     核 自 动 打 开 和 关 闭。 比 如 说, 在 上 述 那 篇 名 为《Visual C++     4.0 编 程 经 验 谈》 的 文 章 中 曾 经 提 到 过 一 种 为 对 话 框 加     入 位 图 式 按 钮 的 方 法, 即 由 程 序 开 发 者 为 每 个 按 钮 创     建 四 幅 位 图, 分 别 用 于 表 示 按 钮 的 弹 起 状 态(UP)、 按 下     状 态(DOWN)、 输 入 焦 点 状 态(FOCUS) 和 禁 止 状 态(DISABLE), 并 且     必 须 以 该 按 钮 的 标 题 名 与 上 述 四 种 状 态 之 一 的 组 合     作 为 位 图 的 标 识, 以 便 应 用 程 序 在 绘 制 位 图 按 钮 时,     可 以 自 动 地 找 到 相 应 的 资 源( 即 位 图)。 然 而 这 一 自 动     映 射 只 限 制 于Visual C++ 位 图 编 辑 器 能 够 打 开 的 位 图。 因     此 如 果 选 择256 色 以 上 的 位 图 作 为 位 图 按 钮 的 资 源, 并     也 希 望 达 到 上 述 四 状 态 的 相 互 切 换 的 话, 就 必 须 用 到     下 述 的 函 数 和 程 序 设 计 参 考 模 型。 <ul type="square">      <li>设 置 四 个 常 量,BUTTON_UP,BUTTON_DOWN,BUTTON_FOCUS,BUTTON_DISABLE, 分         别 用 于 标 识 各 按 钮 的 当 前 状 态。 <br>      </li>      <li>在 应 用 程 序 的 相 应 对 话 框 类 中 为 每 个 位 图 按 钮( 为 下         面 叙 述 方 便, 不 妨 假 设 为 两 个) 设 置 一 个CRect 类 的 对         象,m_rect1 和m_rect2, 来 记 载 各 按 钮 在 对 话 框 中 所 占 据 的         坐 标 矩 形。 再 在 该 对 话 框 类 中 为 每 个 按 钮 设 置 一 个 整         型 变 量,Buton1_Status,Button2_Status, 记 录 各 按 钮 的 当 前 状 态。         然 后 在 对 话 框 的 构 造 函 数 中 初 始 化 这 些CRect 类 的 对 象         和 整 型 变 量。 <br>      </li>      <li>在 该 对 话 框 类 中 创 建 分 别 响 应 鼠 标 各 种 状 态 的 消 息         处 理 函 数, 如OnMouseMove(),OnLButtonUp(),OnLButtonDown() 等。 <br>      </li>      <li>同 时 按 下Ctrl 和W 键 或 直 接 单 击 工 具 条 上 的ClassWizard 按         钮, 打 开ClassWizard 对 话 框。 在 类 名(Class name) 列 表 框 中 选 择         对 话 框 类, 在Object IDs 列 表 框 中 选 择 该 类 的 类 名 后, 在         消 息(Messages) 列 表 框 中 选 择WM_PAINT 消 息 并 双 击 它, 这 时ClassWizard         就 会 在 该 对 话 框 类 中 加 入 一 个OnPaint() 函 数。 该 函 数 将         在 我 们 的 程 序 中 起 重 要 作 用。 之 后, 再 在Object IDs 列 表         框 中 选 择 新 加 入 的 工 具 条 按 钮 的 标 识 名, 双 击 消 息 列         表 框 中 的COMMAND 消 息,ClassWizard 又 会 在 对 话 框 类 中 加 入 相         应 的 消 息 处 理 函 数。 关 闭ClassWizard 对 话 框。 </li>    </ul>    <p><font color="#FFFFFF">----</font> 下 面 给 出 部 分 程 序 代 码, 仅 供     参 考。 </p>    <pre>void CTESTDlg::OnPaint() {	CWnd* pWnd;	CDC* pDC;	CDC* pDisplayMemDC;	CBitmap* pBitmap;	pWnd=GetDlgItem(IDC_IMAGE1);//得到指向第一个位图按钮的指针	pDC=pWnd-&gt;GetDC();//获得一个窗口设备用于画图	pWnd-&gt;Invalidate();//使窗口无效,从而更新它	pWnd-&gt;UpdateWindow();	pDisplayMemDC=new CDC;	pBitmap=new CBitmap;	pDisplayMemDC-&gt;CreateCompatibleDC(pDC);	if (Change1) {//说明第一个按钮的状态发生了变化	switch (Button1_Status){	case BUTTON_DISABLE:		pBitmap-&gt;LoadBitmap(IMAGE1_DISABLE);//装入位图		pDisplayMemDC-&gt;SelectObject(pBitmap);		pDC-&gt;BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);               //把位图拷贝到指定区域		break;	case BUTTON_UP:		pBitmap-&gt;LoadBitmap(IMAGE1_UP);		pDisplayMemDC-&gt;SelectObject(pBitmap);		pDC-&gt;BitBlt(0,0,140,30,pDisplayMemDC, 0,0,SRCCOPY);		break;	case BUTTON_FOCUS:		pBitmap-&gt;LoadBitmap(IMAGE1_FOCUS);		pDisplayMemDC-&gt;SelectObject(pBitmap);		pDC-&gt;BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);		break;	case BUTTON_DOWN:		pBitmap-&gt;LoadBitmap(IMAGE1_DOWN);		pDisplayMemDC-&gt;SelectObject(pBitmap);		pDC-&gt;BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);		break;	}		}	delete pDisplayMemDC;	delete pBitmap;	pWnd=GetDlgItem(IDC_IMAGE2);	pDC=pWnd-&gt;GetDC();	pWnd-&gt;Invalidate();	pWnd-&gt;UpdateWindow();	pDisplayMemDC=new CDC;	pBitmap=new CBitmap;	pDisplayMemDC-&gt;CreateCompatibleDC(pDC);	if (Change2) {//说明第二个按钮的状态发生了变化	switch (Button2_Status){	case BUTTON_DISABLE:		pBitmap-&gt;LoadBitmap(IMAGE2_DISABLE);		pDisplayMemDC-&gt;SelectObject(pBitmap);		pDC-&gt;BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);		break;	case BUTTON_UP:		pBitmap-&gt;LoadBitmap(IMAGE2_UP);		pDisplayMemDC-&gt;SelectObject(pBitmap);		pDC-&gt;BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);		break;	case BUTTON_FOCUS:		pBitmap-&gt;LoadBitmap(IMAGE2_FOCUS);		pDisplayMemDC-&gt;SelectObject(pBitmap);		pDC-&gt;BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);		break;	case BUTTON_DOWN:		pBitmap-&gt;LoadBitmap(IMAGE2_DOWN);		pDisplayMemDC-&gt;SelectObject(pBitmap);		pDC-&gt;BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);		break;	}		}	delete pDisplayMemDC;	delete pBitmap;	CDialog::OnPaint();}void CTESTDlg::OnMouseMove(UINT nFlags, CPoint point) {	CRect rect=CRect(0,0,1,1);	CRgn rgn1,rgn2;//记录各位图按钮所占据的矩形区域	rgn1.CreateRectRgnIndirect(m_rect1);           //rgn1记录第一个位图按钮所占据的矩形区域	if (rgn1.PtInRegion(point))        {//鼠标当前是否已落入第一个位图按钮所占据的矩形区域		if ( (Button1_Status!=BUTTON_FOCUS)            &amp;&amp; (Button1_Status!=BUTTON_DISABLE) ) {//如果位图按钮的当前状态不是输入焦点状态并且也不是禁止状态	Button1_Status= BUTTON_FOCUS;			Change1=true;			InvalidateRect(rect,FALSE);		}		if ( (Button2_Status!=BUTTON_UP) &amp;&amp;             (Button2_Status!=BUTTON_DISABLE) ) {			Button2_Status= BUTTON_UP;			Change2=true;			InvalidateRect(rect,FALSE);		}	}	else{	rgn2.CreateRectRgnIndirect(m_rect2);	if (rgn2.PtInRegion(point)){		if ( (Button2_Status!=BUTTON_FOCUS)            &amp;&amp; (Button2_Status!=BUTTON_DISABLE) ) {			Button2_Status= BUTTON_FOCUS;			Change2=true;			InvalidateRect(rect,FALSE);		}		if ( (Button1_Status!=BUTTON_UP)           &amp;&amp; (Button1_Status!=BUTTON_DISABLE) ) {			Button1_Status= BUTTON_UP;			Change1=true;			InvalidateRect(rect,FALSE);		}	}	}	CDialog::OnMouseMove(nFlags, point);}void CTESTDlg::OnLButtonUp(UINT nFlags, CPoint point) {	CRect rect=CRect(0,0,1,1);	CRgn rgn1,rgn2;	rgn1.CreateRectRgnIndirect(m_rect1);	if (rgn1.PtInRegion(point)){		if ( (Button1_Status!=BUTTON_UP)            &amp;&amp; (Button1_Status!=BUTTON_DISABLE) ) {			Button1_Status=BUTTON_UP;			Change1=true;			InvalidateRect(rect,FALSE);		}	}	else{	rgn2.CreateRectRgnIndirect(m_rect2);	if (rgn2.PtInRegion(point)){		if ( (Button2_Status!=BUTTON_UP)            &amp;&amp; (Button2_Status!=BUTTON_DISABLE) ) {			Button2_Status=BUTTON_UP;			Change2=true;			InvalidateRect(rect,FALSE);		}	}	}	CDialog::OnLButtonUp(nFlags, point);}void CTESTDlg::OnLButtonDown(UINT nFlags, CPoint point) {	CRect rect=CRect(0,0,1,1);	CRgn rgn1,rgn2;	rgn1.CreateRectRgnIndirect(m_rect1);	if (rgn1.PtInRegion(point)){		if ( (Button1_Status!=BUTTON_DOWN)             &amp;&amp; (Button1_Status!=BUTTON_DISABLE) ) {			Button1_Status=BUTTON_DOWN;			Change1=true;			InvalidateRect(rect,FALSE);		}		if ( (Button2_Status!=BUTTON_UP)            &amp;&amp; (Button2_Status!=BUTTON_DISABLE) ) {			Button2_Status=BUTTON_UP;			Change2=true;			InvalidateRect(rect,FALSE);		}	}	else{	rgn2.CreateRectRgnIndirect(m_rect2);	if (rgn2.PtInRegion(point)){		if ( (Button2_Status!=BUTTON_DOWN)             &amp;&amp; (Button2_Status!=BUTTON_DISABLE) ) {			Button2_Status=BUTTON_DOWN;			Change2=true;			InvalidateRect(rect,FALSE);		}		if ( (Button1_Status!=BUTTON_UP)            &amp;&amp; (Button1_Status!=BUTTON_DISABLE) ) {			Button1_Status=BUTTON_UP;			Change1=true;			InvalidateRect(rect,FALSE);		}	}	}	CDialog::OnLButtonDown(nFlags, point);}</pre>    <h3><font color="#A30004">如 何 在 应 用 程 序 中 不 加 载 菜 单、 工 具     条 和 状 态 条</font></h3>

⌨️ 快捷键说明

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