我上课了。现在的问题是,经过几次尝试,我仍然犯了很大的错误。我的问题是我不知道如何在另一个cpp文件中为这个类正确声明一个新对象。我想从我的其他cpp文件中调用/触发此RebarHandler类中的函数。我继续遇到诸如“未经初始化使用”,“调试断言失败”等问题。
在另一个cpp文件中,我包含了RebarHandler.h并且这样做:
CRebarHandler *test=NULL;
test->setButtonMenu2();
编译时,我不会给出任何错误。但是,在运行时,它会出错并且我的IE崩溃了。我需要帮助。
以下是我的意思:
#pragma once
class CIEWindow;
class CRebarHandler : public CWindowImpl<CRebarHandler>{
public:
CRebarHandler(HWND hWndToolbar, CIEWindow *ieWindow);
CRebarHandler(){};
~CRebarHandler();
BEGIN_MSG_MAP(CRebarHandler)
NOTIFY_CODE_HANDLER(TBN_DROPDOWN, onNotifyDropDown)
NOTIFY_CODE_HANDLER(TBN_TOOLBARCHANGE, onNotifyToolbarChange)
NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, onNotifyCustomDraw)
NOTIFY_CODE_HANDLER(TBN_ENDADJUST, onNotifyEndAdjust)
MESSAGE_HANDLER(WM_SETREDRAW, onSetRedraw)
END_MSG_MAP()
// message handlers
LRESULT onNotifyDropDown(WPARAM wParam, LPNMHDR pNMHDR, BOOL& bHandled);
LRESULT onNotifyToolbarChange(WPARAM wParam, LPNMHDR pNMHDR, BOOL& bHandled);
LRESULT onNotifyCustomDraw(WPARAM wParam, LPNMHDR pNMHDR, BOOL& bHandled);
LRESULT onNotifyEndAdjust(WPARAM wParam, LPNMHDR pNMHDR, BOOL& bHandled);
LRESULT onSetRedraw(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// manage the subclassing of the IE rebar
void subclass();
void unsubclass();
void handleSettings();
void setButtonMenu2();
bool findButton(HWND hWndToolbar);
private:
// handles to the various things
HWND m_hWnd;
HWND m_hWndToolbar, m_hWndRebar, m_hWndTooltip;
HMENU m_hMenu;
int m_buttonID;
int m_ieVer;
CIEWindow *m_ieWindow;
// toolbar finding functions
void scanForToolbarSlow();
void getRebarHWND();
void setButtonMenu();
};
答案 0 :(得分:1)
CRebarHandler
的作用并不重要,这些行很糟糕:
CRebarHandler *test=NULL;
test->setButtonMenu2();
你有这个指针,你首先说“它没有指向任何东西”,然后你说“继续使用指针指向的东西,设置按钮菜单。”不会发生。
尝试:
CRebarHandler test;
test.setButtonMenu2();
或
CRebarHandler test= new CRebarHandler();
test->setButtonMenu2();
取决于您想要进行测试的生命周期。您可能希望使用constructor-that-takes-parameters而不是默认构造函数。我的观点是你必须有CRebarHandler
才能在其上调用方法。