给应用程序窗口的滚动条着色

介绍 这是我早在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

原文地址:https://www.cnblogs.com/Dincat/p/13468164.html