1. 程式人生 > 實用技巧 >在模態對話方塊提示

在模態對話方塊提示

下載演示專案- 18kb下載原始檔- 2kbintroduction 這個示例演示瞭如何在模態對話方塊中顯示工具提示。 此外,還闡明瞭程式碼重用的一些基本原則和MFC程式設計的精神。 示例是使用Visual c++ 6.0建立的,但是應該從4.2開始工作。 如何在應用程式中整合示例 在應用程式中包含檔案ToolTipDialog.cpp。 在stdafx。h,加上這條線 隱藏,複製程式碼# include“ToolTipDialog.h” 從CToolTipDialog派生對話方塊,而不是CDialog。 確保呼叫CToolTipDialog::OnInitDialog而不是CDialog::OnInitDialog。 在資原始檔中新增與對話方塊中的控制元件具有相同id的字串。 如果你有一個選項對話方塊,包括選項“在對話方塊中顯示工具提示”。當這個設定改變時,呼叫CToolTipDialog::EnableToolTips()。 它是如何工作的 示例使用MFC CToolTipCtrl,它是圍繞一個Windows通用控制元件構建的。這個通用控制元件為我們做所有的工作。 唯一要做的是建立控制元件,為視窗分配工具提示,並傳遞滑鼠訊息。 函式CToolTipDialog::OnInitDialog()查詢所有ID匹配控制元件ID的字串。 隱藏,複製Code

BOOL CToolTipDialog::OnInitDialog()
{
	BOOL bResult = CDialog::OnInitDialog();
	m_wndToolTip.Create(this);
	m_wndToolTip.Activate(c_bShowToolTips);
	CWnd *pWndChild = GetWindow(GW_CHILD);
	CString strToolTip;
	while (pWndChild)
	{
		int nID = pWndChild->GetDlgCtrlID();
		if (strToolTip.LoadString(nID))
		{
			m_wndToolTip.AddTool(pWndChild, strToolTip);
		}
		pWndChild = pWndChild->GetWindow(GW_HWNDNEXT);
	}
	return bResult;
}

標準windows程式有一個主迴圈,該迴圈連續呼叫GetMessage()、TranslateMessage()和DispatchMessage()。 MFC主迴圈和模態迴圈包含一些額外的。其中之一是在TranslateMessage()之前呼叫PreTranslateMessage()。 這使我們有機會檢視每條訊息或在傳送訊息之前過濾訊息。 這是我們可以攔截所有滑鼠訊息並將其轉發給工具提示控制元件的地方。 隱藏,複製Code

BOOL CToolTipDialog::PreTranslateMessage(MSG *pMsg)
{
	if (c_bShowToolTips &&
		pMsg->message >= WM_MOUSEFIRST &&
		pMsg->message <= WM_MOUSELAST)
	{
		MSG msg;
		::CopyMemory(&msg, pMsg, sizeof(MSG));
		HWND hWndParent = ::GetParent(msg.hwnd);
		while (hWndParent && hWndParent != m_hWnd)
		{
			msg.hwnd = hWndParent;
			hWndParent = ::GetParent(hWndParent);
		}
		if (msg.hwnd)
		{
			ListBoxTextExpand(&msg);
			m_wndToolTip.RelayEvent(&msg);
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}

正如Richard Collins指出的,僅僅將滑鼠事件傳遞到工具提示控制元件是不夠的。對於具有子視窗的控制元件,這將不起作用。例如,組合框有一個編輯控制元件作為子控制元件。當滑鼠訊息被髮送到這個編輯控制元件時,hWndParent將是組合框,而不是對話方塊。調整訊息,使工具提示控制元件相信它確實被髮送到組合框。當然,原始訊息被傳遞給基類函式。 列表框字串的自動擴充套件 Murali Soundararajan添加了在工具提示中顯示列表框字串的程式碼。要做到這一點,你只需給你的列表框字串TOOLTIPEXPAND。其餘的都為你做了。工具提示將在滑鼠下方顯示列表框專案的文字。這不適用於所有者繪製的列表框。這就是呼叫ListBoxTextExpand(msg)所需要的。 程式碼重用 CodeGuru網站已經包含了Dave Bixler的一篇文章,它也做了同樣的工作。 然而,Dave告訴我們為每個對話一遍又一遍地寫同樣的程式碼。 你應該避免這樣做的原因有兩個: 我的高中數學老師過去常說,數學家應該儘可能地懶惰。對於程式設計師來說更是如此。您應該總是儘可能少地編寫程式碼。 您可能希望稍後更改此程式碼。也許你想在橢圓視窗中顯示你的工具提示。此時,您將希望在某個位置更改程式碼。 MFC擴充套件 這個示例只包含一小段程式碼。您可能想知道,建立一個通用基類並從中派生是否值得。 不過,你可以稍後在這個類中新增其他內容,你所有的對話方塊都會免費獲得這些新內容。 這是一個應該堅持的普遍原則。當從一個MFC類派生一個類時,您應該始終建立一個像這樣的中產階級。 凡是通用的都放在基類中,凡是應用程式特定的都放在派生類中。 結果是:當您完成建立應用程式時,您將擁有自己的MFC擴充套件庫。所有的功能都將在一個新的應用程式中使用。 在資原始檔中放置字串 美國人可能不清楚這一點,但歐洲人知道這一點:您應該將所有字串放在一個資原始檔中。微軟已經警告我們夠多了。 為什麼?因為總有一天,人們會開始問他們能不能弄到法語、德語……你的軟體版本。 當您的應用程式開始為全世界所熟知時,您可能會遇到這種情況。 讓事情自動進行 MFC的精神是讓事情自動進行。為了讓嚮導能夠使用框架,人們發明了各種可怕的巨集,並且在您不知情的情況下載入了各種資源。 例如,工具欄的工具提示自動載入。這並不總是增強MFC原始碼的可讀性,但確實使程式設計師的工作更輕鬆。 在擴充套件MFC(或簡單地使用它)時,您應該遵循相同的原則。 這就是資源字串與控制元件具有相同ID的原因。你應該經常嘗試像這樣的花招。 有時甚至可以是be有用訊息中建立新的巨集符合地圖或其他地圖。 本文轉載於:http://www.diyabc.com/frontweb/news8153.html