在消息框中添加帮助按钮

介绍 如果你在MFC文档中查找AfxMessageBox函数,你会看到它有以下声明: 隐藏,复制Code

int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );

int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) -1 );

您将注意到有一个帮助上下文ID号传递给函数。问题是无法在对话框中显示帮助按钮,因此用户不知道消息中的帮助可用。他们只能按F1来获得帮助,这不是直观的,即使是高级用户。 在消息框上获得帮助按钮的唯一方法是调用::MessageBoxIndirect。但是这需要您填写一个结构每次你想使用一个消息框(一些UI设计师就没有问题,因为这将防止程序员把这么多消息框在他们的应用程序,并使用消息框被很多人认为糟糕的UI设计的)。您还必须提供一个回调函数来处理help按钮命令。 一个改进的AfxMessageBox函数 我创建了一个新版本的AfxMessageBox,它调用::MessageBoxIndirect。如果帮助上下文编号非零,则会在消息框中添加帮助按钮。如果帮助上下文编号为0,则不添加帮助按钮。 请注意,第一个参数是父窗口的句柄。这允许编译器区分我的AfxMessageBox函数和标准的MFC AfxMessageBox函数。我还发现,有时您需要显式地为消息框提供父窗口的句柄(例如从非模态对话框调用时)。当然,您总是可以为句柄传递NULL。 我的版本的AfxMessageBox也使用应用程序标题作为标题,就像MFC的AfxMessageBox一样(你必须在Windows API中调用::MessageBox时指定标题)。但是,您可以很容易地更改函数以提供不同的标题。 隐藏,收缩,复制Code

// this version accepts a resource string identifier
UINT AfxMessageBox(HWND hWnd, UINT nIDText, UINT nType, UINT nIDHelp = 0)
{
	CString s;
	s.LoadString(nIDText);
	return AfxMessageBox(hWnd, s, nType, nIDHelp);
}

// this version accepts a text string
UINT AfxMessageBox(HWND hWnd, LPCTSTR szText, UINT nType, UINT nIDHelp = 0)
{
	MSGBOXPARAMS mbp;

	memset(&mbp, 0, sizeof mbp);

	mbp.cbSize = sizeof MSGBOXPARAMS; 
	mbp.hwndOwner = hWnd; 
	mbp.hInstance = AfxGetInstanceHandle(); 
	mbp.lpszText = szText; 

	// if you wanted to specify a different caption, here is where you do it
	mbp.lpszCaption = AfxGetAppName(); 

	// if Help ID is not 0, then add a help button
	if (nIDHelp != 0)
	{
		mbp.dwStyle = nType | MB_HELP; 
	}
	else
	{
		mbp.dwStyle = nType; 
	}

	//  mbp.lpszIcon = ; // note, you could provide your own custom ICON here!

	mbp.dwContextHelpId = nIDHelp; 
	mbp.lpfnMsgBoxCallback = &MsgBoxCallback; 
	mbp.dwLanguageId = 0x0409;
	
	return ::MessageBoxIndirect(&mbp); 
}

回调函数——如何调用帮助 当用户单击Help按钮时,将调用一个回调函数,接收有关Help上下文编号的信息。我们必须提供回调函数。在回调函数中,我们只需调用CWinApp::WinHelp来指定正确的帮助上下文ID。 隐藏,复制Code

VOID CALLBACK MsgBoxCallback(LPHELPINFO lpHelpInfo)
{
	AfxGetApp()->WinHelp(lpHelpInfo->dwContextId);
} 

指定帮助文件 为AfxMessageBox的实现调用的帮助文件是由cwinapp派生的应用程序类的m_pszHelpFilePath成员指定的。默认情况下,这个成员会得到一个值,但是最好是显式地指定帮助文件在应用程序OnInitInstance成员函数中的位置。这并不简单,因为m_pszHelpFilePath只是一个指针。您必须显式地为字符串提供缓冲区空间(参考CWinApp::m_pszHelpFilePath的MFC文档以了解如何做到这一点)。 最后要注意的是,在邮件框中添加帮助按钮是比较容易的部分。挑战是为每个消息创建帮助主题,并为每个消息框实现正确的上下文编号。希望增加的用户满意度和减少的技术支持需求将使这些努力变得值得。 本文转载于:http://www.diyabc.com/frontweb/news10820.html

原文地址:https://www.cnblogs.com/Dincat/p/13473258.html