1. 程式人生 > >C++:errorC2440:訊息相應函式型別不能轉化

C++:errorC2440:訊息相應函式型別不能轉化

1. 問題描述

VS編譯提示以下兩個問題:

(1)errorC2440	“static_cast”: 無法從“UINT (__thiscall CSizingControlBar::* )(CPoint)”轉換為“LRESULT (__thiscall CWnd::* )(CPoint)”
(2)errorC2440	“static_cast”: 無法從“LRESULT (__thiscall CTextProgressCtrl::* )(UINT,LPTSTR)”轉換為“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
(3)errorC2440	“static_cast”: 無法從“BOOL (__thiscall CCJPagerCtrl::* )(NMPGSCROLL *,LRESULT *)”轉換為“BOOL (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)”

2. 解決方法

error(1)解決方法:

通過提示的訊息找到相應的訊息相應函式,本次出現的問題是CSizingControlBar::OnNcHitTest,由
afx_msg UINT OnNcHitTest(CPoint point); //VC6תVS2017-gxy-20181025
改成
afx_msg LRESULT OnNcHitTest(CPoint point); //VC6תVS2017-gxy-20181025
此外函式定義的地方也要由
UINT CSizingControlBar::OnNcHitTest(CPoint point) //VC6轉VS2017-gxy-20181025


改成
LRESULT CSizingControlBar::OnNcHitTest(CPoint point) //VC6轉VS2017-gxy-20181025
之所以改返回的資料型別是因為,高版本的VS(好像是從VS2010開始)對訊息的檢查更為嚴格,因此這些在VC6下完全正常執行的訊息對映在VS上編譯不通過。

error(2)解決方法:

同樣的error(2)解決也需要將訊息相應函式寫成LRESULT *(WPARAM,LPARAM)這樣的格式,跟error(1)一樣直接改變形引數據型別:
UINT換成WPARAM,LPTSTR換成LPARAM

error(3)解決方法:

error(3)也需要將訊息響應函式的形參改成標註的形參型別,但是這裡多少有點區別,直接替換之後胡後續函式可能會有問題,我的選擇是形參替換之後在函式裡在強制轉換回來。
以前是這樣子:

BOOL CCJPagerCtrl::OnPagerScroll(NMPGSCROLL *pNMPGScroll, LRESULT *pResult)
{
	*pResult = 0;
	switch (pNMPGScroll->iDir) {
		case PGF_SCROLLLEFT:
		case PGF_SCROLLRIGHT:
		case PGF_SCROLLUP:
		case PGF_SCROLLDOWN:
		break;
	}
	return 0;
}

改完之後是這樣子

BOOL CCJPagerCtrl::OnPagerScroll(NMHDR *pNMPGScroll, LRESULT *pResult)
{
    *pResult = 0;
	NMPGSCROLL *pNMPGScroll_ROLL = (NMPGSCROLL *)pNMPGScroll;
    switch (pNMPGScroll_ROLL->iDir) {
  	 	 case PGF_SCROLLLEFT:
    	 case PGF_SCROLLRIGHT:
   		 case PGF_SCROLLUP:
    	 case PGF_SCROLLDOWN:
        break;
    }
    return 0;
}

雖然我發現,寫的這個函式無論如何返回的都是0。
PS:原來NMPGCALCSIZE*是一個結構體指標,該結構體的第一個變數的型別又是NMHDR型別的結構體。