vc60中基于msflexgrid的可编辑表格制作


瑟 辫 罄 一 馨 瑟 i | j t | | ’ 。 一 、 概 述 V C 6 .0 由基 于 M S FlexG rid 硇 可编 辑表格硇 制作 暮 雪 摘 要 本 文讲述 了 V C 6 .0 中基 于 M SF lexG rid 的 可编辑 表格 的 制作 过程 ,并给 出源代 码 关键 词 M SF lexG rid 控 件 ,控件 粘 贴 ,事件 响 应 ,消息 截获 在 我 们制 作 的 用 户 界 面 l{】很 多 时 候 会 辟j到 表 格 , j然 我 仃】 首 先 想 到 的是 用控 件 , 如 M S Flex G rid 我 ff】可 以 便 地 渊 用控 件 自身 的 函数 来 对 表格 中 的元 素 进 行 操 作 ,但 是 如 果 要 设计 一 个 可 以 编辑 的表 格 ,我 们该 怎 么办 呢 ? 事 实 这 种 可 编 辑 表 格 的应 用还 真 的不 少 ,主 要 是 其 用 户操 作 的 交 性 较 好 I 一 、 可 编 辑 表 格 的初 步 实 现 1.创 建新 类 C C trlE ditG rid 首 先 创 建 一 个 单 文 档 工 程 E d itG rid 接 着 在 工 程 中 加 人 M S FlexG rid 控 件 这 是 个 A ctiveX 控 件 , 选 择 A ddT oP roject 的 C om ponen ts an d C ontrols G allery 选项 可 加 人该 控 件 。 然后 以 M SF lexG rid 为 基 类 创 建 新 类 C C trlE ditG rid , ” 添 加 成员 函数 void InitG rid ( ) (该 函 数 日的 只是 空 的 ) 和 成 员 变 量 C E dit m _pE d it; C SpinB u tton C trJ m p SpinB u ttonC trt;以 后 表 格 的 实仆 类 就 是 该 类 。 2 .在 工 程 文件 的视 图类 中显 示 表 格 首 先 在 视 图类 C EditG ridV iew 中 添 力1I成 员变 革 CCtrlE dit— G rid m _ p C trlE d itG ri d .. 接 着 添 加 C E ditG ridV iew 的 消 息 相 应 函 数 O nC reale ,在 其 中创 建 表格 。 m _ pC trlE d itG rid = ne w C C trlE ditG rid ; m _ pC trlEditG rid 一>C reate (N U LL,W S.』:H ILD IW S_V ISIBLE, C R e ct (0 ,0 ,O ,O ),th is,lD _ E D IT G R lD ): m pC trlE d itG rid 一> ln itG rid ( ): 然 后 为 了 和 视 图 的 大 小 保 持 一 致 ,在 C E d itG ridV iew 的 消 息 相 应 函 数 O nS ize 中 添 加 代码 : .f(m _p C trlE ditG rid l = N U L L ) m _ pC trlE d itG rid 一>M o ve W in do w (O ,0 ,CX ,cy ): 3 .实 现 C C trlE ditG rid 的 InitG rid 的 函数 2 0 0 5 .5 簟 lnitG rid 完 成 表 格 的 属 性 设 置 , 表 格 仞 始 弈 的填 ,可 编 辑 控 什 的 创 建 这 里 的 叮编 辑 托 什 莹¨C E d i!,C C om boB ox . C Sp II1B utt0nC Ir1,C D ateT im eC trl⋯ ⋯ 仡 4 例 lf1只使 1L}{ C E d it 和 C S inB u ttonC trl 的 结 合 这 一 种 如 果表 格 小 同 列 之 问 的 编 辑 拧 什 不 『nJ , 序 中 口r 以 通 过 检 测 们J j ,来 决 定 使 用 什 么控 件 ,事 实 } 在 笔 者 的 项 日 lfl不 同 列 之 间 也 足 使 用 同 编辑 控 件 的 在 此 用 一 种 榨 件 来 说 明 表 格 编 牟};的 实 观方 法 .读 荇 想换 其 他 的 控 件 也 很 容 易 r v o id C C trlEd itG rid ::lnitG fi d () ( //设 置 行 数 ,列 数 S e tC o ls ( C O U N lT N U M B E R ): S etR o w s ( R 0 W lN IT N U M B E R ): //设 置 为 无 边 框 S e tB o rde rS ty le (O ) //设 置 为 可 以 改 变 行 高 列 宽 S e tA IIo w U se rR e s iz in g (3 ): //设 置 行 宽 列 宽 C D C :p D C = G e tD C ( ): S etR o w H eig htM in ( ( 1o n g ) ( R O W E IG H T_P IX E L 1 4 4 0 .0 / p D C 一>G e tD e v ice C a ps (L O G P IX E LS Y )) );//坐 标 单 位 要 转 换 fo r ( inti = O :i < C O LJ N IT N U M B E R ;i + + ) S etC o IW idth l i,l lo ng ) l C O L _ W ID T H IN D E X .P IX E L 1 4 4 0 .0 /p D C 一>G e tD e vic e C a ps (LO G P IX E LS X ) ) ): R e le as e D C (p D C ): //设 置 列 的 文 字 对 齐 方 式 fo r ( i = 0 :i < C 0 L lN IT N U M B E R : 4- 4- ) S etC o lA lig n m e nt ( i.4 ): //设 置 固 定 行 列 的 名 称 fo r ( i = 1:i < R O V v_JN lT N U M B E R :i + + ) { C S tring strN u m ; int n N u m = i: strN u m .F O rm at ( %d ,i): S etT e xtM a trix (i,O ,strN um ): } for ( i = 1;i < C O LJ N lT N U M B E R :i + + ) 维普资讯 http://www.cqvip.com 维普资讯 http://www.cqvip.com 实 用 繁 一 智 慧 舔 壤 一 化 专 譬 l i ≤ ¨ l t 1 6 .cy ,FA L S E ): m _p S p inB utto nC trl一>S h o w W ind o w (S W -S H O W ): ) 也 许 O nE n terC ell 事 件 可 以 替 代 O nC lick , 但 笔 者 发 现 用 O nE nterC ell 实 现 起 来 会 有 一 个 问 题 :必 须 快 速 的 点 击 ,否 则 编 辑 框 出 现 之 后 马 上 消 失 。所 以笔 者使 用 O nC lick 事 件 ,该 事 件 是 在 鼠标 U p 的 时 候 才 响 应 的 。 三 、 若 干 问题 的 出现 及 解 决 方 案 通 过 以上 的操 作 ,我 们 可 以在 表 格 中点 击 某 一 个 单 元 格 进 行 编辑 了 , 似乎 我 们 已经 实 现 了一 个 可 编 辑 表 格 的 制 作 。 但 在 随后 的测 试 过 程 中发 现 了如 下 讨 厌 的问 题 : a 、在 当 前 某 个 单 元 格 处 于 可 编 辑 状 态 而 我 们 试 图 改 变 列 宽 时 , 发现 在 单 元 格 上 的编 辑 控 件 的大 小 并 没 有 改 变 。如 下 图 所 示 一0 0 |l2 雾l \ s 0麓_\ 1 b 、在 当前 某 个 单 元 格 处 于 可 编 辑 状 态而 我 们 试 图移 动 滚 动 条 时 ,发现 在 单 元 格 上 的编 辑 控 件 的 光 标 随 之 移 动 到 了别 的 单元 格 。而 且 更 加 严 重 的是 若 点 击 前 单 元 格 部 分 显 示 ,点 击 后 再 移 动 滚 动条 发 现不 只是 光 标 移 动 还 有 控 件 本 身 也 移 动 到 了别 的 单元 格 中 。 如 下 图所 示 。 习『 1 i i 1 i i 1 1 i 1 1 l i 1 t t 1 1 【! 薯f 一 勇1 —— 习 1 t - j ~ C 、在 点 击 上 下 控 件 时 会 触 发 垂 直 滚 动 条 的 移 动 ,还 间 接 导致 b 问题 的发 生 。如 下 图所 示 。 ≥ \ j誊钵 t\ 也 \。 丛 与 J 1.a 问 题 的 解 决 首 先 想 到 的 是 在 M SD N 中 寻 找 M SF LE X G R ID 的 列 宽 改 变 的 响 应 事 件 ,很 失 望 没 找 到 。 但 发 现 可 以 采 取 以 下 措 施 :在 C E d itG ridV iew 中的 PreT ranslateM essage 消 息 响 应 函数 中 捕 捉 鼠 标 左键 是按 下状 态并 且 鼠标 移 动 的 消息 ,在 这 种 状 态 下 若 发 现 编 辑 控 件是 显 示 的 ,就 调 用 C C trlE d itG rid 的 O nleave 函 数 (开 放 为 P U B L IC ) 。 这 样 虽 然 在 改 变 列 宽 时 原来 的 编 辑 状 态 变 为 了 非 编 辑 状 态 ,但避 免 了 显示 上 不 同步 改 变 大小 的 问题 B O O L C E d itG rid V ie w :: P re T ran s late M e s sag e (M S G p M sg ) f -f ( ( p M sg 一>m e ss ag e = = W M — M O U S E M O V E ) & & ( p M sg 一>w P a ram & M I(_LB U T T O N ) ) { C W n d p W nd = Fro m H an d le ( p M sg 一>hw nd ): f ( pW nd 一>G e tR u ntim eC las s ( ) 一>ls D e rived - Fro m ( R U N T IM E L A S S ( C M S F Ie x G rid ) ) ) f .f ( m p C trlEd itG rid 一>m p E d it 一> lsW ind o w V is ible () ) m _pC td E d itG rid 一~ 3 n Le ave C e ll(): } } return C V ie w ::P reT ra ns late M e ssag e (p M sg ): } 2.b 问题 的解 决 首 先 想 到 的 依 然 是 在 M SD N 中 寻找 M S F LE X G R ID 的 列 宽 改 变 的 响 应 事 件 ,很 幸 运 找 到 了 。 在 C C trlE ditG rid 的 头 文 件 中 添 加 afx m sg void O nScroll (); 在 C C trlE d itG rid 的 C P P 文 件 的 事 件 映 射 表 中 添 加 O N _ E V E N T- E F L E C T fC T ask E ditG rid , 73 / Scroll 十/, O nScroll, V T S _ N O N E ) ,编 写 O nS croll 函数 体 : 若 单 元 格 处 于 编 辑 状 态 调 用 O nleave 函数 使 得 编辑 控 件 不 可 见 。 v o id C C trlEd itG rid ::O n S cro ll() f If ( !m p Ed it 一> lsW in d ow V isib le ( ) ) retu rn ; e ls e { O n Le av eC e ll(): } } 3 .c 问 题 的 解 决 该 问 题 的 关 键 是 上 下 控 件 的 V SC R O I I 事 件 干 扰 了 Flex— G ri d 的 滚 动 事 件 响 应 , 只要 杜 绝 l 下 控 件 的 V SC R O L L 消 息 不 就 行 了 吗 。我 们 只要 改 造 C Sp in B uttonC trl 的 鼠标 左 键 的响 应 函 数 就 可 以 阻 止 V SC R O L L 的 产 生 。 首 先 继 承 C S pinB u ttonC trl 产 生 新 类 C M yS pinB utt0nC tr1,把 一 一 一 ~ 维普资讯 http://www.cqvip.com 维普资讯 http://www.cqvip.com
还剩3页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

jjchuangda

贡献于2017-05-26

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf