我的代码没有任何反应,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;
}
如下:
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;
}
解决方案 »
- 关于RTP jrtplib的疑问?
- 学了MFC在学点什么比较好?
- udp接收不到数据,请大家帮我看看程序!
- CByteArray array:关于Setoutput()发送的具体是什么,是array[0],还是整个array数组?
- 怎样通过发送消息来终止其他进程?
- 如何判断字符串是否是数字类型
- 请问如何让一个EXE程序, 当IE启动时它即启动, 当IE关闭时它即关闭 ?
- 如果我从COM+服务器端获得一个在本地客户端已经注册过的coclass的接口,会不会有麻烦?
- ?---? 有关数据库SQL ?----?
- 请问我怎样学好于系统有关的软件制作呢
- 关于软件换肤的认识问题?
- StartServiceCtrlDispatcher返回值的问题?
前面那段代码放的位置不对~放到创建完成后的地方,或者干脆放到CBox::OnRButtonUp
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);
hMenu = ::LoadMenu( _pModule->GetModuleInstance(),MAKEINTRESOURCE(IDR_MENU_MAIN));
ATL运行完CreateControlWindow后m_hWnd才会有值。
{
return Create(hWndParent, rcPos, NULL,
WS_CHILD | WS_VISIBLE, WS_EX_TRANSPARENT); //for windowed mode
}
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
}
难道你是说在容器段人工调用CreateControlWindow?
如果正确CreateControlWindow函数会自动调用的。再使用向导创建一次,要创建有窗口的控件。
menu.LoadMenu(IDR_MENU1); //读取资源
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
point.x, point.y, this) ;
public IOleControlImpl<CBox>,
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>
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>
{
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); 这样用。