MFC鼠标显示坐标的问题 100
我按照这个流程走下来的但是在结尾运行到pStatusBar->SetPaneText(1,str);处程序中断提示ASSERT_VALIDfailswithillegal...
我按照这个流程走下来的 但是在结尾运行到pStatusBar->SetPaneText(1,str);处
程序中断 提示ASSERT_VALID fails with illegal vtable pointer.
1.在MainFrm.cpp中找到状态栏静态数组,并添加ID_INDICATOR_
XXX.如下:
static UINTindicators[] =
{
ID_SEPARATOR,// status line indicator
//一般添加在第一条之后,也就是此处
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
2.打开串表编辑器,双击空白处。在弹出来的属性框中,ID处填在静态数组中命名的ID(即第一步中的ID_INDICATOR_XXX),Caption处填x:xxxx,y:yyyy(定义窗格数据输出格式及长度)。
3.打开头文件view.h,在消息处理函数声明宏中添加afx_msg void OnUpdate(CCmdUI *pCmdUI);如下:
protected:
//{{AFX_MSG(CLi5_11View)
afx_msg voidOnUpdate(CCmdUI *pCmdUI);(此处)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
4.打开头文件MainFrm.h,将系统默认状态栏对象m_wndStatusBar的访问类型改为Public。
5.在view.cpp中,在消息映射表中添加代码ON_UPDATE_COMMAND_UI(ID_INDICATOR_XXX,OnUpdate)
BEGIN_MESSAGE_MAP(CLi5_11View,CView)
//{{AFX_MSG_MAP(CLi5_11View)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_XXX,OnUpdate)(添加在此)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)
END_MESSAGE_MAP()
6.在view类下添加函数:
void CLi5_11View::OnUpdate(CCmdUI*pCmdUI)
{
pCmdUI->Enable();
}
7.在view类中添加WM_MAOSEMOVE这一消息处理函数,并在其中添加如下代码:
voidCLi5_11View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler codehere and/or call default
CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar*pStatusBar=&(pFrame->m_wndStatusBar);
CString str;
str.Format("x:%d,y:%d",point.x,point.y);
pStatusBar->SetPaneText(1,str);
CView::OnMouseMove(nFlags, point);
}
求指导!!!!!!可加分 展开
程序中断 提示ASSERT_VALID fails with illegal vtable pointer.
1.在MainFrm.cpp中找到状态栏静态数组,并添加ID_INDICATOR_
XXX.如下:
static UINTindicators[] =
{
ID_SEPARATOR,// status line indicator
//一般添加在第一条之后,也就是此处
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
2.打开串表编辑器,双击空白处。在弹出来的属性框中,ID处填在静态数组中命名的ID(即第一步中的ID_INDICATOR_XXX),Caption处填x:xxxx,y:yyyy(定义窗格数据输出格式及长度)。
3.打开头文件view.h,在消息处理函数声明宏中添加afx_msg void OnUpdate(CCmdUI *pCmdUI);如下:
protected:
//{{AFX_MSG(CLi5_11View)
afx_msg voidOnUpdate(CCmdUI *pCmdUI);(此处)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
4.打开头文件MainFrm.h,将系统默认状态栏对象m_wndStatusBar的访问类型改为Public。
5.在view.cpp中,在消息映射表中添加代码ON_UPDATE_COMMAND_UI(ID_INDICATOR_XXX,OnUpdate)
BEGIN_MESSAGE_MAP(CLi5_11View,CView)
//{{AFX_MSG_MAP(CLi5_11View)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_XXX,OnUpdate)(添加在此)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)
END_MESSAGE_MAP()
6.在view类下添加函数:
void CLi5_11View::OnUpdate(CCmdUI*pCmdUI)
{
pCmdUI->Enable();
}
7.在view类中添加WM_MAOSEMOVE这一消息处理函数,并在其中添加如下代码:
voidCLi5_11View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler codehere and/or call default
CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar*pStatusBar=&(pFrame->m_wndStatusBar);
CString str;
str.Format("x:%d,y:%d",point.x,point.y);
pStatusBar->SetPaneText(1,str);
CView::OnMouseMove(nFlags, point);
}
求指导!!!!!!可加分 展开
展开全部
MFC很久没写了,忘的差不多了,不过看你的程序
CStatusBar*pStatusBar=&(pFrame->m_wndStatusBar);
为什么要取地址,通过pFrame->m_wndStatusBar得到的就是地址吧。把&去掉应该就行了。
或者直接改成这样
CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CString str;
str.Format("x:%d,y:%d",point.x,point.y);
(pFrame->m_wndStatusBar)->SetPaneText(1,str);
CView::OnMouseMove(nFlags, point);
应该就好了
CStatusBar*pStatusBar=&(pFrame->m_wndStatusBar);
为什么要取地址,通过pFrame->m_wndStatusBar得到的就是地址吧。把&去掉应该就行了。
或者直接改成这样
CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CString str;
str.Format("x:%d,y:%d",point.x,point.y);
(pFrame->m_wndStatusBar)->SetPaneText(1,str);
CView::OnMouseMove(nFlags, point);
应该就好了
追问
兄弟 按你说的那么改了
编译通不过啊 原来的程序就是为了获得m_wndStatusBar的地址
我看了好几个版本都是这么做的
能再帮忙想点儿办法吗 着急用 好了一定加分~
追答
用这段代码替换你的显示代码
CMainFrame *pWnd = (CMainFrame*)(::AfxGetApp()->m_pMainWnd);
CString str;
str.Format("x:%d,y:%d",point.x,point.y);
pWnd->m_wndStatusBar.SetPaneText(1,str);
pWnd->m_wndStatusBar.Invalidate();
展开全部
看看CMainFrame中的
OnCreate(LPCREATESTRUCT lpCreateStruct)
中有没有类似的代码,
if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
如果没有,说明你还没有创建,说明指针是无效的或者数组越界。
OnCreate(LPCREATESTRUCT lpCreateStruct)
中有没有类似的代码,
if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
如果没有,说明你还没有创建,说明指针是无效的或者数组越界。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
跟踪 pStatusBar->SetPaneText(1,str);这条语句应该能找到原因
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询