一个奇怪的问题(谢绝灌水)
最近写一个将要运行在工控机上的程序,因为该工控机只有数字键可以利用,所以我使用了FormView加按钮的方式,在Main Pane和其他各视图间切换。按钮当然使用类似(返回(&0))的方式。
现在发现:
在WIN2K平台下,当使用鼠标和数字键盘可以顺利地切换
在WIN98平台下,使用鼠标时完全正常,但使用数字键时,就会出现user.dll(?)错误信息.但同时,如果该按钮当时如果获得焦点,揿下对应于按钮的快捷数字时,切换是正常的。
调试发现,错误是出现在切换程序完成之后,不知有谁见过这样的事情?
切换代码(一):
/* CView* pOldActiveView = GetActiveView();
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_nCurrentExample);
CRuntimeClass* pNewViewClass;
switch (nView)
{
case IDV_MAIN:
pNewViewClass = RUNTIME_CLASS(CBalanceView);
break;
case IDV_PANE:
pNewViewClass = RUNTIME_CLASS(CPaneView);
break;
case IDV_MODE:
pNewViewClass = RUNTIME_CLASS(CRotatorView);
break;
case IDV_BALANCETEST:
pNewViewClass = RUNTIME_CLASS(CBalanceTestView);
break;
case IDV_SELFTEST:
pNewViewClass = RUNTIME_CLASS(CSelfTestView);
break;
case IDV_TESTRESULT:
pNewViewClass = RUNTIME_CLASS(CTestResultView);
break;
case IDV_HISTORYDATA:
pNewViewClass = RUNTIME_CLASS(CHistoryDataView);
break;
case IDV_CORRECT:
pNewViewClass = RUNTIME_CLASS(CCorrectView);
break;
case IDV_VARI:
pNewViewClass = RUNTIME_CLASS(CVariView);
break;
default:
ASSERT(0);
return;
}
CCreateContext context;
context.m_pNewViewClass = pNewViewClass;
context.m_pCurrentDoc = GetActiveDocument();
CView* pNewView = STATIC_DOWNCAST(CView, CreateView(&context));
if (pNewView != NULL)
{
// the new view is there, but invisible and not active...
pNewView->ShowWindow(SW_SHOW);
pNewView->OnInitialUpdate();
SetActiveView(pNewView);
RecalcLayout();
m_nCurrentExample = nView;
// finally destroy the old view...
pOldActiveView->DestroyWindow();
}
*/
切换代码(二):
CView* pOldActiveView = GetActiveView(); // save old view
CView* pNewActiveView = (CView*)GetDlgItem(nView); // get new view
if (pNewActiveView == NULL) // if it hasn't been created yet
{ // create it here
switch (nView)
{
case IDV_MAIN:
pNewActiveView = (CView*) new CBalanceView;
break;
case IDV_PANE:
pNewActiveView = (CView*) new CPaneView;
break;
case IDV_MODE:
pNewActiveView = (CView*) new CRotatorView;
break;
case IDV_BALANCETEST:
pNewActiveView = (CView*) new CBalanceTestView;
break;
case IDV_SELFTEST:
pNewActiveView = (CView*) new CSelfTestView;
break;
case IDV_TESTRESULT:
pNewActiveView = (CView*) new CTestResultView;
break;
case IDV_HISTORYDATA:
pNewActiveView = (CView*) new CHistoryDataView;
break;
case IDV_CORRECT:
pNewActiveView = (CView*) new CCorrectView;
break;
case IDV_VARI:
pNewActiveView = (CView*) new CVariView;
break;
default:
ASSERT(0);
return;
}
CCreateContext context; // attach the document to the new view
context.m_pCurrentDoc = pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault, // and the frame
this, nView, &context);
pNewActiveView->OnInitialUpdate();
}
SetActiveView(pNewActiveView); // change the active view
pNewActiveView->ShowWindow(SW_SHOW); // show the new window
pOldActiveView->ShowWindow(SW_HIDE); // hide the old
::SetWindowWord(pNewActiveView->m_hWnd, GWL_ID, AFX_IDW_PANE_FIRST); // gotta have it
RecalcLayout(); // adjust frame
delete pOldActiveView; // kill old view
拜托大家不要灌水!
拜托大家回答得有水平一点!
3X!