我的代码没有任何反应,m_hWnd始终为空值,为什么?
如下:
long lStyle;
lStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
lStyle &= WS_DISABLED;
lStyle |= WS_CAPTION;
//lStyle |= WS_OVERLAPPEDWINDOW; ::SetWindowLong(m_hWnd, GWL_STYLE, lStyle);
hMenu = ::LoadMenu( _pModule->GetModuleInstance(),MAKEINTRESOURCE(IDR_MENU_MAIN));
::SetMenu(this->m_hWnd, hMenu);
LRESULT CBox::OnRButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
POINT pt; ::GetCursorPos(&pt); 
::TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, pt.x, pt.y, m_hWnd, NULL); 
return 0;
}

解决方案 »

  1.   


    前面那段代码放的位置不对~放到创建完成后的地方,或者干脆放到CBox::OnRButtonUp
      

  2.   

    使用下面的代码试下:HMENU hMenu;
    hMenu=CreatePopupMenu();
    AppendMenu(hMenu, MF_STRING, 1, "test1");
    AppendMenu(hMenu, MF_STRING, 2, "test2");
    CPoint ptDown;
    GetCursorPos(&ptDown);
    reval=TrackPopupMenu(hMenu,TPM_TOPALIGN | TPM_RETURNCMD,ptDown.x,ptDown.y,NULL,m_hWnd,NULL);
      

  3.   

    不好意思,刚才看错了将下面的代码放在OnRButtonUp方法的开始部分:
    hMenu = ::LoadMenu( _pModule->GetModuleInstance(),MAKEINTRESOURCE(IDR_MENU_MAIN)); 
      

  4.   

    放到CBox::OnRButtonUp里试过,也没用,估计还是因为m_hWnd为空值,为啥?
      

  5.   

    补充:m_hWnd这个变量赋值是在CreateControlWindow函数中进行的。
    ATL运行完CreateControlWindow后m_hWnd才会有值。
      

  6.   

    应该这样创建窗口:HWND CBox::CreateControlWindow(HWND hWndParent, RECT& rcPos)
    {
        return Create(hWndParent, rcPos, NULL,
                WS_CHILD | WS_VISIBLE, WS_EX_TRANSPARENT);  //for windowed mode
    }
      

  7.   

    把原来设置窗口样式的代码注释掉。lStyle &= WS_DISABLED //这个为什么这样处理?
      

  8.   

    CreateControlWindow ??哪有这个函数?怎么得来?
      

  9.   

    需要重载:头文件中定义:
    virtual HWND CreateControlWindow(HWND hWndParent, RECT& rcPos);CPP文件中实现:
    HWND CBox::CreateControlWindow(HWND hWndParent, RECT& rcPos)
    {
        return Create(hWndParent, rcPos, NULL,
                WS_CHILD | WS_VISIBLE, WS_EX_TRANSPARENT);  //for windowed mode
    }
      

  10.   

    重写了,但是根本不调用这个函数
    难道你是说在容器段人工调用CreateControlWindow?
      

  11.   

    看来是你创建此控件使用向导时就已经有问题了。
    如果正确CreateControlWindow函数会自动调用的。再使用向导创建一次,要创建有窗口的控件。
      

  12.   

    有哪位大哥知道啊?m_hWnd为空值为啥?
      

  13.   

    CMenu menu;
        menu.LoadMenu(IDR_MENU1); //读取资源
    menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
    point.x, point.y, this) ;
      

  14.   

    把你继承接口帖下吧,例如:
    public IOleControlImpl<CBox>,
      

  15.   

    谢谢,fengrx 
    class ATL_NO_VTABLE CBox : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CStockPropImpl<CBox, IBox>,
    public IPersistStreamInitImpl<CBox>,
    public IOleControlImpl<CBox>,
    public IOleObjectImpl<CBox>,
    public IOleInPlaceActiveObjectImpl<CBox>,
    public IViewObjectExImpl<CBox>,
    public IOleInPlaceObjectWindowlessImpl<CBox>,
    public ISupportErrorInfo,
    public IConnectionPointContainerImpl<CBox>,
    public CProxy_IBoxEvents<CBox>, 
    public IPersistStorageImpl<CBox>,
    public ISpecifyPropertyPagesImpl<CBox>,
    public IQuickActivateImpl<CBox>,
    public IDataObjectImpl<CBox>,
    public IProvideClassInfo2Impl<&CLSID_Box, &__uuidof(_IBoxEvents), &LIBID_MyStaticLib>,
    public CComCoClass<CBox, &CLSID_Box>,
    public CComControl<CBox>
      

  16.   

    fengrx 拜托你自己写个小程序试试吧,我用的是vs.net 2003
      

  17.   

    我已经有现成的项目,是个ATL印章控件,也有弹出右键菜单,是VS2005写的。很正常,我把我里边和弹出菜单相关的内容都告诉你了。下面是我控件的接口引用部分:class ATL_NO_VTABLE CResoftSignCtrl : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IResoftSignCtrl, &IID_IResoftSignCtrl, &SEAL_LIB_ID, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IPersistStreamInitImpl<CResoftSignCtrl>,
    public IOleControlImpl<CResoftSignCtrl>,
    public IOleObjectImpl<CResoftSignCtrl>,
    public IOleInPlaceActiveObjectImpl<CResoftSignCtrl>,
    public IViewObjectExImpl<CResoftSignCtrl>,
    public IOleInPlaceObjectWindowlessImpl<CResoftSignCtrl>,
    public ISupportErrorInfo,
    public IConnectionPointContainerImpl<CResoftSignCtrl>,
    public CProxy_IResoftSignCtrlEvents<CResoftSignCtrl>, 
    public IPersistStorageImpl<CResoftSignCtrl>,
    public ISpecifyPropertyPagesImpl<CResoftSignCtrl>,
    public IQuickActivateImpl<CResoftSignCtrl>,
    public IDataObjectImpl<CResoftSignCtrl>,
    public IProvideClassInfo2Impl<&CLSID_ResoftSignCtrl, &__uuidof(_IResoftSignCtrlEvents), &SEAL_LIB_ID>,
    public IPropertyNotifySinkCP<CResoftSignCtrl>,
        public ICategorizeProperties,
    public IObjectSafetyImpl<CResoftSignCtrl,INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>,
    public CComCoClass<CResoftSignCtrl, &CLSID_ResoftSignCtrl>,
    public CComControl<CResoftSignCtrl>
    {
      

  18.   

    ::SetWindowLong(m_hWnd, GWL_STYLE, lStyle); 
    hMenu = ::LoadMenu( _pModule->GetModuleInstance(),MAKEINTRESOURCE(IDR_MENU_MAIN)); 
    HMENU hPopupMenu = ::GetSubMenu(hMenu, 0);
    ::SetMenu(this->m_hWnd, hPopupMenu);  
    LRESULT CBox::OnRButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) 

    POINT pt; ::GetCursorPos(&pt); 
    ::TrackPopupMenuEx(hPopupMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, pt.x, pt.y, m_hWnd, NULL); 这样用。
      

  19.   

    我已经说了,关键是this->m_hWnd始终为空值才弹不出菜单,为啥会为空值?
      

  20.   

    构造函数中加上m_bWindowOnly   =   TRUE;就OK了