荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: 如 何 把 多 于256 色 的 位 图 作 为 资 源 加 入 ?
发信站: 荔园晨风BBS站 (Wed Jun  6 07:20:00 2001), 转信

---- 曾 经 使 用 过Visual C++ 进 行 应 用 程 序 开 发 的 同 行 们 都 知 道,

Visual C++ 5.0 以 前 版 本 中 自 带 的 位 图 编 辑 器 不 能 浏 览 和 编 辑25

6 色 以 上 的 位 图, 并 且 资 源 文 件 中 也 不 允 许 嵌 入(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 色 以 上 的 位 图

 作 为 位 图 按 钮 的 资 源, 并 也 希 望 达 到 上 述 四 状 态 的 相 互 切 换

 的 话, 就 必 须 用 到 下 述 的 函 数 和 程 序 设 计 参 考 模 型。

设 置 四 个 常 量,BUTTON_UP,BUTTON_DOWN,BUTTON_FOCUS,BUTTON_DISABLE, 分

 别 用 于 标 识 各 按 钮 的 当 前 状 态。

在 应 用 程 序 的 相 应 对 话 框 类 中 为 每 个 位 图 按 钮( 为 下 面 叙 述

方 便, 不 妨 假 设 为 两 个) 设 置 一 个CRect 类 的 对 象,m_rect1 和m_rect

2, 来 记 载 各 按 钮 在 对 话 框 中 所 占 据 的 坐 标 矩 形。 再 在 该 对 话

 框 类 中 为 每 个 按 钮 设 置 一 个 整 型 变 量,Buton1_Status,Button2_Sta

tus, 记 录 各 按 钮 的 当 前 状 态。 然 后 在 对 话 框 的 构 造 函 数 中 初

 始 化 这 些CRect 类 的 对 象 和 整 型 变 量。

在 该 对 话 框 类 中 创 建 分 别 响 应 鼠 标 各 种 状 态 的 消 息 处 理 函 数

, 如OnMouseMove(),OnLButtonUp(),OnLButtonDown() 等。

同 时 按 下Ctrl 和W 键 或 直 接 单 击 工 具 条 上 的ClassWizard 按 钮, 打 开

ClassWizard 对 话 框。 在 类 名(Class name) 列 表 框 中 选 择 对 话 框 类,

在Object IDs 列 表 框 中 选 择 该 类 的 类 名 后, 在 消 息(Messages) 列 表

框 中 选 择WM_PAINT 消 息 并 双 击 它, 这 时ClassWizard 就 会 在 该 对 话 框

 类 中 加 入 一 个OnPaint() 函 数。 该 函 数 将 在 我 们 的 程 序 中 起 重 要

 作 用。 之 后, 再 在Object IDs 列 表 框 中 选 择 新 加 入 的 工 具 条 按 钮

 的 标 识 名, 双 击 消 息 列 表 框 中 的COMMAND 消 息,ClassWizard 又 会 在

 对 话 框 类 中 加 入 相 应 的 消 息 处 理 函 数。 关 闭ClassWizard 对 话 框



---- 下 面 给 出 部 分 程 序 代 码, 仅 供 参 考。
void CTESTDlg::OnPaint()
{
 CWnd* pWnd;
 CDC* pDC;
 CDC* pDisplayMemDC;
 CBitmap* pBitmap;
 pWnd=GetDlgItem(IDC_IMAGE1);//得到指向第一个位图按钮的指针
 pDC=pWnd->GetDC();//获得一个窗口设备用于画图
 pWnd->Invalidate();//使窗口无效,从而更新它
 pWnd->UpdateWindow();
 pDisplayMemDC=new CDC;
 pBitmap=new CBitmap;
 pDisplayMemDC->CreateCompatibleDC(pDC);
 if (Change1) {//说明第一个按钮的状态发生了变化
 switch (Button1_Status){
 case BUTTON_DISABLE:
  pBitmap->LoadBitmap(IMAGE1_DISABLE);//装入位图
  pDisplayMemDC->SelectObject(pBitmap);
  pDC->BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);
              //把位图拷贝到指定区域
  break;
 case BUTTON_UP:
  pBitmap->LoadBitmap(IMAGE1_UP);
  pDisplayMemDC->SelectObject(pBitmap);
  pDC->BitBlt(0,0,140,30,pDisplayMemDC, 0,0,SRCCOPY);
  break;
 case BUTTON_FOCUS:
  pBitmap->LoadBitmap(IMAGE1_FOCUS);
  pDisplayMemDC->SelectObject(pBitmap);
  pDC->BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);
  break;
 case BUTTON_DOWN:
  pBitmap->LoadBitmap(IMAGE1_DOWN);
  pDisplayMemDC->SelectObject(pBitmap);
  pDC->BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);
  break;
 }
 }
 delete pDisplayMemDC;
 delete pBitmap;
 pWnd=GetDlgItem(IDC_IMAGE2);
 pDC=pWnd->GetDC();
 pWnd->Invalidate();
 pWnd->UpdateWindow();
 pDisplayMemDC=new CDC;
 pBitmap=new CBitmap;
 pDisplayMemDC->CreateCompatibleDC(pDC);
 if (Change2) {//说明第二个按钮的状态发生了变化
 switch (Button2_Status){
 case BUTTON_DISABLE:
  pBitmap->LoadBitmap(IMAGE2_DISABLE);
  pDisplayMemDC->SelectObject(pBitmap);
  pDC->BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);
  break;
 case BUTTON_UP:
  pBitmap->LoadBitmap(IMAGE2_UP);
  pDisplayMemDC->SelectObject(pBitmap);
  pDC->BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);
  break;
 case BUTTON_FOCUS:
  pBitmap->LoadBitmap(IMAGE2_FOCUS);
  pDisplayMemDC->SelectObject(pBitmap);
  pDC->BitBlt(0,0,140,30,pDisplayMemDC,0,0,SRCCOPY);
  break;
 case BUTTON_DOWN:
  pBitmap->LoadBitmap(IMAGE2_DOWN);
  pDisplayMemDC->SelectObject(pBitmap);
  pDC->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)
            && (Button1_Status!=BUTTON_DISABLE) ) {
//如果位图按钮的当前状态不是输入焦点状态并且也不是禁止状态
 Button1_Status= BUTTON_FOCUS;
   Change1=true;
   InvalidateRect(rect,FALSE);
  }
  if ( (Button2_Status!=BUTTON_UP) &&
            (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)
            && (Button2_Status!=BUTTON_DISABLE) ) {
   Button2_Status= BUTTON_FOCUS;
   Change2=true;
   InvalidateRect(rect,FALSE);
  }
  if ( (Button1_Status!=BUTTON_UP)
          && (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)
           && (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)
           && (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)
             && (Button1_Status!=BUTTON_DISABLE) ) {
   Button1_Status=BUTTON_DOWN;
   Change1=true;
   InvalidateRect(rect,FALSE);
  }
  if ( (Button2_Status!=BUTTON_UP)
           && (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)
             && (Button2_Status!=BUTTON_DISABLE) ) {
   Button2_Status=BUTTON_DOWN;
   Change2=true;
   InvalidateRect(rect,FALSE);
  }
  if ( (Button1_Status!=BUTTON_UP)
            && (Button1_Status!=BUTTON_DISABLE) ) {
   Button1_Status=BUTTON_UP;
   Change1=true;
   InvalidateRect(rect,FALSE);
  }
 }
 }
 CDialog::OnLButtonDown(nFlags, point);
}

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店