另类参数对话框编程(回调函数,消息捕捉)

     在很多情况下,我们为了获取对话框设置的一些参数,通常都是通过类对象中成员来获取,或者直接获取退出时最后点击的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,很简单吧,对于一些参数设置窗体有时候还是很值得借鉴的,不仅代码量少,而且容易维护。不过这种做法,打破了“对象”设计思想,编码时尽量少用全局变量还是不碍事的!

上一篇:Oracle group by 用法实例详解


下一篇:Confluence 6 修改日志文件的大小数量和级别