?? visual c++ 50 編 程 經 驗.htm
字號:
<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->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);}</pre> <h3><font color="#A30004">如 何 在 應 用 程 序 中 不 加 載 菜 單、 工 具 條 和 狀 態 條</font></h3>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -