一个奇怪的问题(谢绝灌水)

ahphone 2002-09-28 07:37:43
最近写一个将要运行在工控机上的程序,因为该工控机只有数字键可以利用,所以我使用了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!
...全文
34 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
我不是大明 2002-10-04
  • 打赏
  • 举报
回复
既然你说程序没有问题,
你程序最后用得是什么版本的,DEBUG还是RELEASE,
DEBUG可能会有这个问题!
ahphone 2002-09-30
  • 打赏
  • 举报
回复
谢谢各位大侠的捧场,这两天因为学业太紧,到今天才试了几次,效果不是很好。总的看起来,大同小异(我真的这样感觉)。对于这个问题的回答,对各位作如下交代:
lkcowboy(三黑) 和shanshishi(磊) :看来两位没仔细研究这个问题了,不过认为程序没问题,倒是很合我意。
liuyup(天煞) :这种办法我肯定早用过了。
easyrock() 顺序没有问题,顶多先让一个藏起来,但是如果新视图生成失败,旧视图已经被削掉了,那可麻烦了。
oldworm(oldworm) :我现在看到带星的就高兴。不过我的程序将来在98下用,如果用出毛病,我就推到98身上。将来再改掉它。
siphonelee和kill98(谁敢放毒谁就死) :方法差不多,不过我没仔细研究,用下来还不如以前的。

我已经找了个新的途径解决了这个问题。原来在按钮按下时直接调用CMainFrm里面的函数,现在该用发消息
::PostMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_COMMAND,(WPARAM)IDV_CORRECT,0);
让框架自己来处理,原来切换的代码一个字都没有改,TMD!!!!!!!!!!!

说老实话,我现在很佩服自己。口合口合!
现在转头去计划国庆节压马路的事情了,国庆节后来兑分,你们自己看看怎么分吧!
节日快乐!


oldworm 2002-09-28
  • 打赏
  • 举报
回复
我注意到你的程序里面用到了:
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_nCurrentExample);

::SetWindowWord(pNewActiveView->m_hWnd, GWL_ID, AFX_IDW_PANE_FIRST); // gotta have it

根据msdn的说法,SetWindowWord是个过时函数,会不会是因为这个引起的?
easyrock 2002-09-28
  • 打赏
  • 举报
回复
我的建议是,切换时先Destroy掉原来的视图对象,然后在建立新的视图对象时,比如CreateView()中明确指定uID = AFX_IDW_PANE_FIRST。我觉得顺序很重要。
liuyup 2002-09-28
  • 打赏
  • 举报
回复
你是在2000下编译的吧。你到98下编译一下。
kill98 2002-09-28
  • 打赏
  • 举报
回复
我的切换代码是这样的:
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView = NULL;

switch (nView)
{
case VIEW_STAT:
pNewActiveView = (CView*) m_pStatView;
break;

case VIEW_LISTCTRL:
pNewActiveView = (CView*) m_pListCtrlView;
break;
case VIEW_NULL:
pNewActiveView = (CView*) m_pInfoView;
}

if (pNewActiveView)
{
// 如果是本身就不需要切换 if (pOldActiveView == pNewActiveView) return;

SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
pOldActiveView->ShowWindow(SW_HIDE);
pOldActiveView->SetDlgCtrlID(m_nCurrentViewID);
m_nCurrentViewID = nView;

RecalcLayout();
}
shanshishi 2002-09-28
  • 打赏
  • 举报
回复
當出現user.dll?一般情況是系統出現了問題,應檢查系統,該程序並沒有毛病
lkcowboy 2002-09-28
  • 打赏
  • 举报
回复
9x和NT在有些函数调用时返回值有区别
siphonelee 2002-09-28
  • 打赏
  • 举报
回复
这种情况我遇见过,解决办法是在
SetActiveView(pNewActiveView); // change the active view
pNewActiveView->ShowWindow(SW_SHOW); // show the new window
pOldActiveView->ShowWindow(SW_HIDE);
之前加入:
int nSwitchChildID = pViewActiveView->GetDlgCtrlID();
pViewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
pOldActiveView->SetDlgCtrlID(nSwitchChildID);

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧