我如何从一个窗口句柄HWND,来判断这个窗体是view,还是frame,还是dialog,请给出相应的sdk。
    祝:国庆快乐,大家玩好。

解决方案 »

  1.   

    HWND h;
    if( (CWnd::FromHandle(h))->IsKindOf(...) )见MSDN。
      

  2.   

    IsKindOf返回的只是判别是否是CObject或其继承类,无法再细划分,请高手指点。
      

  3.   

    哇!这里这么多的高手嗦?我也来挤一挤!
    IsKindOf
      

  4.   

    怎么不能细分,你判断它是不是ISKINDOF(C*VIEW),ISKINDOF(CDIALOG)就可以啊?
      

  5.   

    各位高手,IsKindOf好象只能在本进程中使用,但我做了一个小程序,其中的一段是通过剪贴版来得到窗体句柄,再从这个句柄来判断是CDialog,还是CView或CFrameWnd,用了IsKindOf有断言,请指教,原程序如下:if(::OpenClipboard(NULL))
    {
      HWND hClipboardWnd = ::GetClipboardOwner();
      CWnd* pCwnd = CWnd::FromHandle(clipboardWnd);
      ASSERT(pCwnd->IsKindOf(RUNTIME_CLASS(CView)));
    }
    烦请高手调试一下,谢谢。
      

  6.   

    IsKindOf,
    国庆同喜!!
    IsKindOf,
    国庆同喜!!
      

  7.   

    haha,肯定给分,没有一个肯调一下的吗?
      

  8.   

    CWnd* pCwnd = CWnd::FromHandle(clipboardWnd);
    这一句得到的却是NULL,是从断言中得到的,但不知为何?
      

  9.   

    if(::OpenClipboard(NULL))
    {
      HWND hClipboardWnd = ::GetClipboardOwner();
      CWnd* pCwnd = CWnd::FromHandle(hclipboardWnd);//写错了
      ASSERT(pCwnd->IsKindOf(RUNTIME_CLASS(CView)));
    }
      

  10.   

    使用一个API函数 getclassname来判断这个句柄的类,就可以知道他是什么了!!
      

  11.   

    使用一个API函数 getclassname来判断这个句柄的类,就可以知道他是什么了!!
      

  12.   

    cgb405(皮皮龙):但这个api得到的是这个窗体句柄的确切的类名,我的程序是从剪贴板中得到的,不知它的具体类名,无法用这个api,只是判断一下是不是从CDialog,或CFrameWnd,CView继承的类或其它的。
      

  13.   

    各位高手,IsKindOf好象只能在本进程中使用,但我做了一个小程序,其中的一段是通过剪贴版来得到窗体句柄,再从这个句柄来判断是CDialog,还是CView或CFrameWnd,用了IsKindOf有断言,请指教,原程序如下:if(::OpenClipboard(NULL))
    {
      HWND hClipboardWnd = ::GetClipboardOwner();
      CWnd* pCwnd = CWnd::FromHandle(hclipboardWnd);//这一句得到的却是NULL,是从断言中得到的,但不知为何?  ASSERT(pCwnd->IsKindOf(RUNTIME_CLASS(CView)));
    }
    烦请高手调试一下,谢谢。
      

  14.   

    我也有一点想法,可能上面已经提过,不过我试过好.
        IsKindOf
      

  15.   

    楼上的试过了吗?我编译链接都通过了,就是出现了我说过的问题。
    if(::OpenClipboard(NULL))
    {
      HWND hClipboardWnd = ::GetClipboardOwner();
      CWnd* pCwnd = CWnd::FromHandle(hClipboardWnd);//这一句得到的却是NULL,是从断言中得到的,但不知为何?  ASSERT(pCwnd->IsKindOf(RUNTIME_CLASS(CView)));
    }
      

  16.   

    HWND hClipboardWnd = ::GetClipboardOwner();这一句有没有问题?
      

  17.   

    wacky (笨笨狗) 的"简单"问题难倒众高手.
    wacky (笨笨狗) 高手高手啊!!
      

  18.   

    lw_yx(刚学会走,还不想跑.这就是我^-^):不是问题的复杂,是高手们不消回答如此简单的问题吧,给分的。
      

  19.   

    自己已经搞定了,给分,并祝各位在剩余的假日里玩儿高兴。if(::OpenClipboard(NULL))
    {
      HWND hClipboardWnd = ::GetClipboardOwner();
      CWnd* pCwnd = new CWnd;
      pCwnd->Attach(hClipboardWnd);
      pCwnd->IsKindOf(RUNTIME_CLASS(CWnd));
    }
      

  20.   

    还有再提一个问题,有点儿难度:
    如果我从基于CView类继承的类的事例中向剪贴板中写入内容,用
    HWND hClipboardWnd = ::GetClipboardOwner();
    得到视窗体的句柄,为何用pCwnd->IsKindOf(RUNTIME_CLASS(CView));得到的是FALSE???而用pCwnd->IsKindOf(RUNTIME_CLASS(CWnd));得到的是TRUE(此句是对的,因为CView是CWnd的继承类)。请高手指点。
      

  21.   

    if(::OpenClipboard(NULL))
    {
      HWND hClipboardWnd = ::GetClipboardOwner();
      CWnd* pCwnd = new CWnd;
      pCwnd->Attach(hClipboardWnd);
      pCwnd->IsKindOf(RUNTIME_CLASS(CWnd));
    }你的PCWND是CWND类指针,应该和这个有关。
    MSDN里关于 ISKINDOF有一句话:
    Do not use this function extensively because it defeats the C++ polymorphism feature. Use virtual functions instead.
      

  22.   

    所说的VIRTUAL FUNCTION,大约是 virtual CRuntimeClass* GetRuntimeClass( ) const;
      

  23.   

    楼上的说的很详细了,iskindof
      

  24.   

    看来IsKindOf并不是那么灵验呀,还的自定义虚函数。
      

  25.   

    everandforever(Forever):问题不是pCWnd,我监视了,它确实是指向了hClipboardWnd的窗口。
      

  26.   

    由于pCWnd是CWND指针,所以它调用CWND的ISKINDOF函数,如果你要它调用CVIEW的ISKINDOF,就要借助虚函数了。
      

  27.   

    everandforever(Forever):虽然我定义的是CWnd的指针,但是我将它指向了hClipboardWnd,用了CWnd::Attach,请看msdn,所以它是CWnd或其继承类的指针,请调试后在说。IsKindOf不是虚函数,故无法调用其继承类的IsKindof.
    每一位学习面向对象编程的都应该会虚函数,是多态性最基本的表现形式,还是建议先看看面向对象编程的书吧。
      

  28.   

    A ?WHAT ARE YOU TALKING ABOUT?由于pCWnd是CWND指针,所以它调用CWND的ISKINDOF函数,如果你要它调用CVIEW的ISKINDOF,就要借助虚函数了。————————————————
    DOES THESE WORDS MATTER?
      

  29.   

    所以它调用CWND的ISKINDOF函数这句话有错么?
      

  30.   

    没有错,但如果IsKindOf是虚函数,结果就不会这样了。
      

  31.   

    不好意思:"由于pCWnd是CWND指针"改为“由于pCWnd是CWND指针或其继承类的指针”就好了。咳,我的计算机脑袋。
      

  32.   

    CWnd* pCwnd = CWnd::FromHandle(hClipboardWnd);//这一句得到的却是NULL,是从断言中得到的,但不知为何?我不懂,现在也没法试一试,是不是由于hClipboardWnd是指向一个窗体的句柄,而一个窗体句柄只是一个窗口类cwnd的成员,你没有分配cwnd对象,导致了函数调用返回的错误。
      

  33.   

    楼上有道理,或许没有CWND和那个HANDLE关联,所以返回NULL
      

  34.   

    CWnd::FromHandle(hClipboardWnd)这个函数似乎不能传递指针,返回的是空指针,我用了CWnd::Attach()就可以。
      

  35.   

    这个问题和是不是CWnd的指针无关,重要的是怎样将IsKindOf的功能用虚函数表达。
      

  36.   

    有这个函数嘛:
    virtual CRuntimeClass* GetRuntimeClass( ) const
      

  37.   

    将句柄关联还是用CWnd::Attach(HANDLE)比较好。
      

  38.   

    好了,结贴,IsKindOf虚化太费脑了。