win32編程中對話框處理函數最後的返回值爲TRUE導致了程序異常

<span style="font-size:18px;">#include <windows.h>
#include "resource.h"

BOOL CALLBACK Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_INITDIALOG:
		SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)MAKEINTRESOURCE(IDI_ICON));
		SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)MAKEINTRESOURCE(IDI_ICON));
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDCANCEL:
			EndDialog(hWnd, TRUE);
			break;
			
		}
		break;
	}
	return FALSE;
}

int WINAPI wWinMain(HINSTANCE hInstexe, HINSTANCE, PTSTR nCmdLine, int)
{
	DialogBox(hInstexe, MAKEINTRESOURCE(IDD_DIALOG), NULL, Dlg_Proc);
	return 0;
}</span>

自己就簡單寫了個對話框,但是一運行結果出來是這樣:


排版都亂掉了,百思不得其解,就是寫了個簡單的對話框,怎麼還寫錯了?後來經過和正確的代碼進行對比,終於發現錯誤原因在於對話框回調函數的最後返回值,應該寫成return FALSE;而不是return TRUE;我之前一直以爲這就是個返回值,沒什麼太大影響,沒想到這麼小一個地方導致了這麼大的錯誤。《Windows程序設計》裏面只有這麼一句話,就是如果對話框過程處理一條消息時,它會返回TRUE;當不處理消息的時候,會返回FALSE。也就是如果再switch裏面處理了消息,那就在相應的地方return掉,如果都沒有處理,程序就會走到函數的末尾,這時候返回FALSE。

我看到如果這樣寫錯,CPU會跑滿,一直卡在那裏,然後發現返回的消息的值很小,小於我們需要處理的消息,也就是返回的根本不是我們自己編程需要的消息。具體爲什麼會卡死,現在還沒有答案,我決定請教下別人,先在這裏記錄一下這個問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章