1.工具条
假设已经新建好了一个资源文件菜单栏(IDR_MENU1),现在需要将该菜单栏加载到我们的对话框中去,在OnInitDialog()函数内添加,具体代码如下:
// TODO: 在此添加额外的初始化代码 //ADD //加载菜单 m_menu.LoadMenu( IDR_MENU1 ); SetMenu( &m_menu ); m_menu.Detach();//因为这里是类成员变量,可以不使用这句,但是局部变量的话必须要有这个
这样做完后,可以看到菜单并操作,但是不能进行消息响应。对菜单进行消息响应的时候,据说可以使用响应UPDATE_COMMAND_UI来实现,但是我尝试了下,发现没有反应,最后我是使用了响应消息WM_COMMAND来实现菜单响应的。具体代码如下:
BOOL CImportTableDlg::OnCommand(WPARAM wParam, LPARAM lParam) { // TODO: 在此添加专用代码和/或调用基类 int menuID = LOWORD(wParam); CAboutDlg dlgAbout; CFileDialog fdlg( TRUE, NULL, NULL, 6UL, _T("可执行文件(*.exe)||动态链接库(*.dll)||"), (CWnd *)this ); TCHAR szFileName[MAX_PATH]; switch(menuID) { case ID_ABOUT: dlgAbout.DoModal(); break; case ID_OPEN: fdlg.DoModal(); lstrcpy( szFileName, fdlg.GetPathName() ); m_pro.ResetContent(); m_pro.AddString( szFileName ); ListImportTable( GetProHandle(szFileName, FALSE) ); break; case ID_EXIT: this->EndDialog( IDOK ); break; default: break; } return CDialogEx::OnCommand(wParam, lParam); }附上图片:
2.状态栏
这个纠结了很久,开始使用CStatusBar的时候搞了好久也没显示,最后只好转向CStatusBarCtr了。
这个用法比较简单,先贴代码:
初始化代码:
//设置状态栏 this->m_statebar.Create( WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP, CRect(0, 0, 0, 0), this, ID_BAR ); CRect rt; this->GetClientRect( &rt ); int pnWidth[2] = { rt.Width()/2, -1}; this->m_statebar.SetParts( 2, pnWidth ); SYSTEMTIME t; GetLocalTime(&t); CString str; CClientDC dc(this); str.Format( _T("当前时间为:%d年%d月%d日%d时%d分%d秒"), t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond ); CSize sz; sz = dc.GetTextExtent( str ); this->m_statebar.SetText( str, 200, 0 ); this->m_statebar.SetText( _T("准备中..."), 0, 0 ); SetTimer( ID_BAR, 10, NULL );//ID_BAR是自定义的一个整数值,用来识别状态栏
状态栏更新代码:
void CImportTableDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 SYSTEMTIME t; GetLocalTime(&t); CString str ; CClientDC dc(this); CSize sz; switch( nIDEvent ) { case ID_BAR: str.Format( _T("当前时间为:%d年%d月%d日%d时%d分%d秒"), t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond ); sz = dc.GetTextExtent( str ); this->m_statebar.SetText( str, 1, 0 ); break; default: break; } CDialogEx::OnTimer(nIDEvent); }