如果你想实现有工具条的浮动和定位功能,而且可以方便的摆放任何控件上去,那就使用CDialogBar就可以拥有和CDialog一样的方便和快 捷。
添加一个CDialogBar派生类:在资源中添加一个对话框,再采用类向导来添加类,这里我们找不到CDialogBar作为基类,可以先用 CDialog作为基类产生一个,然后把所以的“CDialog”替换为“CDialogBar”。
构造函数 CXXXDlg::CXXXDlg(CWnd* pParent /*=NULL*/)
: CDialog(CXXXDlg::IDD, pParent)改成: CXXXDlg::CXXXDlg()就可以了,添加一个类似OnInitDialog的函数,在CDialogBar中是不存在 OnInitDialog的消息的,因为初始化是在创建后调用的,所以我们就重写virtual BOOL Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID)这个函数。注意哦用向导添加的Create函数的参数是不对的,改成上面。下面是实现代码:
BOOL CXXXDlg::Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID)
{
BOOL bRes= CDialogBar::Create(pParentWnd,nIDTemplate,nStyle,nID );
InitDialogBar();// 在类中添加一个成员函数就可以了
return bRes;
}
BOOL CXXXDlg::InitDialogBar()
{
UpdateData(FALSE);// 这个一定要啊,这样就会有和CDialog一样的数据交换效果了
return TRUE;
}
创建和使用:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndColor.Create(this, IDD_COLOR,
CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
ID_VIEW_COLOR))
{
TRACE0("Failed to create dialog bar m_wndContentMenu\n");
return -1; // fail to create
}
m_wndColor.EnableDocking(CBRS_ALIGN_BOTTOM );
DockControlBar(&m_wndColor);// 没有这个,CDialogBar不可以移动,FloatControlBar的功能是浮动在窗口上。
EnableDocking(CBRS_ALIGN_ANY);
m_wndColor.SetWindowText(_T(" 颜色"));
return 0;
}
IDD_COLOR是CDialogBar的对话框ID,ID_VIEW_COLOR是一个 菜单资源id,在
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND_EX(ID_VIEW_COLOR, OnBarCheck)
ON_UPDATE_COMMAND_UI(ID_VIEW_COLOR, OnUpdateControlBarMenu)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
时,工 具条可以显示和隐藏。
想在CDialogBar上添加按钮消息还需要修改如下:
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// TODO: Add your specialized code here and/or call the base class
if (m_wndColor.OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))
return TRUE;
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
m_wndColor 为CDialogBar对象,这样,按钮的消息可以映射到自己的类中。
这里增加一条关于对话框上响应键盘按键消息,重载
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message>=WM_KEYDOWN && pMsg->message<=WM_KEYUP)
{
this->SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
return TRUE;
}
else
return CDialog::PreTranslateMessage(pMsg);
}
这样就可以在对话框上重载WM_KEYDOWN和 WM_KEYUP来编写代码了。
转载于:https://blog.51cto.com/laokaddk/349524