结束对话框时为什么不能使用DestroyWindow

//消息处理函数
INT CALLBACK DialogueProc(HWND hDlgWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{
	switch (msgID)
	{
	case WM_SYSCOMMAND:
		if (LOWORD(wParam) == SC_CLOSE)
			EndDialog(hDlgWnd, FALSE);
		break;
	}
	return FALSE;
}
//处理WM_COMMMAND时的代码
void Fun(HWND hWnd)
{
	DialogBox(g_hIns, (char*)IDD_DIALOG1, hWnd, DialogueProc);
}
void OnCommand(HWND hWnd, WPARAM wParam)
{
	switch (LOWORD(wParam))
	{
	case ID_EDIT_NEW:
		Fun(hWnd);//产生当前消息后的处理函数
		break; 
	case ID_EDIT_DELETE:
		MessageBox(hWnd, "DEL", "TIP", MB_OK);
		break;
	}
}

DestroyWindow顾名思义是销毁窗口的函数,但是在销毁对话框(也是一种窗口)时却一定要使用EndDialog。为什么呢?

我们来对比一下两者的功能:

DestroyWindow的功能是销毁窗口;而EndDialog的功能是销毁窗口并使之返回一个由EndDialog第二个参数指定的值。很明显,差别在是否返回值。

我(由于水平太菜)不能了解其内部实现过程,但可以这么去理解。DestroyWindow在被调用后会向目标窗口发送WM_DESTROY,WM_NCDESTROY暴力拆解窗口,这会导致本进程始终在堵塞状态。

而EndDialog则温柔一点,会先使DialogBox返回值,使其不再堵塞。也就可以顺利结束对话框

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值