vc程序窗口最小化出现的奇怪现象,急求解答
各位牛人,首先我想问:为什么我的程序窗口用右上角的最小化按钮和用任务栏图标最小化效果不一样。它们都能实现窗口最小化,这时对的,但是还原后效果不一样。具体如下:
我的程序分两线程,一个是在读数据,简单来说就是读TXT中的数据,然后读完一组1280个数据,我就要将数据在另一个线程中进行数据处理,然后进行画图。在读数据的线程中,在读完一组数据后我用while(!m_finished) sleep(5);等待一次画图完成然后读入第二组数据。变量在读完一组数据后被置为FALSE,在画图结束后被置为TRUE,画图是在CDrawView类中的OnDraw()中完成的,在数据处理结束后由Invalidate(False)触发其执行。但是我发现在窗口最小化情况下OnDraw()函数是不执行的,这时为什么?
如果不执行OnDraw()的话,m_finished就无法被置为TRUE,这样数据读取进程就一直处于等待状态,新的数据进不来。我的程序要求在最小化情况下还是得读入数据的,所以我就想象着分两种情况,如果没有最小化,就按之前的来做;如果最小化,就干脆在数据处理完之后就将m_finished置为TRUE,继续读下一组数据。
刚开始我考虑在数据处理的结尾加上如下代码:
if(m_minimize) //m_minimize用于判断是否最小化
m_finished=TRUE;
else
Invalidate(FALSE);
然后m_minimize是在CMainFrame中的OnSysCommand(UINT nID, LPARAM lParam)中添加如下代码:
switch(nID)
{
case SC_MINIMIZE:
pDrawView->m_minimize=TRUE; //pDrawView是指向CDrawView类的指针
ShowWindow(SW_MINIMIZE);
break;
case SC_RESTORE:
pDrawView->m_minimize=FALSE;
ShowWindow(SW_RESTORE);
break;
default:
默认代码。。。
break;
}
但是调试过程中,发现最小化或还原可以执行OnSysCommand中的代码,pDrawView->m_minimize也看着被修改了,但是CDrawView中的minimize确没有变,导致最小化时数据还是读不进来, if(m_minimize) //m_minimize用于判断是否最小化
m_finished=TRUE; 这句代码不执行,最小化了为什么还不执行啊?
于是我用第二种想法:在CDrawView类数据处理结束后加上如下代码:
HWND hwnd=pMain->GetSaveHwnd(); //pMain是指向CMainFrame类的指针
CWindow mywindow;
mywindow.Attach(hwnd);
if(mywindow.IsInconic())
m_minimize=TRUE;
else
Invalidate(FALSE);
发现在这种情况下出现了奇怪的现象:如果我点击任务栏的图标最小化,发现可以执行if(mywindow.IsInconic())
m_minimize=TRUE; 自然数据在最小化是也会读入,还原后可以新进来的数据处理后的值所画出的曲线
但如果点击窗口右上角的最小化按钮,却不会执行到这一句,数据仍然读不进来,还原后数据就从最小化之时的数据接下去读,在最小化的状态下没有新数据读入。这时为什么啊?我纳闷到现在,请高人指教!