Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588531
  • 博文数量: 752
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(752)

文章存档

2011年(1)

2008年(751)

我的朋友

分类:

2008-10-13 16:41:33

编写多文档应用程序
作者:



一、 动态菜单与工具栏


(未登录状态)


(登陆状态)

实现原理:

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


--------------------next---------------------

CRaChildFrame *m_pInput,*m_pAuditing,*m_pMade;
这三个指针没有delete,内存泄露? ( heiren8769 发表于 2008-8-5 12:42:00)
 
谢谢了,对我很有用
( zoumzl 发表于 2006-6-7 18:01:00)
 
不错,谢谢 ( ikohl 发表于 2005-5-31 15:42:00)
 
我将你源代码中实现单实例运行的消息响应函数由CMainFrame转移到了CRaclientApp中重新编译运行,(请相信我绝对没有遗漏消息处理相关代码)这样改动之后为什么第二个实例广播的系统消息不会被已存在的实例接收到? 
这是部分代码:

// 该函数不会被激活
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)
 
你生成MDI的方法真是让我大开眼界~当初想开发MDI窗口也看了不少资料,从来就没有见过象你写的这么简便~~
谢谢!!! ( 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)
 
很好!thinks ( doudou_sha 发表于 2003-9-28 9:43:00)
 
是基于MDI框架做的吗? ( flywlsj 发表于 2003-9-24 13:22:00)
 
一定要在申请证书的组织机构代码中输入数字,方能查询出数据。 ( hpxs 发表于 2003-5-30 10:38:00)
 
.......................................................

--------------------next---------------------

阅读(249) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~