求救了 大侠们 教教我怎么实现这样的功能--主窗口hide但仍在继续运行 同时打开一个进度条现在后面的运行进度...仔细说下: 我现在想在按了button后 打开一个进度条的窗口, 之后继续运行onButton 后面的程序..进度条显示正在后台运行着 当onButton 运行结束 关闭了进度条 窗口。这里 进度条窗口id 为IDD_AAA,类为BBB (俄,懒得改了)我现在这样做,在主窗口的类中 CDlgDlg 声明一个 全局 变量 BBB * dlg
然后把调用进度窗口 写成了线程...UINT ThreadProc(LPVOID param)在 onButton 里面 调用,现在的问题是 在 线程调用后 ,如果onButton 继续往后执行的里面如出现AfxMessageBox这样的窗口(使得主窗口失去焦点.),则进度窗口可以完好的显示 进度条也正常工作.
但是如果让onButton 继续往后执行 一些如sleep 或者处理写数据时 则 进度窗口不显示,如果用ShowWindow();这样的 只能是进度窗口的框架显示 但是进度条空间等不显示...
.....求救阿..代码如下:
主窗口的代码:
BBB* dlg;
UINT ThreadProc(LPVOID param)
{ CRect rectDisk;
dlg->GetWindowRect( &rectDisk );
dlg->SetWindowPos( NULL,
0,0,
rectDisk.Width(),rectDisk.Height(),
SWP_NOZORDER
);
dlg->ShowWindow(SW_SHOW);
return 0;
}BOOL CDlgDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu.......
// TODO: Add extra initialization here
dlg = new BBB (this);
dlg->Create( IDD_AAA, this ); return TRUE; // return TRUE unless you set the focus to a control
}//onBtn
void CDlgDlg::OnButton2()
{
// TODO: Add your control notification handler code here
HWND hWnd;
CWinThread* pThread;
hWnd = GetSafeHwnd();
ShowWindow(SW_HIDE);
dlg->SetTimerFlg();
pThread =AfxBeginThread(ThreadProc,hWnd);
for(int i=0;i<400;i++)
{
if(i%100 == 0)
AfxMessageBox("adfdafd");//这样进度条就可以运行
//Sleep(2000); //这样进度条无法运行..
}
//卸载线程
DWORD code;
if(GetExitCodeThread(pThread->m_hThread,&code))
if(code==STILL_ACTIVE)
{
TerminateThread(pThread->m_hThread,0);
CloseHandle(pThread->m_hThread);
}
dlg->Close();
Sleep(2000);
dlg->EndDialog(0); ShowWindow(SW_SHOW);
}/**************IDD_AAA 进度条窗口**********/
//BBB.h
#if !defined(AFX_BBB_H__2CF0FB86_9498_46CF_AF06_D66357D13360__INCLUDED_)
#define AFX_BBB_H__2CF0FB86_9498_46CF_AF06_D66357D13360__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BBB.h : header file
///////////////////////////////////////////////////////////////////////////////
// BBB dialogclass BBB : public CDialog
{
// Construction
public:
void SetTimerFlg();
int TimerFlg;
int proFlg;
void Close();
BBB(CWnd* pParent = NULL); // standard constructor// Dialog Data
//{{AFX_DATA(BBB)
enum { IDD = IDD_AAA };
CProgressCtrl m_prog;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(BBB)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected: // Generated message map functions
//{{AFX_MSG(BBB)
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_BBB_H__2CF0FB86_9498_46CF_AF06_D66357D13360__INCLUDED_)/***************************BBB.cpp****************************/BOOL BBB::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu.......... // TODO: Add extra initialization here proFlg=0;
m_prog.SetRange(0,100);
m_prog.SetStep(1);
m_prog.SetPos(1);
SetTimerFlg();
return TRUE;
}void BBB::SetTimerFlg()
{
TimerFlg = 0;
SetTimer(1,1,NULL);
}void BBB::OnTimer(UINT nIDEvent)
{
if(!TimerFlg)
{
m_prog.SetPos(proFlg);
proFlg++;
if(proFlg>=95)
proFlg=30;
CDialog::OnTimer(nIDEvent);
}
}void BBB::Close()
{
proFlg = 100;
m_prog.SetPos(proFlg);
TimerFlg = 1;
proFlg=0;
KillTimer(1);
}
然后把调用进度窗口 写成了线程...UINT ThreadProc(LPVOID param)在 onButton 里面 调用,现在的问题是 在 线程调用后 ,如果onButton 继续往后执行的里面如出现AfxMessageBox这样的窗口(使得主窗口失去焦点.),则进度窗口可以完好的显示 进度条也正常工作.
但是如果让onButton 继续往后执行 一些如sleep 或者处理写数据时 则 进度窗口不显示,如果用ShowWindow();这样的 只能是进度窗口的框架显示 但是进度条空间等不显示...
.....求救阿..代码如下:
主窗口的代码:
BBB* dlg;
UINT ThreadProc(LPVOID param)
{ CRect rectDisk;
dlg->GetWindowRect( &rectDisk );
dlg->SetWindowPos( NULL,
0,0,
rectDisk.Width(),rectDisk.Height(),
SWP_NOZORDER
);
dlg->ShowWindow(SW_SHOW);
return 0;
}BOOL CDlgDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu.......
// TODO: Add extra initialization here
dlg = new BBB (this);
dlg->Create( IDD_AAA, this ); return TRUE; // return TRUE unless you set the focus to a control
}//onBtn
void CDlgDlg::OnButton2()
{
// TODO: Add your control notification handler code here
HWND hWnd;
CWinThread* pThread;
hWnd = GetSafeHwnd();
ShowWindow(SW_HIDE);
dlg->SetTimerFlg();
pThread =AfxBeginThread(ThreadProc,hWnd);
for(int i=0;i<400;i++)
{
if(i%100 == 0)
AfxMessageBox("adfdafd");//这样进度条就可以运行
//Sleep(2000); //这样进度条无法运行..
}
//卸载线程
DWORD code;
if(GetExitCodeThread(pThread->m_hThread,&code))
if(code==STILL_ACTIVE)
{
TerminateThread(pThread->m_hThread,0);
CloseHandle(pThread->m_hThread);
}
dlg->Close();
Sleep(2000);
dlg->EndDialog(0); ShowWindow(SW_SHOW);
}/**************IDD_AAA 进度条窗口**********/
//BBB.h
#if !defined(AFX_BBB_H__2CF0FB86_9498_46CF_AF06_D66357D13360__INCLUDED_)
#define AFX_BBB_H__2CF0FB86_9498_46CF_AF06_D66357D13360__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BBB.h : header file
///////////////////////////////////////////////////////////////////////////////
// BBB dialogclass BBB : public CDialog
{
// Construction
public:
void SetTimerFlg();
int TimerFlg;
int proFlg;
void Close();
BBB(CWnd* pParent = NULL); // standard constructor// Dialog Data
//{{AFX_DATA(BBB)
enum { IDD = IDD_AAA };
CProgressCtrl m_prog;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(BBB)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected: // Generated message map functions
//{{AFX_MSG(BBB)
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_BBB_H__2CF0FB86_9498_46CF_AF06_D66357D13360__INCLUDED_)/***************************BBB.cpp****************************/BOOL BBB::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu.......... // TODO: Add extra initialization here proFlg=0;
m_prog.SetRange(0,100);
m_prog.SetStep(1);
m_prog.SetPos(1);
SetTimerFlg();
return TRUE;
}void BBB::SetTimerFlg()
{
TimerFlg = 0;
SetTimer(1,1,NULL);
}void BBB::OnTimer(UINT nIDEvent)
{
if(!TimerFlg)
{
m_prog.SetPos(proFlg);
proFlg++;
if(proFlg>=95)
proFlg=30;
CDialog::OnTimer(nIDEvent);
}
}void BBB::Close()
{
proFlg = 100;
m_prog.SetPos(proFlg);
TimerFlg = 1;
proFlg=0;
KillTimer(1);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货