INT_PTR CALLBACK DialogProc(
_In_  HWND hwndDlg,
_In_  UINT uMsg,
_In_  WPARAM wParam,
_In_  LPARAM lParam
)
{

 switch(uMsg)
 {
 case WM_INITDIALOG:
 SetWindowLong(hwndDlg,GWL_WNDPROC,(LONG)EditProc);  return TRUE;
 break;
 case WM_CLOSE:
 DestroyWindow(hwndDlg);
 return TRUE;
 break;
 case WM_COMMAND:  if( (LOWORD(wParam)==IDOK)  ||  (LOWORD(wParam)==IDCANCEL) )
 {  DestroyWindow(hwndDlg);
 return TRUE;
 }  break;  case WM_DESTROY:
 PostQuitMessage(0);
 return TRUE;
  default:
 return  FALSE;
 }
return FALSE;
}INT_PTR CALLBACK EditProc(HWND  hwnd, UINT  msg, WPARAM wp, LPARAM lp)
{
switch(msg)
{
case WM_CHAR: {
WORD nCode=LOWORD(wp);
if( (nCode>='0') && (nCode<='9'))
{
//这里如何处理??
return DefWindowProc(hwnd,msg,wp,lp);
}
}
break; default:
return  DefWindowProc(hwnd,msg,wp,lp); }
return  DefWindowProc(hwnd,msg,wp,lp);
}
目标: 限制对话框上的编辑框的字符输入,只运行输入数字。结果:俺发现,关闭对话框的时候, wm_close似乎没有相应。也就说, 子类化操作似乎无法让 对话框的窗口函数正常工作了。

解决方案 »

  1.   

    修改为:  SetWindowLong(GetDlgItem(hwndDlg,IDC_EDIT1),GWL_WNDPROC,(LONG)EditProc) 可以关闭对话框了。
    但是编辑框不能够输入了。另外:程序启动的时候,竟然处于最小化状态。奇葩啊, 最小化状态都出现了。
      

  2.   


    INT_PTR CALLBACK EditProc(HWND  hwnd, UINT  msg, WPARAM wp, LPARAM lp)
    {
    switch(msg)
    {
    case WM_CHAR: {
    WORD nCode=LOWORD(wp);
    if( (nCode>='0') && (nCode<='9'))
    {
    //这里如何处理??
    return DefWindowProc(hwnd,msg,wp,lp);
    }
    }
    break; default:
    return  CallWindowProc((WNDPROC)oldWndProc,hwnd,msg,wp,lp); }
    return  CallWindowProc((WNDPROC)oldWndProc,hwnd,msg,wp,lp);
    }
    改成这个, 可以输入文字了,但是限制不住啊。什么情况???
      

  3.   

    case WM_CLOSE:
     EndDialog(hwndDlg,FALSE);if(!( (nCode>='0') && (nCode<='9')))         {
     return 0;       
    }还有subclass要CallWindowProc()将消息传到上级的,有一个消息链的概念,不是DefWindowProc.