⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfc13.php

📁 php网页版的mfc教程 不是十分详细 但是很精练 我是新手不是十分会欣赏
💻 PHP
📖 第 1 页 / 共 5 页
字号:
  <P align=justify>ASSERT (!((dwStyle &amp; CBRS_SIZE_FIXED) &amp;&amp;</P>
  <P align=justify>(dwStyle &amp; CBRS_SIZE_DYNAMIC)));</P>
  <P align=justify></P>
  <P align=justify>// 保存dwStyle指定的CBRS_风格</P>
  <P align=justify>m_dwStyle = dwStyle;</P>
  <P align=justify>if (nID == AFX_IDW_TOOLBAR)</P>
  <P align=justify>m_dwStyle |= CBRS_HIDE_INPLACE;</P>
  <P align=justify></P>
  <P align=justify>//去掉参数dwStyle包含的CBRS_风格</P>
  <P align=justify>dwStyle &amp;= ~CBRS_ALL;</P>
  <P align=justify>//设置窗口风格</P>
  <P align=justify>dwStyle |= </P>
  <P align=justify>CCS_NOPARENTALIGN|CCS_NOMOVEY|CCS_NODIVIDER|CCS_NORESIZE;</P>
  <P align=justify></P>
  <P align=justify>//初始化通用控制,可以导致InitCommonControl的调用</P>
  <P align=justify>VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));</P>
  <P align=justify></P>
  <P align=justify>//创建窗口,将调用PreCreateWindow,OnCreate, OnNcCreate等</P>
  <P align=justify>CRect rect; rect.SetRectEmpty();</P>
  <P align=justify>if (!CWnd::Create(TOOLBARCLASSNAME, NULL, dwStyle, </P>
  <P align=justify>rect, pParentWnd, nID))</P>
  <P align=justify>return FALSE;</P>
  <P align=justify></P>
  <P align=justify>// Note: Parent must resize itself for control bar to be 
  resized</P>
  <P align=justify></P>
  <P align=justify>return TRUE;</P>
  <P align=justify>}</P>
  <P align=justify>其中:</P>
  <P align=justify>Create函数的参数1表示工具条的父窗口。参数2指定窗口风格和CBRS_风格,缺省值为 WS_CHILD | 
  WS_VISIBLE | 
  CBRS_TOP,其中WS_CHILD和WS_VISIBLE是窗口风格,CBRS_TOP是CBRS_风格。参数3指定工具条ID,缺省值为AFX_IDW_TOOLBAR(0X0E800或者59392)。如果还有多个工具栏要显示,在创建它们时则必须给每个工具栏指明ID。</P>
  <P 
  align=justify>首先,Create函数把参数2(dwStyle)指定的窗口风格和CBRS_风格分离出来,窗口风格保留在dwStyle中,CBRS_风格保存到成员变量m_dwStyle中。CToolBar::PreCreateWindow将进一步修改这些风格。</P>
  <P 
  align=justify>接着,Create函数调用了函数AfxDeferRegisterClass。它如果没有注册TOOLBARCLASSNAME表示的“窗口类”,就注册该类;否则,返回TRUE,表示已经注册。TOOLBARCLASSNAME表示的字符串是“ToolbarWindow32”,即“窗口类”名称。</P>
  <P align=justify>然后,调用CWnd::Create(7个参数)使用“ToolbarWindow32”“窗口类”创建工具栏。</P>
  <P 
  align=justify>Create在创建窗口的过程中,用MFC的标准窗口过程取代原来的窗口过程,如同CFormView和CDialog窗口创建时窗口过程被取代一样,并发送WM_CREATE和WM_NCCREATE消息。</P>
  <P 
  align=justify>至于添加向工具栏添加按钮,则由函数LoadToolBar完成。在分析LoadToolBar函数之前,先讨论OnCreate、OnNcCreate等函数。</P>
  <P align=justify></P>
  <LI>处理WM_CREATE消息 
  <P></P>
  <P align=justify>CControlBar提供了消息处理函数OnCreate来处理WM_CREATE消息。</P>
  <P align=justify>int CControlBar::OnCreate(LPCREATESTRUCT lpcs)</P>
  <P align=justify>{</P>
  <P align=justify>//调用基类的实现</P>
  <P align=justify>if (CWnd::OnCreate(lpcs) == -1)</P>
  <P align=justify>return -1;</P>
  <P align=justify>//针对工具栏,是否有Tooltip特性</P>
  <P align=justify>if (m_dwStyle &amp; CBRS_TOOLTIPS)</P>
  <P align=justify>EnableToolTips();</P>
  <P align=justify>//得到父窗口,并添加自身到其控制条列表中</P>
  <P align=justify>CFrameWnd *pFrameWnd = (CFrameWnd*)GetParent();</P>
  <P align=justify>if (pFrameWnd-&gt;IsFrameWnd())</P>
  <P align=justify>{</P>
  <P align=justify>m_pDockSite = pFrameWnd;</P>
  <P align=justify>m_pDockSite-&gt;AddControlBar(this);</P>
  <P align=justify>}</P>
  <P align=justify>return 0;</P>
  <P align=justify>}</P>
  <P align=justify>如果需要支持Tooltips,则OnCreate调用EnableTooltips。</P>
  <P 
  align=justify>m_pDockSite是CControlBar的和泊位相关的成员变量,这里把它初始化为拥有工具栏的父边框窗口,该边框窗口把控制条加入其控制条列表m_listControlBars中。</P>
  <P 
  align=justify>在处理WM_CREATE之前,派生类先处理消息WM_NCCREAE。例如,CToolBar覆盖了OnNcCreate函数。</P>
  <P align=justify></P>
  <LI>处理WM_NCCREATE消息 
  <P></P>
  <P align=justify>CToolBar对WM_NCCREATE消息的处理如下:</P>
  <P align=justify>BOOL CToolBar::OnNcCreate(LPCREATESTRUCT lpCreateStruct)</P>
  <P align=justify>{</P>
  <P align=justify>if (!CControlBar::OnNcCreate(lpCreateStruct))</P>
  <P align=justify>return FALSE;</P>
  <P align=justify>// if the owner was set before the toolbar was created, set 
  it now</P>
  <P align=justify>if (m_hWndOwner != NULL)</P>
  <P align=justify>DefWindowProc(TB_SETPARENT, (WPARAM)m_hWndOwner, 0);</P>
  <P align=justify></P>
  <P align=justify>DefWindowProc(TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 
  0);</P>
  <P align=justify>return TRUE;</P>
  <P align=justify>}</P>
  <P 
  align=justify>CToolBar覆盖CcontrolBar的该函数用来设置工具条的所属窗口和描述工具条按钮结构的大小,这两个动作都是通过给工具条窗口发送消息来实现的。因为这些消息被送给控制窗口类的窗口过程(Windows提供的)来处理,所以直接调用DefWindowProc,省却了消息发送的过程。</P>
  <P align=justify>在控制窗口创建之后,对于工具条来说,下一步就是向工具栏添加按钮。</P>
  <P align=justify></P>
  <LI>向工具栏添加按钮 
  <P></P>
  <P align=justify>通过函数LoadToolBar完成向工具栏添加按钮的任务,其实现如下:</P>
  <P align=justify>BOOL CToolBar::LoadToolBar(LPCTSTR lpszResourceName)</P>
  <P align=justify>{</P>
  <P align=justify>ASSERT_VALID(this);</P>
  <P align=justify>ASSERT(lpszResourceName != NULL);</P>
  <P align=justify></P>
  <P align=justify>//查找并确认按钮位图、字符串等资源的位置</P>
  <P align=justify>HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName, 
  RT_TOOLBAR);</P>
  <P align=justify>HRSRC hRsrc = ::FindResource(hInst, lpszResourceName, 
  RT_TOOLBAR);</P>
  <P align=justify>if (hRsrc == NULL)</P>
  <P align=justify>return FALSE;</P>
  <P align=justify></P>
  <P align=justify>//锁定资源</P>
  <P align=justify>HGLOBAL hGlobal = LoadResource(hInst, hRsrc);</P>
  <P align=justify>if (hGlobal == NULL)</P>
  <P align=justify>return FALSE;</P>
  <P align=justify></P>
  <P align=justify>CToolBarData* pData = 
  (CToolBarData*)LockResource(hGlobal);</P>
  <P align=justify>if (pData == NULL)</P>
  <P align=justify>return FALSE;</P>
  <P align=justify>ASSERT(pData-&gt;wVersion == 1);</P>
  <P align=justify></P>
  <P align=justify>//复制与各个位图对应的命令ID到数组pItem</P>
  <P align=justify>UINT* pItems = new UINT[pData-&gt;wItemCount];</P>
  <P align=justify>for (int i = 0; i &lt; pData-&gt;wItemCount; i++)</P>
  <P align=justify>pItems[i] = pData-&gt;items()[i];</P>
  <P align=justify>//添加按钮到工具栏,指定各个按钮对应的ID</P>
  <P align=justify>BOOL bResult = SetButtons(pItems, pData-&gt;wItemCount);</P>
  <P align=justify>delete[] pItems;</P>
  <P align=justify></P>
  <P align=justify>//设置按钮的位图</P>
  <P align=justify>if (bResult)</P>
  <P align=justify>{</P>
  <P align=justify>// set new sizes of the buttons</P>
  <P align=justify>CSize sizeimage(pData-&gt;wWidth, pData-&gt;wHeight);</P>
  <P align=justify>CSize sizeButton(pData-&gt;wWidth + 7, pData-&gt;wHeight + 
  7);</P>
  <P align=justify>SetSizes(sizeButton, sizeimage);</P>
  <P align=justify></P>
  <P align=justify>// load bitmap now that sizes are known by the toolbar 
  control</P>
  <P align=justify>bResult = LoadBitmap(lpszResourceName);</P>
  <P align=justify>}</P>
  <P align=justify></P>
  <P align=justify>UnlockResource(hGlobal);</P>
  <P align=justify>FreeResource(hGlobal);</P>
  <P align=justify></P>
  <P align=justify>return bResult;</P>
  <P align=justify>}</P>
  <P 
  align=justify>LoadToolBar函数的参数指定了资源。ToolBar资源的类型是RT_TOOLBAR,ToolBar位图资源的类型是RT_BITMAP。</P>
  <P 
  align=justify>在RT_TOOLBAR类型的资源读入内存之后,可以用CToolBarData结构描述。一个这样的结构包括了ToolBar资源的如下信息:</P>
  <P align=justify>工具条位图的版本,宽度,高度,个数,各个位图对应的命令ID。</P>
  <P 
  align=justify>然后,LoadToolBar把这些命令ID被复制到数组pItem中;根据位图宽度、高度形成按钮尺寸sizeButton和位图尺寸sizeimage。</P>
  <P 
  align=justify>接着,调用SetBottons添加按钮到工具栏,把各个按钮和命令ID对应起来;调用SetSizes设置按钮和位图的尺寸大小;调用LoadBitmap添加或者取代工具条的位图列表。这些动作都是调用工具栏“窗口类”的窗口过程完成的。例如,SetButtons的实现:</P>
  <P align=justify>BOOL CToolBar::SetButtons(const UINT* lpIDArray, int 
  nIDCount)</P>
  <P align=justify>{</P>
  <P align=justify>ASSERT_VALID(this);</P>
  <P align=justify>ASSERT(nIDCount &gt;= 1); // must be at least one of them</P>
  <P align=justify>ASSERT(lpIDArray == NULL ||</P>
  <P align=justify>AfxIsValidAddress(lpIDArray, sizeof(UINT) * nIDCount, 
  FALSE));</P>
  <P align=justify></P>
  <P align=justify>//首先,删除工具条中现有的按钮</P>
  <P align=justify>int nCount = (int)DefWindowProc(TB_BUTTONCOUNT, 0, 0);</P>
  <P align=justify>while (nCount--)</P>
  <P align=justify>VERIFY(DefWindowProc(TB_DELETEBUTTON, 0, 0));</P>
  <P align=justify></P>
  <P align=justify>if (lpIDArray != NULL)//命令ID数组非空</P>
  <P align=justify>{</P>
  <P align=justify>//添加新按钮</P>
  <P align=justify>TBBUTTON button; memset(&amp;button, 0, 
sizeof(TBBUTTON));</P>
  <P align=justify>int iimage = 0;</P>
  <P align=justify>for (int i = 0; i &lt; nIDCount; i++)</P>
  <P align=justify>{</P>
  <P align=justify>button.fsState = TBSTATE_ENABLED;</P>
  <P align=justify>if ((button.idCommand = *lpIDArray++) == 0)</P>
  <P align=justify>{</P>
  <P align=justify>//按钮之间分隔</P>
  <P align=justify>button.fsStyle = TBSTYLE_SEP;</P>
  <P align=justify>//按钮之间隔8个像素</P>
  <P align=justify>button.iBitmap = 8;</P>
  <P align=justify>}</P>
  <P align=justify>else</P>
  <P align=justify>{</P>
  <P align=justify>//有位图和命令ID的按钮</P>
  <P align=justify>button.fsStyle = TBSTYLE_BUTTON;</P>
  <P align=justify>button.iBitmap = iimage++;//设置位图索引</P>
  <P align=justify>}</P>
  <P align=justify>//添加按钮</P>
  <P align=justify>if (!DefWindowProc(TB_ADDBUTTONS, 1, 
(LPARAM)&amp;button))</P>
  <P align=justify>return FALSE;</P>
  <P align=justify>}</P>
  <P align=justify>}</P>
  <P align=justify>else//命令ID数组空,添加空按钮</P>
  <P align=justify>{</P>
  <P align=justify>TBBUTTON button; memset(&amp;button, 0, 
sizeof(TBBUTTON));</P>
  <P align=justify>button.fsState = TBSTATE_ENABLED;</P>
  <P align=justify>for (int i = 0; i &lt; nIDCount; i++)</P>
  <P align=justify>{</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -