SDI 中的StatusBar 状态指示器()

来源:互联网 发布:mc网络歌手招聘 编辑:程序博客网 时间:2024/05/29 09:18

SDI单文档中 

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

..............

if (!m_wndStatusBar.Create(this) ||
  !m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
 {
  TRACE0("Failed to create status bar\n");
  return -1;      // fail to create
 }

...........

}

上述代码产生一个状态条,并设定指示器的ID,

...........

BOOL CStatusBar::SetIndicators(const UINT* lpIDArray, int nIDCount)
{
 ASSERT_VALID(this);
 ASSERT(nIDCount >= 1);  // must be at least one of them
 ASSERT(lpIDArray == NULL ||
  AfxIsValidAddress(lpIDArray, sizeof(UINT) * nIDCount, FALSE));
 ASSERT(::IsWindow(m_hWnd));

 // first allocate array for panes and copy initial data
 if (!AllocElements(nIDCount, sizeof(AFX_STATUSPANE)))
  return FALSE;
 ASSERT(nIDCount == m_nCount);

 // copy initial data from indicator array
 BOOL bResult = TRUE;
 if (lpIDArray != NULL)
 {
  HFONT hFont = (HFONT)SendMessage(WM_GETFONT);
  CClientDC dcScreen(NULL);
  HGDIOBJ hOldFont = NULL;
  if (hFont != NULL)
   hOldFont = dcScreen.SelectObject(hFont);

  AFX_STATUSPANE* pSBP = _GetPanePtr(0);
  for (int i = 0; i < nIDCount; i++)
  {
   pSBP->nID = *lpIDArray++;
   pSBP->nFlags |= SBPF_UPDATE;
   if (pSBP->nID != 0)
   {
    if (!pSBP->strText.LoadString(pSBP->nID))
    {
     TRACE1("Warning: failed to load indicator string 0x%04X.\n",
      pSBP->nID);
     bResult = FALSE;
     break;
    }
    pSBP->cxText = dcScreen.GetTextExtent(pSBP->strText).cx;
    ASSERT(pSBP->cxText >= 0);
    if (!SetPaneText(i, pSBP->strText, FALSE))
    {
     bResult = FALSE;
     break;
    }
   }
   else
   {
    // no indicator (must access via index)
    // default to 1/4 the screen width (first pane is stretchy)
    pSBP->cxText = ::GetSystemMetrics(SM_CXSCREEN)/4;
    if (i == 0)
     pSBP->nStyle |= (SBPS_STRETCH | SBPS_NOBORDERS);
   }
   ++pSBP;
  }
  if (hOldFont != NULL)
   dcScreen.SelectObject(hOldFont);
 }
 UpdateAllPanes(TRUE, TRUE);

 return bResult;
}

//给状态栏设定相应的文本.和ID

.....................

在WINFRM.CPP文件中 可以看到这

 ON_UPDATE_COMMAND_UI(ID_INDICATOR_CAPS, OnUpdateKeyIndicator)
 ON_UPDATE_COMMAND_UI(ID_INDICATOR_NUM, OnUpdateKeyIndicator)
 ON_UPDATE_COMMAND_UI(ID_INDICATOR_SCRL, OnUpdateKeyIndicator)
 ON_UPDATE_COMMAND_UI(ID_INDICATOR_KANA, OnUpdateKeyIndicator)

再看其响应函数

void CFrameWnd::OnUpdateKeyIndicator(CCmdUI* pCmdUI)
{
 UINT nVK;
 UINT flag = 0x0001;

 switch (pCmdUI->m_nID)
 {
 case ID_INDICATOR_CAPS:
  nVK = VK_CAPITAL;
  break;

 case ID_INDICATOR_NUM:
  nVK = VK_NUMLOCK;
  break;

 case ID_INDICATOR_SCRL:
  nVK = VK_SCROLL;
  break;

 case ID_INDICATOR_KANA:
  nVK = VK_KANA;
  // WINBUG: Special case for Windows 3.x.  The wrong bit was toggled
  // in those systems so this must be special cased.  This is fixed
  // on systems whose version is 4.x or greater.
  if (!afxData.bWin4)
   flag = 0x8000;
  break;

 default:
  TRACE1("Warning: OnUpdateKeyIndicator - unknown indicator 0x%04X.\n",
   pCmdUI->m_nID);
  pCmdUI->ContinueRouting();
  return; // not for us
 }

 pCmdUI->Enable(::GetKeyState(nVK) & flag);
  // enable static text based on toggled key state
 ASSERT(pCmdUI->m_bEnableChanged);
}

 

 

 

原创粉丝点击