Windows核心编程学习一:使用DialogBoxParam显示模式对话框

注:源码为学习《Windows核心编程》的一些尝试,非原创。若能有助于一二访客,幸甚。



1.DialogBoxParam

This function creates a modal dialog box from a dialog box template resource. Before displaying the dialog box, the function passes an application-defined value to the dialog box procedure as thelParam parameter of the WM_INITDIALOG message. An application can use this value to initialize dialog box controls.

int DialogBoxParam( 
  HINSTANCE hInstance, 
  LPCTSTR lpTemplateName, 
  HWND hWndParent, 
  DLGPROC lpDialogFunc, 
  PARAM dwInitParam
); 

2.最简单的尝试

/*******************************************************************************
 * File:	FirstTry.cpp
 * Author:	guzhoudiaoke@126.com
 * Time:	2013-04-14
 * 描述:	主要尝试使用DialogBoxParam函数显式一个对话框
 *******************************************************************************/

#include <Windows.h>
#include <Windowsx.h>
#include <tchar.h>
#include "Resource.h"


// 对话框过程函数
INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	return FALSE;
}


int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int)
{
	DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_FIRSTTRY), NULL, Dlg_Proc, _ttoi(pszCmdLine));
	return 0;
}
运行结果:


但会发现,对话框不能被关闭。

3.对话框过程函数

/*******************************************************************************
 * File:	FirstTry.cpp
 * Author:	guzhoudiaoke@126.com
 * Time:	2013-04-14
 * 描述:	主要尝试使用DialogBoxParam函数显式一个对话框
 *******************************************************************************/

#include <Windows.h>
#include <Windowsx.h>
#include <tchar.h>
#include "Resource.h"


/* SetDlgMsgResult This macro maps to the SetWindowLong function.
 * SetWindowLong changes an attribute of the specified window, also sets a 32-bit (LONG) 
 * value at the specified offset into the extra window memory of a window.
 * The normal HANDLE_MSG macro in WindowsX.h does not work properly for dialog
 * boxes because DlgProc returns a BOOL instead of an LRESULT (likeWndProcs). 
 * This chHANDLE_DLGMSG macro corrects the problem.
 */
#define chHANDLE_DLGMSG(hWnd, message, fn)                 \
   case (message): return (SetDlgMsgResult(hWnd, uMsg,     \
      HANDLE_##message((hWnd), (wParam), (lParam), (fn))))


void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
	switch (id) {
		case IDCANCEL:
			EndDialog(hwnd, id);
			break;
	}
}


// 对话框过程函数
INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) {
		chHANDLE_DLGMSG(hwnd, WM_COMMAND,	 Dlg_OnCommand);
	}

	return FALSE;
}


int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int)
{
	DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_FIRSTTRY), NULL, Dlg_Proc, _ttoi(pszCmdLine));
	return 0;
}

其中chHANDLE_DLGMSG是原书作者对HANDLE_MSG的改进。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值