1. 程式人生 > 實用技巧 >給應用程式視窗的滾動條著色

給應用程式視窗的滾動條著色

介紹 這是我早在2001年就發表的一篇關於給視窗的滾動條上色的文章的更新。很抱歉,我花了5年時間才回過頭來,同時更新了CodeProject上的這篇文章。在接下來的幾天裡,我計劃在這個網站上再上傳一些關於不同主題的文章。 我正在尋找一種技術,使我的應用程式的視窗的滾動條著色,使UI的外觀更吸引人一點,特別是我在vc++開發的UI。如你所知,要在MFC中完成任何事情,你需要做很多事情。但是,畢竟,我們可以在網際網路上找到大量的資源來幫助我們做任何我們想做的事情。這就是我所做的,以使這篇文章非常接近初學者vc++開發人員。我將向您展示如何將滾動條靜態地附加到應用程式的主視窗上,以及更有趣的是,如何給它著色。 背景(技術細節) 根據MSDN,滾動條可以讓使用者選擇在相關視窗中滾動資訊的方向和距離。滾動條有兩種型別:水平的和垂直的。現在,讓我介紹一下滾動條的組成部分。如果我們拿起一個標準的垂直滾動條,它有: 頂部的箭頭按鈕,底部的箭頭按鈕,滾動框[也稱為滾動塊],滾動塊浮動的區域 準確地說,本文將向您展示如何為滾動條的第四個專案著色,即滾動區域,僅此而已。 使用的程式碼 朋友們,我們將把滾動條附加到SDI應用程式的主視窗框架上,然後我們將看到如何給下襬著色。我希望以教程的樣式展示本文的其餘部分,以便您能夠清楚地瞭解概念,然後給出一個提示,您還可以為MDI應用程式的子視窗的滾動條著色。 # 1 開發一個單文件介面的MFC應用程式。如您所願,為專案指定一個非常好的名稱,並接受AppWizard其餘部分的所有預設選項,然後單擊Finish。在從AppWizard獲得框架程式碼之後,您將在框架類中新增一些型別為CScrollBar的變數。這可以手動完成,如下所示。 隱藏,複製Code

class CMainFrame : public CFrameWnd   
{ 
  private:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~> 

   CScrollBar myHScroll; 
   CScrollBar myVScroll; 
   CScrollBar myCutebox;
   CBrush m_brColor;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>

  ...
  ...
};

# 2 現在,在框架視窗類的OnCreate()處理程式中建立框架之後,像往常一樣建立滾動條: 隱藏,複製Code

int
CMainFrame::OnCreate(...)
{ // code edited by the wizards by default ...... ...... ...... //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~> CRect rect(0,0,0,0); myHScroll.Create(WS_VISIBLE|WS_CHILD|SBS_HORZ, rect, this, AFX_IDW_HSCROLL_FIRST); myVScroll.Create(WS_VISIBLE|WS_CHILD|SBS_VERT, rect, this
, AFX_IDW_HSCROLL_FIRST+1); myCutebox.Create(WS_VISIBLE|WS_CHILD|SBS_SIZEBOX, rect, this,-1); m_brColor.CreateSolidBrush(RGB(255,0,0)); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~> return 0; }

正如您在上面的程式碼塊中看到的,您還必須建立一個滾動條框。這個框只是一個小可愛的視窗,位於水平和垂直滾動條相遇的地方。 # 3 在調整視窗大小時,還必須編寫程式碼來不斷調整滾動條的大小。這是在重寫虛擬函式RecalcLayout(..)中完成的,如下所示: 隱藏,收縮,複製Code

void CMainFrame::RecalcLayout(BOOL bNotify)  
{ 
// must call the base class version before working with any child. 

   CFrameWnd::RecalcLayout(); 
   
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>

   CColorizedScrollsView* pView = (CColorizedScrollsView*)GetActiveView(); 
   if (pView)
   { 
    CRect rect; 
    pView->GetWindowRect(&rect); 
    ScreenToClient(&rect); 
    int cyHScroll = GetSystemMetrics(SM_CYHSCROLL); 
    int cxVScroll = GetSystemMetrics(SM_CXVSCROLL); 
    rect.right -= cxVScroll; 
    rect.bottom -= cyHScroll; 
    pView->MoveWindow(rect);
    rect.left = rect.right; 
    rect.right += cxVScroll; 
    myVScroll.MoveWindow(rect); 
    rect.left = 0; 
    rect.right -= cxVScroll; 
    rect.top = rect.bottom; 
    rect.bottom += cyHScroll; 
    myHScroll.MoveWindow(rect); 
    rect.left = rect.right; 
    rect.right +=cxVScroll; 
    myCuteBox.MoveWindow(rect); 
   }// if 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>

}

# 4 最後,實際的步驟是把顏色放入滾動區域。因為這隻能通過處理WM_CTLCOLOR視窗訊息來完成,顏色通知由每個子視窗傳送到父視窗。這裡是: 隱藏,複製Code

HBRUSH CMainFrame::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)       
{ 
   HBRUSH hbr = CFrameWnd::OnCtlColor(pDC, pWnd, nCtlColor); 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>

   if(nCtlColor==CTLCOLOR_SCROLLBAR) 
      return m_brColor; 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>

   return hbr; 
}

# 5 不要忘記將標頭檔案包含在框架CPP檔案中,即MainFrm中。cpp,說: 隱藏,複製Code

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~> 
#include "ColorizedScrollsDoc.h" 
#include "ColorizedScrollsView.h" 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>

就是這樣。編譯並執行程式碼,使彩色的滾動條顯示在應用程式的視窗中。 筆記 在本文中,我沒有討論滾動條如何工作以滾動內容。這是一種文件/檢視主題。基本上,要讓滾動條起作用,你必須處理WM_HSCROLL和WM_VSCROLL訊息。這是留給你的練習。我在上面承諾過,我將為在MDI應用程式上練習本文提供線索。如您所知,MDI在主框架中包含子框架視窗。因此,滾動條會出現在子框架中而不是主框架中。你只需要記住無論我們在主框架類中做了什麼,你都會在子框架類中做同樣的事情。此外,你必須記住兩件事。一個是AppWizard不會在子框架類中自動編寫OnCreate(..)處理程式,你必須自己完成。第二,當你執行應用程式時,滾動條不會出現在任何地方。要顯示它們,您必須最大化子視窗。或者你必須處理WM_SHOWWINDOW訊息,在那你必須說:Hide 複製程式碼/ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~比; 顯示視窗(SW_SHOWMAXIMIZED); / / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~比; 我已經提供了原始碼,可以開啟/編譯/執行的MS vc++ 6.0編輯器或MS Visual Studio . net編輯器,因為我已經提供了獨立的.dsp檔案和.dsw檔案,併為後者。sln檔案。如果你是vc++ 6.0開發人員,你必須自己編寫WM_CTLCOLOR訊息處理程式,它的原型,以及訊息對映中的一個條目,因為類嚮導沒有列出此訊息。您只需將上面的示例程式碼複製到框架類的標頭檔案和實現檔案中即可。 也就是說結束了。有一個不錯的程式… 本文轉載於:http://www.diyabc.com/frontweb/news8545.html