我用createwindowex()创建了10个edit,怎么设置他们的TAB属性?就是按“tab”键时转换Focus。在wm_command中吗?有没有程序?谢谢!

解决方案 »

  1.   

    菜鸟问的很菜的问题,一分钟就能搞定,谁先给sourcecode,100分马上给他。谢谢!
      

  2.   

    太简单了,你按CTRL+D,那些出现的兰色数字就是TAB顺序了,按照你想排的顺序逐个点就可以了
      

  3.   

    MSG msg;
    peakMessage(&msg,childhwnd,WM_KEYFIRL,WM_KEYLAST,PM_REMOVE);
    int key=(int)msg.wParam;
    if(key==VK_TAB){
       ....
       ...
       }可以用这个peekMessage()吗?在哪里用?我怎么用着不行,望高手+低手赐教。   
      

  4.   

    对不起,忘记说了:不用MFC,用sdk.
      

  5.   

    用MFC可以用CTRL+T对资源进行编辑啊。
      

  6.   

    这么累呀,都20世纪了。呵呵。
    试试这个:
    首先,在创建EDIT时,用SetProp给每个EDIT窗口附加一段数据,比如编号什么的,
    然后在if(key==VK_TAB){}中按顺序给他们SetFocus,最后别忘了RemoveProp。
      

  7.   

    楼上说的不对。在Edit窗口按TAB键时,通常其父窗口是收不到它的键盘消息的。通常有两种方法解决这个问题。方法一: SubClass Edit窗口,当收到 WM_KEYDOWN消息且 wParam == VK_TAB 时给父窗口发送一个消息,父窗口根据这个消息来设置相应的Focus.方法二: 设置全局变量,记下这些Edit窗口的句柄,在主窗口的Message Loop判断这些窗口的WM_KEYDOWN消息,然后设置相应的Focus.TangSe好象不是菜鸟啊 :-)
      

  8.   

    呵呵,怎么会收不到,又不是用MFC,所有的消息都会发给线程的消息队列,自己peek不就成了。
      

  9.   

    >>DaQiangZi(大强子)和xxxbird(*说你行,你就行,不行也行*):
       能否详细一点?我的edit是这样创建的:
    HWND hwndedit[20];
    for(int o=0;i<20li++){
       hwndedit[i]=CreateWindow("edit","this is an edit control",...(HMENU)i....);
    }
    SetFocus(hwndedit[0]);可以在WM_COMMAND消息中取得按键信息吗?当然他们的ID是可以得到的。我用peekMessage()
    得不到按键消息。而WM_KEYDOWN消息只是焦点在窗口上时按键才触发。在edit中按键并不触发
    wm_keydown消息。大虾们,帮帮这个菜鸟吧感激涕淋
      

  10.   

    我试了,父窗口是收不到它的子窗口得键盘消息的。怎么办?高手给点source code,给俺look,look,感激不尽
      

  11.   

    Here is a example of SubClass Method:CALLBACK cbWndProc[20]; for (i)
    {
    hwndedit[i] = CreateWindowEx(....);
    SetWindowLong (hwndedit[i], GWL_USERDATA, (LONG)i);
    cbWndProc[i] = SetWindowLong (hwndedit[i], GWL_WNDPROC, EditSubClassProc);
    }SetFocus(hwndedit[0]);
    /* ... */
    LRESULT CALLBACK EditSubClassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
         LRESULT lResult = 0;
         LONG    index;
      
         index = GetWindowLong (hWnd, GWL_USERDATA);
         
         if (uMsg == WM_KEYDOWN && wParam == VK_TAB)
         {
             SendMessage (GetParent(hWnd), WM_COMMAND, TABMSG, GetWindowLong(hWnd, GWL_USERDATA);
         }
         lResult = CallWindowProc (cbWndProc[index], hwndedit[index], uMsg, wParam, lParam);
         return lResult;
    }
      

  12.   

    Continue:In the Parent WndProc:case WM_COMMAND:
        if (wParam == TABMSG)
        {
        /* now the lParam is the editbox index,
           call SetFocus() ....
        */
        }
        break;You should define TABMSG yourself.
      

  13.   

    xxxbird(*说你行,你就行,不行也行*) :
    非常感谢,我测试可以的话,马上给分。
      

  14.   

    》xxxbird(*说你行,你就行,不行也行*) :
     我改了一些地方,如(
    typedef int (__stdcall *function)(void);//(void *,USHORT,USHORT,long);
    function cbWndProc[16];
    }等,然后调试通过,可是按TAB键时,产生的空格怎么办?怎么去除上一个edit中产生的空格?也就是说不让windows处理该消息?
      

  15.   

    》xxxbird(*说你行,你就行,不行也行*) :
        请大虾教我谢谢!
      

  16.   

        if (uMsg == WM_KEYDOWN && wParam == VK_TAB)
    我上面写的只有实现的思想,具体的细节是有可能不太对的。
    如是不要空格,将上述过程作如下修改:    {
            SendMessage (GetParent(hWnd), WM_COMMAND, TABMSG, GetWindowLong(hWnd, GWL_USERDATA);
        }
        else
            lResult = CallWindowProc (cbWndProc[index], hwndedit[index], uMsg, wParam, lParam);
        
      

  17.   

    这样不行,我已经试过,本来把result设为0可以不让windows处理消息的,但是我把它社为0,还是不行,怎么回事?
      

  18.   

    并且在wm_command中,处理完后直接return 0;也不行。你能否测试一下?
      

  19.   

    Try this:LRESULT CALLBACK EditSubClassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        LRESULT lResult = 0;
        LONG    index;
      
        index = GetWindowLong (hWnd, GWL_USERDATA);
        if (uMsg == WM_KEYDOWN && wParam == VK_TAB)
        {
            SendMessage (GetParent(hWnd), WM_COMMAND, TABMSG, GetWindowLong(hWnd, GWL_USERDATA);
        }
        else if (!(uMsg == WM_KEYUP && wParam == VK_TAB))
            lResult = CallWindowProc (cbWndProc[index], hwndedit[index], uMsg, wParam, lParam);
        return lResult;
    }
      

  20.   

    这样不行,我已经试过,本来把result设为0可以不让windows处理消息的,但是我把它社为0,还是不行,怎么回事? 这种说法是不对的,将result设为0并不能让Windows不处理消息。实际上空格是在WM_KEYUP && wParam == VK_TAB 时产生的,我最早给你的例子中忽略了这种情况。
      

  21.   

    还是不行耶,老大。无论如何,按TAB键都会产生空格,怎么办?
      

  22.   

    下面这个例子是我从MSDN的GENERIC例子改过来的,我已经删除了与主题无关的内容。我测试过是没有问题的。你试试看吧。主要的思想就是替换EditBox的窗口过程,截取处理TAB键"按下(WM_KEYDOWN)"和"放开(WM_KEYUP)"时的消息。基本思想没有问题,你再检查一下的程序吧。#define TABMSG          888 
    #define EDITBOX_COUNT   10HWND    hwnd[EDITBOX_COUNT];
    WNDPROC cbWndProc[EDITBOX_COUNT];LRESULT CALLBACK EditSubClassProc (HWND, UINT, WPARAM, LPARAM);//
    //  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       int wmId, wmEvent;
       PAINTSTRUCT ps;
       HDC hdc;
       POINT pnt;
       HMENU hMenu;
       BOOL bGotHelp;   switch (message) {      case WM_CREATE:
          {
            int i ;
            for (i = 0; i < EDITBOX_COUNT; i ++)
            {
                hwnd[i] = CreateWindowEx (WS_EX_CONTROLPARENT,
                    "EDIT", "",
                    WS_CHILD | WS_VISIBLE | WS_BORDER,
                    100, i * 20,
                    100, 15,
                    hWnd, NULL, NULL, NULL);
                SetWindowLong (hwnd[i], GWL_USERDATA, (LONG) i);
                cbWndProc[i] = (WNDPROC)SetWindowLong (hwnd[i], GWL_WNDPROC, (LONG) EditSubClassProc);
            }
            break;
          }      case WM_COMMAND:
             wmId    = LOWORD(wParam); // Remember, these are...
             wmEvent = HIWORD(wParam); // ...different for Win32!         //Parse the menu selections:
             switch (wmId) {
                case TABMSG:
                    SetFocus (hwnd[(lParam + 1) % 10]);
                    break; .....            default:
                   return (DefWindowProc(hWnd, message, wParam, lParam));
             }
             break;      default:
             return (DefWindowProc(hWnd, message, wParam, lParam));
       }
       return (0);
    }
    LRESULT CALLBACK EditSubClassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        LRESULT lResult = 0;
        LONG    index;    index = GetWindowLong (hWnd, GWL_USERDATA);
        if (uMsg == WM_KEYDOWN && wParam == VK_TAB)
        {
            SendMessage (GetParent(hWnd), WM_COMMAND, TABMSG, GetWindowLong(hWnd, GWL_USERDATA));
        }
        else if (!(uMsg == WM_KEYUP && wParam == VK_TAB))
            lResult = CallWindowProc (cbWndProc[index], hwnd[index], uMsg, wParam, lParam);
        return lResult;
    }