您的位置:首页 > 其它

MFC基于对话框 创建工具栏 工具栏提示 窗口同步缩放 拦截主界面Enter按下 窗口过程 菜单工具栏按钮变灰

2010-08-17 10:47 645 查看
代码如下,工具栏上面按钮的个数可以根据资源视图进行调整,IDR_MAINTB为资源视图里的工具栏的ID,按钮文本可自行设定



//加载工具条
void CNJNCTimeSyncServerDlg::LoadAndDockToolBar()
{
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_LIST, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINTB))
	{
		TRACE0("未能创建工具栏/n");
		return;      // 未能创建
	}
	
	/*******设置按钮文本******/
	LPCTSTR lpText[3] = {_T("同步"), _T("修改"), _T("全选")};   
	int     nButtonCount = m_wndToolBar.GetCount();   
	int     nTextIndex   = 0;   
	for(int nIndex = 0; nIndex < nButtonCount; nIndex++)
	{   
		if (m_wndToolBar.GetButtonStyle(nIndex) == TBBS_SEPARATOR)   
		{
			continue;
		}
		m_wndToolBar.SetButtonText(nIndex, lpText[nTextIndex++]);   
	}
	
	/******定位和显示工具条*****/
	m_wndToolBar.ShowWindow(SW_SHOW);
	RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
}




工具栏提示代码如下:



//工具栏提示
BOOL CNJNCTimeSyncServerDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
	ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
	
	// UNICODE消息
	TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
	TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
	CString strTipText;
	UINT nID = pNMHDR->idFrom;
	
	if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
		pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
	{
		//idFrom为工具条的HWND 
		nID = ::GetDlgCtrlID((HWND)nID);
	}
	
	if (nID != 0) //不为分隔符
	{
		strTipText.LoadString(nID);
		strTipText = strTipText.Mid(strTipText.Find('/n',0)+1);
		
#ifndef _UNICODE
		if (pNMHDR->code == TTN_NEEDTEXTA)
		{
			lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
		}
		else
		{
			_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
		}
#else
		if (pNMHDR->code == TTN_NEEDTEXTA)
		{
			_wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
		}
		else
		{
			lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
		}
#endif
		
		*pResult = 0;
		
		// 使工具条提示窗口在最上面
		::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE |
			SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); 

		return TRUE;
	}
	return TRUE;
}




窗口控件同步缩放:



//重新设置窗体上控件的尺寸
void CNJNCTimeSyncServerDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	CRect winRect;
	GetClientRect(&winRect);  //获取窗口区域
	
	//Set Main List
	if (!m_wndToolBar)  //客户端首次启动,尚未初始化完毕
	{
		return;
	}
	
	/*********重定位工具栏********/
	CRect toolBarRect;
	m_wndToolBar.GetClientRect(&toolBarRect);
	m_wndToolBar.MoveWindow(toolBarRect.left, toolBarRect.top, winRect.right, 25);
	
	/********重定位主列表*******/
	CRect listRect;
	m_MainList.GetClientRect(&listRect);
	m_MainList.MoveWindow(0, 24, winRect.right, winRect.bottom - listRect.top);
}




拦截主界面Enter按下:



//拦截主界面的Enter按下事件
BOOL CNJNCTimeSyncServerDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if (pMsg->message == WM_KEYDOWN)   
	{   
		if (pMsg->wParam == VK_ESCAPE) //Esc键不退出程序   
		{   
			return TRUE;   
		}   
		if (pMsg->wParam == VK_RETURN)   
		{   
			return FALSE;//对话框内部控件可以接收到回车消息,返回true则不可以    
		}   
	} 
	
	return CDialog::PreTranslateMessage(pMsg);
}




窗口过程:



LRESULT CNJNCTimeSyncServerDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
   switch(message)
   {
     case WM_UPDATELIST:
     case WM_TIMER:
     ...
   }

   return CDialog::WindowProc(message, wParam, lParam);
}




按钮变灰:



//多选时,修改备注按钮禁用
void CNJNCTimeSyncServerDlg::OnItemchangedMainlist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	int selectCount = m_MainList.GetSelectedCount();
	CToolBarCtrl &toolbarctrl=m_wndToolBar.GetToolBarCtrl(); 
	CWnd *pMain = AfxGetMainWnd();
	CMenu *pMenu = pMain->GetMenu();
	if (selectCount > 1)
	{
		//按钮变灰,菜单也要变灰
		toolbarctrl.SetState(IDTB_CHANGE_REMARK, TBSTATE_INDETERMINATE);
		pMenu->EnableMenuItem(IDM_CHANGE_REMARK, MF_GRAYED);
		//toolbarctrl.SetState(IDTB_CHANGE_REMARK, TBSTATE_ENABLED);
	}
	else
	{
		toolbarctrl.SetState(IDTB_CHANGE_REMARK, TBSTATE_ENABLED);
		pMenu->EnableMenuItem(IDM_CHANGE_REMARK, MF_ENABLED);
	}
	
	*pResult = 0;
}




修改App的名字,如调用AfxMessageBox(_T("..."))弹出的提示框上面的标题,是默认的App名字,如果想修改,可以在

App::InitInstance()里起始处调用this->m_pszAppName = _T("Name");来设置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: