游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3112|回复: 4

WIn32API编程高手进

[复制链接]

56

主题

758

帖子

768

积分

高级会员

Rank: 4

积分
768
发表于 2011-7-5 10:51:00 | 显示全部楼层 |阅读模式
如何在文本框内容改变前截获用户向文本框输入的字符(包括汉字)?或者怎么样能使文本框只接受数字和小数点的输入?请高手解答,关于api编程的问题

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2011-7-7 14:22:00 | 显示全部楼层

Re:WIn32API编程高手进

google搜的,子类化,处理WM_CHAR消息
http://www.cnblogs.com/weiqubo/archive/2011/06/09/2076488.html

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2011-7-7 14:26:00 | 显示全部楼层

Re:WIn32API编程高手进




  1. WNDPROC oldProc = NULL;

  2. INT_PTR CALLBACK EditProc(HWND hEdit, UINT message, WPARAM wParam, LPARAM lParam)
  3. {
  4.     if (message == WM_CHAR)
  5.     {
  6.         int c = (int)wParam;
  7.         if (c != VK_BACK && c != '.' && (c < '0' || c > '9'))
  8.             return (INT_PTR)TRUE;
  9.     }

  10.     return CallWindowProc(oldProc, hEdit, message, wParam, lParam);
  11. }

  12. INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  13. {
  14.         UNREFERENCED_PARAMETER(lParam);
  15.         switch (message)
  16.         {
  17.         case WM_INITDIALOG:
  18.         {
  19.             HWND hEdit = ::GetDlgItem(hDlg, IDC_EDIT1);
  20.             if (hEdit)
  21.             {
  22.                 oldProc = (WNDPROC)::SetWindowLong(hEdit, GWL_WNDPROC, (long)EditProc);
  23.             }
  24.         }
  25.                 return (INT_PTR)TRUE;

  26.         case WM_COMMAND:
  27.                 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  28.                 {
  29.                         EndDialog(hDlg, LOWORD(wParam));
  30.                         return (INT_PTR)TRUE;
  31.                 }
  32.                 break;
  33.         }
  34.         return (INT_PTR)FALSE;
  35. }

  36. int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
  37. {
  38.     return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
  39. }


复制代码


大概是这意思。不过这样不够,因为能输入多个小数点

56

主题

758

帖子

768

积分

高级会员

Rank: 4

积分
768
 楼主| 发表于 2011-7-7 19:21:00 | 显示全部楼层

Re:WIn32API编程高手进

我的思路是接受文本框EN_CHANGE消息,然后对文本框内容分析,去掉其他字符,不过光标的位置不好控制。好在勉强实现我的目的了。
case WM_COMMAND:
                if(LOWORD(wParam)>=ID_TEXT && LOWORD(wParam)<ID_TEXT + 24 && HIWORD(wParam)==EN_UPDATE)
                {
                       
                        char str[20];
                        GetWindowText((HWND)lParam,str,20);
                        if(FormatString(str)!=TRUE)
                        {
                                int istart,iend;
                                SendMessage((HWND)lParam,EM_GETSEL,(WPARAM)&istart,(LPARAM)&iend);
                                SetWindowText((HWND)lParam,str);
                                SendMessage((HWND)lParam,EM_SETSEL,istart-1,iend-1);
                        }
                }

BOOL FormatString(char *s)
{
        BOOL b=TRUE;
        BOOL dot=FALSE;
        for(int i=0,j=0;i<20;i++)
        {
                if(s=='\0')break;
                if((s>='0' && s<='9') || s=='.')
                {
                        if(s=='.')
                        {
                                if(dot==TRUE){b=FALSE;continue;}
                                else dot=TRUE;
                        }
                        s[j]=s;
                        j++;
                }
                else
                {
                        b=FALSE;
                }
        }
        s[j]='\0';
        return b;
}

56

主题

758

帖子

768

积分

高级会员

Rank: 4

积分
768
 楼主| 发表于 2011-7-7 19:28:00 | 显示全部楼层

Re: Re:WIn32API编程高手进

ljm: Re:WIn32API编程高手进

google搜的,子类化,处理WM_CHAR消息
http://www.cnblogs.com/weiqubo/archive/2011/06/09/2076488.html


ljm兄的推荐正是我想要的,非常感谢!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 10:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表