vc对话框程序中有四个可以自由拖动的STATIC派生类控件,当拖动两个控件重叠在一起时,如何得到下面那个控件的句柄? 

解决方案 »

  1.   

    得到句柄一般都是用GetDlgItem(ID)得到CWnd *指针,然后用m_hWnd不就能得到句柄了,当然用直接用API也可以:
    ::GetDlgItem(GetSafeHwnd(),ID);就可以直接得到句柄,这个和重叠不重叠没有关系吧
      

  2.   

    得到句柄一般都是用GetDlgItem(ID)得到CWnd *指针,然后用m_hWnd不就能得到句柄了,当然用直接用API也可以:
    ::GetDlgItem(GetSafeHwnd(),ID);就可以直接得到句柄,这个和重叠不重叠没有关系吧
    是的,和重叠没有关系的。
      

  3.   

    GetWindow 
    HWND   GetWindow( 
        HWND   hWnd,     //   handle   to   original   window 
        UINT   uCmd       //   relationship   flag 
    ); 可以把uCmd选为GW_HWNDNEXT
    不知道可以不
      

  4.   

    窗口及子窗口枚举
    UINT   ThreadProc(LPVOID   *pPraram)  
    {  
    while(1){   while(!EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL))break;}  
    return   0;  
    }  BOOL   CALLBACK   EnumWindowsProc(HWND   hwnd,LPARAM   lParam)  
    {  
    char   lpWinTitle[MAX_LINELENGTH];  
    ::GetWindowText(hwnd,lpWinTitle,MAX_LINELENGTH-1);  
    if(strcmp(lpWinTitle,sTitle)==0)//   sTitle:网络登录窗口的窗口名  
    {   gMutex.Lock(INFINITE);//防止两个线程同时操作  
    while(EnumChildWindows(hwnd,(WNDENUMPROC)EnumChildProc,NULL));  
    gMutex.Unlock();  
    return   FALSE;  
    }  
    return   TRUE;  
    }  
    BOOL   CALLBACK   EnumChildProc(   HWND   hwnd,LPARAM   lParam)  
    {  
    char   sChildName[MAX_LINELENGTH];  
    ::GetClassName(hwnd,sChildName,MAX_LINELENGTH-1);  
    file://处理编辑控件,登录窗口中一般只有两个编辑框,可用MicroSoft   Spy++查看窗口的  
    file://各个子窗口  
    //   的属性。通过对比各控件的风格或名字来区别各控件。  
    if(strcmp(sChildName, "Edit ")==0)  
    {  
    DWORD   dWinSty=::GetWindowLong(hwnd,GWL_STYLE);  
    if((dWinSty&ES_PASSWORD)==ES_PASSWORD)//这是密码输入编辑控件  
    {  
    gEventNextPass.SetEvent();//发送“新密码”事件  
    WaitForSingleObject(gEventPassOk,   INFINITE);   file://等待“密码完成”事件  
    gEventPassOk.ResetEvent();   file://复位  
    ::SetDlgItemText(::GetWindowLong(hwnd,GWL_ID),cCurrentPass);  
    file://把新密码填到密码输入框,也可用SetWindowText()  
    bPass=TRUE;//记录密码已填入  
    if(bUser&&(hOk!=NULL))//如果用户名已填入,“确定”按钮已找到。  
    {  
    ::SendMessage(::GetParent(hOk),WM_COMMAND,  
    (WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));  
    file://向“确定”按钮送消息,参照ClassWizard的消息映射  
    bUser=FALSE;bPass=FALSE;hOk=NULL;  
    file://完成一次登录,初始化  
    return   FALSE;  
    }  
    return   TRUE;  
    }  
    file://非此即彼,这是用户名输入编辑控件  
    if((dWinSty&ES_READONLY)!=ES_READONLY)  
    {  
    ::SetDlgItemText(::GetWindowLong(hwnd,GWL_ID),cCurrentPass);  
    file://把新用户名填到用户名输入框,也可用SetWindowText()  
    bUser=TRUE;//   新用户名已填入用户名输入框  
    if(bPass&&(hOk!=NULL))   如果密码已填入,“确定”按钮已找到。  
    {  
    ::SendMessage(::GetParent(hOk),WM_COMMAND,  
    (WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));  
    file://向“确定”按钮送消息,参照ClassWizard的消息映射  
    bUser=FALSE;bPass=FALSE;hOk=NULL;  
    file://完成一次登录,初始化  
    return   FALSE;  
    }  
    }  
    return   TRUE;  
    }  
    file://如果是按钮控件  
    if(strcmp(sChildName, "Button ")==0)  
    {  
    char   sChildTitle[MAX_LINELENGTH];  
    ::GetWindowText(hwnd,sChildTitle,MAX_LINELENGTH-1);  
    if(strcmp(sChildTitle,sButtonOk)!=0)   return   TRUE;  
    //   sButtonOk:登录窗口中“OK”按钮的标题  
    hOk=hwnd;//记录“OK”窗口句柄  
    if(bUser&&bPass)  
    {  
    ::SendMessage(::GetParent(hOk),WM_COMMAND,  
    (WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));  
    file://向“确定”按钮送消息,参照ClassWizard的消息映射  
    bUser=FALSE;bPass=FALSE;hOk=NULL;  
    file://完成一次登录,初始化  
    return   FALSE;  
    }  
    return   TRUE;  
    }  
    return   TRUE;  
    }
      

  5.   

    CStatic派生类重载了OnMouseDown、OnMouseMove、OnMouseUp事件,OnMouseUp发送了消息给对话框。
    对话框中动态创建了四个CStatic派生类控件,我想任意拖动一个控件到其他三个控件上面,在对应OnMouseUp发送消息的对应处理中想得到究竟是哪个控件被重叠了,楼上回复的方法好像无能为力
      

  6.   

    protel里面对于重叠的元件采用弹出列表手动选择的方法。