编写多文档应用程序
作者:王雪松
2.工具栏
还要调用CFrameWnd::RecalcLayout()函数计算工具栏尺寸。
三、 位图按钮与菜单
由于按钮和菜单比较少,没有采用自绘技术,而是采用了
CButton::SetBitmap()和CMenu::SetMenuItemBitmaps()函数,相信读者比作者更清楚这两个函数的用法。
五、 自定义视图类
没有用向导生成的类,因此三个子窗口各自不同,比较简单,不介绍了。
详细代码请参看源程序。还有一个数据库版本的,没有更高的价值,因此没拿出来现丑。
错误和不足请看客们指出,共同研究。
Email:hpxs@hotmail.com
下载本文示例代码
一、 动态菜单与工具栏
(未登录状态)
(登陆状态)
实现原理:
1.菜单
BOOL SetMenu( HWND hWnd, // handle to window HMENU hMenu // handle to menu );可以改变菜单。
2.工具栏
BOOL CToolBarCtrl::SetState( int nID, UINT nState );可以改变工具栏按钮状态。
还要调用CFrameWnd::RecalcLayout()函数计算工具栏尺寸。
二、 自制对话条
//创建对话条 if(!m_wndBar.Create(this,IDD_DIALOGBAR,WS_CHILD|WS_VISIBLE| CBRS_BOTTOM|CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,IDD_DIALOGBAR)) //操纵对话条上的CTabCtrl控件 CTabCtrl * ptab=(CTabCtrl *)m_wndBar.GetDlgItem(IDC_TAB_INFO); ptab->InsertItem(0,"操作信息"); ptab->SetImageList(&((CMainFrame *)AfxGetMainWnd())->m_imageList); …………… //隐藏和显示CListBox控件 CListBox * plistInfo = (CListBox*)m_wndBar.GetDlgItem(IDC_LIST_INFO); plistInfo->SetWindowPos(NULL, 0, 0, GetSystemMetrics(SM_CXSCREEN)-11, 75, SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE|SWP_SHOWWINDOW);
由于按钮和菜单比较少,没有采用自绘技术,而是采用了
CButton::SetBitmap()和CMenu::SetMenuItemBitmaps()函数,相信读者比作者更清楚这两个函数的用法。
四、 只能运行程序的一个实例
当程序已经运行时,如果再次运行,则激活前一个实例。
实现原理:
1. 只运行一个实例
#define UNIQE_NAME "{1AB792D6-EEF2-4528-9A84-91356811E7A4}"BOOL CRaclientApp::InitInstance()函数中加入m_hOneInstance = ::CreateMutex( NULL,FALSE,UNIQE_NAME);
if ( GetLastError() == ERROR_ALREADY_EXISTS )//如果存在前一个
{
//发送消息,激活实例
DWORD dwRecipients = BSM_APPLICATIONS;
::BroadcastSystemMessage( BSF_NOHANG,&dwRecipients,
ID_RA_MSG, // registered window message
0,0 ); // user defined parameters
return FALSE;
}还要在CRaclientApp::ExitInstance()中CloseHandle(m_hOneInstance);2、激活前一个实例
#define ra_MSG "{D48CA923-4925-41cb-8F56-ABAAAFCEF787}"
const UINT ID_RA_MSG =::RegisterWindowMessage(ra_MSG);//注册消息
然后再CmainFrame中添加相应的消息处理函数。没有用向导生成的类,因此三个子窗口各自不同,比较简单,不介绍了。
详细代码请参看源程序。还有一个数据库版本的,没有更高的价值,因此没拿出来现丑。
错误和不足请看客们指出,共同研究。
Email:hpxs@hotmail.com
这是部分代码: // 该函数不会被激活 LRESULT CRaclientApp::OnRaMsg( WPARAM wParam,LPARAM lParam ) { ::AfxMessageBox("ssss"); m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); return 0; } 这是消息影射: BEGIN_MESSAGE_MAP(CRaclientApp, CWinApp) //{{AFX_MSG_MAP(CRaclientApp) //。。。。。。。省略部分代码 ON_REGISTERED_MESSAGE(ID_RA_MSG,OnRaMsg) //}}AFX_MSG_MAP END_MESSAGE_MAP() 并且我已经将CMainFrame中相同的代码注释掉了。 为什么::BroadcastSystemMessage发送的消息App类不能接收? 多谢指教! ( meteor135 发表于 2005-5-26 14:03:00) 感谢这种交流,贡献的精神. ( traveller 发表于 2005-5-8 14:29:00) 谢谢!!! ( Ebug 发表于 2005-3-5 3:43:00) raclient.cpp(130): warning C4996: “CWinApp::Enable3dControls”被声明为否决的 madecertview.cpp(156): error C2593: “operator =”不明确 ( Simonos 发表于 2004-1-15 15:56:00) ....................................................... More... |
