?? vctip4.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="#tip25"><font SIZE="+0" FACE="Times New Roman">25</font><font SIZE="+0">、如何獲取有關窗口正在處理的當前消息的信息</font></a> </p><p><a HREF="#tip26"><font SIZE="+0" FACE="Times New Roman">26</font><font SIZE="+0">、如何創建一個不規則形狀的窗口</font></a> </p><p><a HREF="#tip27"><font SIZE="+0" FACE="Times New Roman">27</font><font SIZE="+0">、如何在代碼中獲取工具條和狀態條的指針</font></a> </p><p><a HREF="#tip28"><font SIZE="+0" FACE="Times New Roman">28</font><font SIZE="+0">、如何使能和禁止工具條的工具提示</font></a> </p><p><a HREF="#tip29"><font SIZE="+0" FACE="Times New Roman">29</font><font SIZE="+0">、如何設置工具條標題</font></a> </p><p><a HREF="#tip30"><font SIZE="+0" FACE="Times New Roman">30</font><font SIZE="+0">、如何創建和使用無模式對話框</font></a> </p><p><a HREF="#tip31"><font SIZE="+0" FACE="Times New Roman">31</font><font SIZE="+0">、如何在對話框中顯示一個位圖</font></a> </p><p><a HREF="#tip32"><font SIZE="+0" FACE="Times New Roman">32</font><font SIZE="+0">、如何改變對話或窗體視窗的背景顏色</font></a> </p><p><font SIZE="+2"><b> </b></font> </p><p><a NAME="tip25"></a><b><font SIZE="+2"><font FACE="Times New Roman">25</font><fontFACE="黑體">、如何獲取有關窗口正在處理的當前消息的信息</font></font></b> </p><p><font SIZE="+0">調用<font FACE="Times New Roman">CWnd: : GetCurrentMessage</font>可以獲取一個<fontFACE="Times New Roman">MSG</font>指針。例如,可以使用</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">ClassWizard</font>將幾個菜單項處理程序映射到一個函數中,然后調用<fontFACE="Times New Roman">GetCurrentMessage</font></font> </p><p><font SIZE="+0">來確定所選中的菜單項。</font> </p><p><font SIZE="+0" FACE="Times New Roman">viod CMainFrame : : OnCommmonMenuHandler ( )</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Display selected menu item in debug window .</font> </p><p><font SIZE="+0" FACE="Times New Roman">TRACE ("Menu item %u was selected . \n" ,</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">GetCruuentMessage ( ) </font>—<fontFACE="Times New Roman">> wParam );</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><a NAME="tip26"></a><b><font SIZE="+2"><font FACE="Times New Roman">26</font><fontFACE="黑體">、如何創建一個不規則形狀的窗口</font></font></b> </p><p><font SIZE="+0">可以使用新的<font FACE="Times New Roman">SDK</font>函數<fontFACE="Times New Roman">SetWindowRgn</font>。該函數將繪畫和鼠標消息限定在窗口的一</font> </p><p><font SIZE="+0">個指定的區域,實際上使窗口成為指定的不規則形狀。</font> </p><p><font SIZE="+0">使用<font FACE="Times New Roman">AppWizard</font>創建一個基于對的應用程序并使用資源編輯器從主對話資源中刪</font> </p><p><font SIZE="+0">除所在的缺省控件、標題以及邊界。</font> </p><p><font SIZE="+0">給對話類增加一個<font FACE="Times New Roman">CRgn</font>數據成員,以后要使用該數據成員建立窗口區域。</font> </p><p><font SIZE="+0" FACE="Times New Roman">Class CRoundDlg : public CDialog</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">private :</font> </p><p><font SIZE="+0" FACE="Times New Roman">Crgn m_rgn : // window region</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">} ;</font> </p><p><font SIZE="+0">修改<font FACE="Times New Roman">OnInitDialog</font>函數建立一個橢圓區域并調用<fontFACE="Times New Roman">SetWindowRgn</font>將該區域分配給</font> </p><p><font SIZE="+0">窗口:</font> </p><p><font SIZE="+0" FACE="Times New Roman">BOOL CRoundDlg : : OnInitDialog ( )</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">CDialog : : OnInitDialog ( ) ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Get size of dialog .</font> </p><p><font SIZE="+0" FACE="Times New Roman">CRect rcDialog ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">GetClientRect (rcDialog );</font> </p><p><font SIZE="+0" FACE="Times New Roman">// Create region and assign to window .</font> </p><p><font SIZE="+0" FACE="Times New Roman">m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width ( ) , rcDialog .Height ( ) );</font> </p><p><font SIZE="+0" FACE="Times New Roman">SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn , TRUE );</font> </p><p><font SIZE="+0" FACE="Times New Roman">return TRUE ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">通過建立區域和調用<font FACE="Times New Roman">SetWindowRgn</font>,已經建立一個不規則形狀的窗口,下面的例</font> </p><p><font SIZE="+0">子程序是修改<font FACE="Times New Roman">OnPaint</font>函數使窗口形狀看起來象一個球形體。</font> </p><p><font SIZE="+0" FACE="Times New Roman">voik CRoundDlg : : OnPaint ( )</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">CPaintDC de (this) ; // device context for painting .</font> </p><p><font SIZE="+0" FACE="Times New Roman">//draw ellipse with out any border</font> </p><p><font SIZE="+0" FACE="Times New Roman">dc. SelecStockObject (NULL_PEN);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//get the RGB colour components of the sphere color</font> </p><p><font SIZE="+0" FACE="Times New Roman">COLORREF color= RGB( 0 , 0 , 255);</font> </p><p><font SIZE="+0" FACE="Times New Roman">BYTE byRed =GetRValue (color);</font> </p><p><font SIZE="+0" FACE="Times New Roman">BYTE byGreen = GetGValue (color);</font> </p><p><font SIZE="+0" FACE="Times New Roman">BYTE byBlue = GetBValue (color);</font> </p><p><font SIZE="+0" FACE="Times New Roman">// get the size of the view window</font> </p><p><font SIZE="+0" FACE="Times New Roman">Crect rect ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">GetClientRect (rect);</font> </p><p><font SIZE="+0" FACE="Times New Roman">// get minimun number of units</font> </p><p><font SIZE="+0" FACE="Times New Roman">int nUnits =min (rect.right , rect.bottom );</font> </p><p><font SIZE="+0" FACE="Times New Roman">//calculate he horiaontal and vertical step size</font> </p><p><font SIZE="+0" FACE="Times New Roman">float fltStepHorz = (float) rect.right /nUnits ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">float fltStepVert = (float) rect.bottom /nUnits ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">int nEllipse = nUnits/3; // calculate how many to draw</font> </p><p><font SIZE="+0" FACE="Times New Roman">int nIndex ; // current ellipse that is being draw</font> </p><p><font SIZE="+0" FACE="Times New Roman">CBrush brush ; // bursh used for ellipse fill color</font> </p><p><font SIZE="+0" FACE="Times New Roman">CBrush *pBrushOld; // previous brush that was selected into dc</font> </p><p><font SIZE="+0" FACE="Times New Roman">//draw ellipse , gradually moving towards upper-right corner</font> </p><p><font SIZE="+0" FACE="Times New Roman">for (nIndex = 0 ; nIndes < + nEllipse ; nIndes ++)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//creat solid brush</font> </p><p><font SIZE="+0" FACE="Times New Roman">brush . CreatSolidBrush (RGB ( ( (nIndex *byRed ) /nEllipse ).</font> </p><p><font SIZE="+0" FACE="Times New Roman">( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) /nEllipse ) ) );</font> </p><p><font SIZE="+0" FACE="Times New Roman">//select brush into dc</font> </p><p><font SIZE="+0" FACE="Times New Roman">pBrushOld= dc .SelectObject (&brhsh);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//draw ellipse</font> </p><p><font SIZE="+0" FACE="Times New Roman">dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,</font> </p><p><font SIZE="+0" FACE="Times New Roman">rect. right -( (int) fltStepHorz * nIndex )+ 1,</font> </p><p><font SIZE="+0" FACE="Times New Roman">rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">//delete the brush</font> </p><p><font SIZE="+0" FACE="Times New Roman">brush.DelecteObject ( );</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">最后,處理<font FACE="Times New Roman">WM_NCHITTEST</font>消息,使當擊打窗口的任何位置時能移動窗口。</font> </p><p><font SIZE="+0" FACE="Times New Roman">UINT CRoundDlg : : OnNchitTest (Cpoint point )</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Let user move window by clickign anywhere on the window .</font> </p><p><font SIZE="+0" FACE="Times New Roman">UINT nHitTest = CDialog : : OnNcHitTest (point) ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><a NAME="tip27"></a><b><font SIZE="+2"><font FACE="Times New Roman">27</font><fontFACE="黑體">、如何在代碼中獲取工具條和狀態條的指針</font></font></b> </p><p><font SIZE="+0">缺省時, 工作框創建狀態條和工具條時將它們作為主框窗口的子窗口,狀態條</font> </p><p><font SIZE="+0">有一個<font FACE="Times New Roman">AFX_IDW_STATUS_BAR</font>標識符,工具條有一個<fontFACE="Times New Roman">AFX_IDW_TOOLBAR</font>標識符,下例說</font> </p><p><font SIZE="+0">明了如何通過一起調用<font FACE="Times New Roman">CWnd: : GetDescendantWindow</font>和<font FACE="Times New Roman">AfxGetMainWnd</font>來獲取這些</font> </p><p><font SIZE="+0">子窗口的指針:</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Get pointer to status bar .</font> </p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -