我有使用CreateDialogParam. 它只有一個ListView子控制元件。在對話框WM_INITDIALOG訊息處理程式中,我將 子類化ListView以自定義標題重繪。
現在我想阻止用戶調整ListView列(標題)的大小,為此,我只需要處理's 中的HDN_BEGINTRACKA通知訊息,如下所示:ListViewWndProc
case WM_NOTIFY:
{
if ((((LPNMHDR)lParam)->code == HDN_BEGINTRACKA)
|| (((LPNMHDR)lParam)->code == HDN_BEGINTRACKW))
return TRUE; // to disable column resizing
}
這作業正常;但是,出于某種原因,我想在父(對話框)程序中處理此訊息。因此,我將此訊息轉發給該家長,如下所示:
case WM_NOTIFY:
{
if ((((LPNMHDR)lParam)->code == HDN_BEGINTRACKA)
|| (((LPNMHDR)lParam)->code == HDN_BEGINTRACKW))
{
BOOL b = FALSE;
HWND hParent = GetRealParent(hwnd);
if (hParent) b = SendMessage(hParent, msg, wParam, lParam);
return b; // to disable column resizing return TRUE;
}
}
break;
訊息發送正常,但是,即使我TRUE從對話程序回傳,在ListView程序中,SendMessage呼叫的回傳值是FALSE.
在對話程序中,代碼如下:
case WM_NOTIFY:
{
if ((((LPNMHDR)lParam)->code == HDN_BEGINTRACKA)
|| (((LPNMHDR)lParam)->code == HDN_BEGINTRACKW))
return TRUE;
}
所以,我的問題是為什么直接向WM_NOTIFY父級發送(轉發)訊息會回傳不同的結果,或者根本不起作用?
編輯 :-
過去,我也遇到過同樣的問題;為了解決它,我嘗試了一條用戶定義的訊息,例如:
#define UWM_WM_NOTIFY (WM_APP 7)
并使用它SendMessage在子級和父級之間或任何其他對話框之間進行通信。但它也無法獲得正確的回傳值。
所以,我使用SendMessage如下:
BOOL b = FALSE;
SendMessageA(hDlg, UWM_ANY_WM, 0, (LPARAM) &b);
return b;
發送變數地址LPARAM以獲取回傳值。有沒有更好的方法來做到這一點。或者為什么SendMessageA回傳值不同?
uj5u.com熱心網友回復:
從微軟的檔案的WM_NOTIFY訊息1:
如果訊息處理程式在對話框程序中,則必須使用
SetWindowLongwith 函式DWL_MSGRESULT來設定回傳值。
因此,使用更新的SetWindowLongPtr函式,您的父級(對話框)處理WM_NOTIFY訊息應如下所示:
case WM_NOTIFY:
{
if ((((LPNMHDR)lParam)->code == HDN_BEGINTRACKA)
|| (((LPNMHDR)lParam)->code == HDN_BEGINTRACKW))
{
SetWindowLongPtr(hWnd, DWL_MSGRESULT, TRUE); // hWnd is dialog's HWND
return TRUE;
}
}
另請注意,您的處理程式應繼續回傳TRUE,如本檔案中所述:
如果您使用
SetWindowLong與DWL_MSGRESULT指數來設定一個對話框程序處理的訊息的回傳值,你應該回傳TRUE直接之后。否則,如果您呼叫任何導致對話程序接收視窗訊息的函式,嵌套的視窗訊息可能會覆寫您使用DWL_MSGRESULT.
1實際上,您需要使用概述的機制來設定(幾乎)任何由對話程序處理的訊息的回傳值,正如Raymond Chen在這篇博客中很好地描述的那樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/372142.html
上一篇:如何在MSHTML中設定字體渲染
