WEB开发网
开发学院软件开发VC vc层叠式窗体控件指南 阅读

vc层叠式窗体控件指南

 2007-10-04 20:11:34 来源:WEB开发网   
核心提示:然而,这里有一个必要条件,vc层叠式窗体控件指南(5),同时它被应用于标题窗体,当它被点击,它理解和学习起来务求尽可能的简单,我确信会有比我这里这个功能的实现更好的解决方案,它必须通知其父(一个CStackedWndCtrl 对象)以使得相关内容窗体可以被显示,我们将通过发送一个消息完成这个任务

然而,这里有一个必要条件,同时它被应用于标题窗体。当它被点击,它必须通知其父(一个CStackedWndCtrl 对象)以使得相关内容窗体可以被显示。我们将通过发送一个消息完成这个任务。

为了简化,我将用按钮作为标题窗体。它们毕竟是绝大多数可能的选择。我们将从CButton继承一个类,并且添加这个有点特别的功能。

那么,我们现在创建一个继承于CButton的名为CTelltaleButton的类。添加下面的消息定义到它的头文件,和一个BN_CLICKED(反射消息)的消息处理程序。

// In TelltaleButton.h
#define WM_RUBRIC_WND_CLICKED_ON ( WM_APP + 04100 )
// In TelltaleButton.cpp
void CTelltaleButton::OnClicked()
{
     GetParent()->SendMessage( WM_BUTTON_CLICKED, (WPARAM)this->m_hWnd );
}
标题窗体将发送一个包含其自己句柄的消息,如wParam,有了这个信息,它的父控件将可以了解到哪一个标题窗体已经被点击了。

现在,我们通过手工添加一个方法到其消息映射在CStackedWndCtrl中处理这个消息如下:

// In StackedWndCtrl.h
#define WM_RUBRIC_WND_CLICKED_ON ( WM_APP + 04100 )
...
...
// 生成消息映射函数
protected:
     //{{AFX_MSG(CStackedWndCtrl)
     afx_msg void OnSize(UINT nType, int cx, int cy);
     //}}AFX_MSG
     afx_msg LRESULT OnRubricWndClicked(WPARAM wParam, LPARAM lParam);
     DECLARE_MESSAGE_MAP()
// In StackedWndCtrl.cpp
...
...
    BEGIN_MESSAGE_MAP(CStackedWndCtrl, CStatic)
     //{{AFX_MSG_MAP(CStackedWndCtrl)
     ON_WM_SIZE()
     //}}AFX_MSG_MAP
     ON_MESSAGE(WM_RUBRIC_WND_CLICKED_ON, OnRubricWndClicked)
     END_MESSAGE_MAP()
    ...
    ...
LRESULT CStackedWndCtrl::OnRubricWndClicked(WPARAM wParam, LPARAM /*lParam*/)
{
     HWND hwndRubric = (HWND)wParam;
     BOOL bRearrange = FALSE;
     for( int i = 0; i < m_arrPanes.GetSize(); i++ )
      if( m_arrPanes[ i ]->m_pwndRubric->m_hWnd == hwndRubric )
      {
       // 只有除了属于当前已打开面板的一个标题窗体被点击时才重新排列控件
       if( m_arrPanes[ i ]->m_bOpen == FALSE )
       {
        m_arrPanes[ i ]->m_bOpen = TRUE;
        bRearrange = TRUE;
       }
      }
      else
       m_arrPanes[ i ]->m_bOpen = FALSE;
     if( bRearrange )
      RearrangeStack();
    // 如果已发送消息的标题窗体希望知道是否控件已被重新排列,返回标志
    return bRearrange;
}

它完全归结为遍历面板以寻找已被点击的标题窗体。如果它不同于当前打开的面板的那个(标题窗体),就重新排列控件。

一些Eye Candy

因为对于它的标题和内容窗体所可以被使用的控件来说CStackedWndCtrl是非常灵活,这就很容易使其样式活泼起来。为了演示如何做到这样,我已经在演示工程中包含了一个"普通"控件和一个Davide Calabro的阴影按钮及Everaldo Coelho的图标的控件。正如你能看到的,通过检查演示工程中的代码,没有一行在CStackedWndCtrl中的代码需要被修改。正如其所应该的那样。

我们的短暂的旅程就要结束了,我的朋友;我们从此会各走各路了。我希望你已经用我已向你展示的东西来播下你想像力的种子,而且我们的quiet dealings会对你有益。

反馈

我的意图是提供一个编码清楚的指南,它理解和学习起来务求尽可能的简单。我确信会有比我这里这个功能的实现更好的解决方案。任何关于改进、简单化或更好解释代码的建议我都欢迎。

上一页  1 2 3 4 5 

Tags:vc 层叠 窗体

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接