在很多情况下,我们为了获取对话框设置的一些参数,通常都是通过类对象中成员来获取,或者直接获取退出时最后点击的BUTTON的ID号来做一些简单的操作。这样方法虽然稳定,但是有时候未免太带繁琐,近日在看一些书的时候突然看到另外一种好方法,暂且命名为“另类参数对话框编程”,以后想到更好的名字再换吧@
在合格方法中,我们再也无需为一个单独的窗体创建一个专属的Class,获取参数直接用GetDlgXXX函数来获取,具体的代码如下;
主体函数代码
// AlgorithmDlgProc 消息回调函数
nResult = (int)DialogBox( NULL, MAKEINTRESOURCE(IDD_3D_ALGORITHM),
NULL, AlgorithmDlgProc );
switch( nResult )
{
case -1: // User canceled dialog box
return;
case 0: // User selected DS3DALG_NO_VIRTUALIZATION
guid3DAlgorithm = DS3DALG_NO_VIRTUALIZATION;
break;
case 1: // User selected DS3DALG_HRTF_FULL
guid3DAlgorithm = DS3DALG_HRTF_FULL;
break;
case 2: // User selected DS3DALG_HRTF_LIGHT
guid3DAlgorithm = DS3DALG_HRTF_LIGHT;
break;
}
AlgorithmDlgProc 消息回调函数
INT_PTR CALLBACK AlgorithmDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
// Default is DS3DALG_NO_VIRTUALIZATION for fastest performance
static int nDefaultRadio = IDC_NO_VIRT_RADIO;
switch( msg )
{
case WM_INITDIALOG:
// Default is DS3DALG_NO_VIRTUALIZATION for fastest performance
CheckRadioButton( hDlg, IDC_NO_VIRT_RADIO, IDC_LIGHT_VIRT_RADIO, nDefaultRadio );
return TRUE; // Message handled
case WM_COMMAND:
// 获取BUTTON 的ID号
switch( LOWORD(wParam) )
{
case IDCANCEL:
EndDialog( hDlg, -1 );
return TRUE; // Message handled
case IDOK:
if( IsDlgButtonChecked( hDlg, IDC_NO_VIRT_RADIO ) == BST_CHECKED )
{
nDefaultRadio = IDC_NO_VIRT_RADIO;
EndDialog( hDlg, 0 );
}
if( IsDlgButtonChecked( hDlg, IDC_HIGH_VIRT_RADIO ) == BST_CHECKED )
{
nDefaultRadio = IDC_HIGH_VIRT_RADIO;
EndDialog( hDlg, 1 );
}
if( IsDlgButtonChecked( hDlg, IDC_LIGHT_VIRT_RADIO ) == BST_CHECKED )
{
nDefaultRadio = IDC_LIGHT_VIRT_RADIO;
EndDialog( hDlg, 2 );
}
return TRUE; // Message handled
}
break;
}
return FALSE; // Message not handled
}
So easy,很简单吧,对于一些参数设置窗体有时候还是很值得借鉴的,不仅代码量少,而且容易维护。不过这种做法,打破了“对象”设计思想,编码时尽量少用全局变量还是不碍事的!