?? vctip8.html
字號:
<html><head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"><meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0"><meta NAME="doccomm" CONTENT="sss"><meta NAME="Template" CONTENT="C:\MSOffice\Template\Sl_BOOK.dot"><meta NAME="Author" CONTENT="Cheng Jinxing"><title>Visual C++編程技巧之八</title></head><body TEXT="#000000" BGCOLOR="#CCFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"><p align="center"><br><font SIZE="+3" FACE="楷體_GB2312">Visual C++編程技巧之八</font> </p><p><a HREF="#tip57"><font SIZE="+0" FACE="Times New Roman">57</font><font SIZE="+0">、為什么即使調用</font><fontSIZE="+0" FACE="Times New Roman">EnableMenuItem</font><font SIZE="+0">菜單項后,菜單項還處于禁止狀態</font></a> </p><p><a HREF="#tip58"><font SIZE="+0" FACE="Times New Roman">58</font><font SIZE="+0">、如何給系統菜單添加一個菜單項</font></a> </p><p><a HREF="#tip59"><font SIZE="+0" FACE="Times New Roman">59</font><font SIZE="+0">、如何確定頂層菜單所占據的菜單行數</font></a> </p><p><a HREF="#tip60"><font SIZE="+0" FACE="Times New Roman">60</font><font SIZE="+0">、在用戶環境中如何確定系統顯示元素的顏色</font></a> </p><p><a HREF="#tip61"><font SIZE="+0" FACE="Times New Roman">61</font><font SIZE="+0">、如何查詢和設置系統參數</font></a> </p><p><a HREF="#tip62"><font SIZE="+0" FACE="Times New Roman">62</font><font SIZE="+0">、如何使用一個預定義的</font><fontSIZE="+0" FACE="Times New Roman">Windows</font><font SIZE="+0">光標</font></a> </p><p><a HREF="#tip63"><font SIZE="+0" FACE="Times New Roman">63</font><font SIZE="+0">、如何確定當前屏幕分辨率</font></a> </p><p><a HREF="#tip64"><font SIZE="+0" FACE="Times New Roman">64</font><font SIZE="+0">、如何檢索原先的</font><fontSIZE="+0" FACE="Times New Roman">Task Manager</font><font SIZE="+0">應用程序使用的任務列表</font></a> </p><p><a HREF="#tip65"><font SIZE="+0" FACE="Times New Roman">65</font><font SIZE="+0">、如何確定</font><fontSIZE="+0" FACE="Times New Roman">Windows</font><font SIZE="+0">和</font><font SIZE="+0"FACE="Times New Roman">Windows</font><font SIZE="+0">系統目錄</font></a> </p><p><a HREF="#tip66"><font SIZE="+0" FACE="Times New Roman">66</font><font SIZE="+0">、在哪兒創建臨文件</font></a> </p><p><a HREF="#tip67"><font SIZE="+0" FACE="Times New Roman">67</font><font SIZE="+0">、如何訪問桌面窗口</font></a> </p><p><font SIZE="+2"><b> </b></font> </p><p><a NAME="tip57"></a><b><font SIZE="+2"><font FACE="Times New Roman">57</font><fontFACE="黑體">、為什么即使調用</font><font FACE="Times New Roman">EnableMenuItem</font><fontFACE="黑體">菜單項后,菜單項還處于禁止狀態</font></font></b> </p><p><font SIZE="+0">需要將<font FACE="Times New Roman">CFrameWnd:: m_bAutomenuEnable</font>設置為<fontFACE="Times New Roman">FALSE</font>,如果該數據成員為<font FACE="Times New Roman">TRUE</font>(缺省值),工作框將自動地禁止沒有<fontFACE="Times New Roman">ON_UPDATE_COMMAND_UI</font>或者<font FACE="Times New Roman">ON_COMMAND</font>的菜單項。</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Disable MFC from automatically disabling menu items.</font> </p><p><font SIZE="+0" FACE="Times New Roman">m_bAuoMenuEnable=FALSE;</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Now enable the menu item.</font> </p><p><font SIZE="+0" FACE="Times New Roman">CMenu* pMenu=GetMenu ();</font> </p><p><font SIZE="+0" FACE="Times New Roman">ASSERT_VALID (pMenu);</font> </p><p><font SIZE="+0" FACE="Times New Roman">pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED);</font> </p><p><a NAME="tip58"></a><b><font SIZE="+2"><font FACE="Times New Roman">58</font><fontFACE="黑體">、如何給系統菜單添加一個菜單項</font></font></b> </p><p><font SIZE="+0">給系統菜單添加一個菜單項需要進行下述三個步驟:</font> </p><p><font SIZE="+0">首先,使用<font FACE="Times New Roman">Resource Symbols</font>對話(在<fontFACE="Times New Roman">View</font>菜單中選擇<font FACE="Times New Roman">Resource Symbols</font>...</font> </p><p><font SIZE="+0">可以顯示該對話)定義菜單項<font FACE="Times New Roman">ID</font>,該<fontFACE="Times New Roman">ID</font>應大于<font FACE="Times New Roman">0x0F</font>而小于<fontFACE="Times New Roman">0xF000</font>;</font> </p><p><font SIZE="+0">其次,調用<font FACE="Times New Roman">CWnd::GetSystemMenu</font>獲取系統菜單的指針并調用<fontFACE="Times New Roman">CWnd:: Appendmenu</font>將菜單項添加到菜單中。下例給系統菜單添加兩個新的菜單項:</font> </p><p><font SIZE="+0" FACE="Times New Roman">int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Make sure system menu item is in the right range.</font> </p><p><font SIZE="+0" FACE="Times New Roman">ASSERT (IDM_MYSYSITEM &0xFFF0)==IDM_MYSYSITEM);</font> </p><p><font SIZE="+0" FACE="Times New Roman">ASSERT (IDM-MYSYSITEM<0xF000);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Get pointer to system menu.</font> </p><p><font SIZE="+0" FACE="Times New Roman">CMenu* pSysmenu=GetSystemmenu (FALSE);</font> </p><p><font SIZE="+0" FACE="Times New Roman">ASSERT_VALID (pSysMenu);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Add a separator and our menu item to system menu.</font> </p><p><font SIZE="+0" FACE="Times New Roman">CString StrMenuItem (_T ("New menu item"));</font> </p><p><font SIZE="+0" FACE="Times New Roman">pSysMenu->Appendmenu (MF_SEPARATOR);</font> </p><p><font SIZE="+0" FACE="Times New Roman">pSysMenu->AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem);</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">現在,選擇系統菜單項時用戶應進行檢測。使用<fontFACE="Times New Roman">ClassWizard</font>處理</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">WM_SYSCOMMAND</font>消息并檢測用戶菜單的<fontFACE="Times New Roman">nID</font>參數:</font> </p><p><font SIZE="+0" FACE="Times New Roman">void CMainFrame:: OnSysCommand (UINT nID,LPARAM lParam)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Determine if our system menu item was selected.</font> </p><p><font SIZE="+0" FACE="Times New Roman">if ( (nID & 0xFFF0)==IDM_MYSYSITEM)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//TODO-process system menu item</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0" FACE="Times New Roman">else</font> </p><p><font SIZE="+0" FACE="Times New Roman">CMDIFrameWnd:: OnSysCommand (nID, lParam);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">最后,一個設計良好的<font FACE="Times New Roman">UI</font>應用程序應當在系統菜單項加亮時在狀態條顯示一個幫助信息,這可以通過增加一個包含系統菜單基<fontFACE="Times New Roman">ID</font>的串表的入口來實現。</font> </p><p><a NAME="tip59"></a><b><font SIZE="+2"><font FACE="Times New Roman">59</font><fontFACE="黑體">、如何確定頂層菜單所占據的菜單行數</font></font></b> </p><p><font SIZE="+0">這可以通過簡單的減法和除法來實現。首先,用戶需要計算主框窗口的高度和客戶區;其次,從主框窗口的高度中減去客戶區、框邊界以及標題的高度;最后,除以菜單欄的高度。下例成員函數是一個計算主框菜單所占據的行數的代碼實現。</font> </p><p><font SIZE="+0" FACE="Times New Roman">int CMainFrame:: GetMenuRows ()</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">CRect rcFrame,rcClient;</font> </p><p><font SIZE="+0" FACE="Times New Roman">GetWindowRect (rcFrame);</font> </p><p><font SIZE="+0" FACE="Times New Roman">GetClientRect (rcClient);</font> </p><p><font SIZE="+0" FACE="Times New Roman">return (rcFrame.Height () -rcClient.Height ()-</font> </p><p><font SIZE="+0" FACE="Times New Roman">:: GetSystemMetrics (SM_CYCAPTION) -</font> </p><p><font SIZE="+0" FACE="Times New Roman">(:: getSystemMetrics (SM_CYFRAME) *2)) /</font> </p><p><font SIZE="+0" FACE="Times New Roman">:: GetSystemMetrics (SM_CYMENU);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><a NAME="tip60"></a><b><font SIZE="+2"><font FACE="Times New Roman">60</font><fontFACE="黑體">、在用戶環境中如何確定系統顯示元素的顏色</font></font></b> </p><p><font SIZE="+0">調用<font FACE="Times New Roman">SDK</font>函數<fontFACE="Times New Roman">GetSysColor</font>可以獲取一個特定顯示元素的顏色。下例說明了如何在<fontFACE="Times New Roman">MFC</font>函數<font FACE="Times New Roman">CMainFrameWnd:: OnNcPaint</font>中調用該函數設置窗口標題顏色。</font> </p><p><font SIZE="+0" FACE="Times New Roman">void CMiniFrameWnd:: OnNcPaint ()</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">dc.SetTextColor (:: GetSysColor (m_bActive ?</font> </p><p><font SIZE="+0" FACE="Times New Roman">COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT));</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><a NAME="tip61"></a><b><font SIZE="+2"><font FACE="Times New Roman">61</font><fontFACE="黑體">、如何查詢和設置系統參數</font></font></b> </p><p><font SIZE="+0">在<font FACE="Times New Roman">Windows 3.1 SDK</font>中介紹過<fontFACE="Times New Roman">SDK</font>函數<font FACE="Times New Roman">SystemParametersInfo</font>,調用該函數可以查詢和設置系統參數,諸如按鍵的重復速率設置、鼠標雙擊延遲時間、圖標字體以及桌面覆蓋位圖等等。</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Create a font that is used for icon titles.</font> </p><p><font SIZE="+0" FACE="Times New Roman">LOGFONT stFont;</font> </p><p><font SIZE="+0" FACE="Times New Roman">:: SystemParametersInfo (SPIF_GETICONTITLELOGFONT,</font> </p><p><font SIZE="+0" FACE="Times New Roman">sizeof (LOGFONT), &stFont, SPIF_SENDWININICHANGE);</font> </p><p><font SIZE="+0" FACE="Times New Roman">m_font.CreateFontIndirect (&stFont);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Change the wallpaper to leaves.bmp.</font> </p><p><font SIZE="+0" FACE="Times New Roman">:: SystemParametersInfo (SPI_SETDESKWALLPAPER, 0,</font> </p><p><font SIZE="+0" FACE="Times New Roman">_T (" forest.bmp"), SPIF_UPDATEINIFILE);</font> </p><p><a NAME="tip62"></a><b><font SIZE="+2"><font FACE="Times New Roman">62</font><fontFACE="黑體">、如何使用一個預定義的</font><font FACE="Times New Roman">Windows</font><fontFACE="黑體">光標</font></font></b> </p><p><font SIZE="+0">調用<font FACE="Times New Roman">CWinApp:: LoadStandardCursor</font>并傳送光標標識符。</font> </p><p><font SIZE="+0" FACE="Times New Roman">BOOL CSampleDialog:: OnSetCursor (CWnd* pWnd, UINT nHitTest, UINT message)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -