最近做了一个小程序是基于对话框的。
对话框里有3个静态文本,1个进度条,2个单选按钮,2个按键,2个文本输入框。
对话框有2种状态,
1、静态文本1、2、文本输入框1、2显示,按钮全有效。静态文本3、进度条隐藏。
2、当点击一个按钮后,静态文本1、2、文本输入框1、2隐藏,按钮全无效。静态文本3、进度条显示。 现在所有的控件(除静态文本3外)都可以按设计的过程显示隐藏。 代码如下:
void CReadDlg::OnButton1()
{
//编码
if(xxx)
{
//xxx
}
else
{
OnState(1,1); //调整状态。
//读写文件。
m_P1.SetStep(0); //有无进度条效果一样
m_P1.StepIt();
}
OnState(0,1);
} void CReadDlg::OnButton2()
{
//解码
if(xxx)
{
//xxx
}
else
{
OnState(1,2); //调整状态
//读写文件。
m_P1.SetStep(0); //有无进度条效果一样
m_P1.StepIt();
}
OnState(0,2); //调整状态
} void CReadDlg::OnState(int bl,int size)
{
m_B1.EnableWindow(!bl); //按钮
m_B2.EnableWindow(!bl);
GetDlgItem(IDC_RADIO1)-> EnableWindow(!bl);//单选按钮
GetDlgItem(IDC_RADIO2)-> EnableWindow(!bl); m_S1.ShowWindow(!bl); //字符
m_S2.ShowWindow(!bl); m_E1.ShowWindow(!bl); //输入框
m_E2.ShowWindow(!bl); m_S3.ShowWindow(bl); //失效的静态文本3
Sleep(1000); //此处延时,不能解决问题
m_P1.ShowWindow(bl); //进度条初始化 struct stat buf; //需要头文件: <sys/stat.h> <sys/types.h> <errno.h>
int result = stat(m_IN,&buf); //获得文件指针
m_P1.SetRange(0,buf.st_size/(1000*size)+1);//获得文件长度
m_P1.SetPos(0);
m_P1.SetStep(0);
m_P1.StepIt();
Sleep(10);
} 经调试结论是,静态文本控件3在文件处理程序完成后才显示。而文件处理完成后,整个对话框的状态翻转了。所以始终没有看见静态文本控件3。
1、在各处加延时,无效。
2、将m_S3.ShowWindow(1);直接写入文件处理程序段内,无效。
问,1、为什么这样?
2、如何解决?
对话框里有3个静态文本,1个进度条,2个单选按钮,2个按键,2个文本输入框。
对话框有2种状态,
1、静态文本1、2、文本输入框1、2显示,按钮全有效。静态文本3、进度条隐藏。
2、当点击一个按钮后,静态文本1、2、文本输入框1、2隐藏,按钮全无效。静态文本3、进度条显示。 现在所有的控件(除静态文本3外)都可以按设计的过程显示隐藏。 代码如下:
void CReadDlg::OnButton1()
{
//编码
if(xxx)
{
//xxx
}
else
{
OnState(1,1); //调整状态。
//读写文件。
m_P1.SetStep(0); //有无进度条效果一样
m_P1.StepIt();
}
OnState(0,1);
} void CReadDlg::OnButton2()
{
//解码
if(xxx)
{
//xxx
}
else
{
OnState(1,2); //调整状态
//读写文件。
m_P1.SetStep(0); //有无进度条效果一样
m_P1.StepIt();
}
OnState(0,2); //调整状态
} void CReadDlg::OnState(int bl,int size)
{
m_B1.EnableWindow(!bl); //按钮
m_B2.EnableWindow(!bl);
GetDlgItem(IDC_RADIO1)-> EnableWindow(!bl);//单选按钮
GetDlgItem(IDC_RADIO2)-> EnableWindow(!bl); m_S1.ShowWindow(!bl); //字符
m_S2.ShowWindow(!bl); m_E1.ShowWindow(!bl); //输入框
m_E2.ShowWindow(!bl); m_S3.ShowWindow(bl); //失效的静态文本3
Sleep(1000); //此处延时,不能解决问题
m_P1.ShowWindow(bl); //进度条初始化 struct stat buf; //需要头文件: <sys/stat.h> <sys/types.h> <errno.h>
int result = stat(m_IN,&buf); //获得文件指针
m_P1.SetRange(0,buf.st_size/(1000*size)+1);//获得文件长度
m_P1.SetPos(0);
m_P1.SetStep(0);
m_P1.StepIt();
Sleep(10);
} 经调试结论是,静态文本控件3在文件处理程序完成后才显示。而文件处理完成后,整个对话框的状态翻转了。所以始终没有看见静态文本控件3。
1、在各处加延时,无效。
2、将m_S3.ShowWindow(1);直接写入文件处理程序段内,无效。
问,1、为什么这样?
2、如何解决?
确实“ShowWindow的参数应该是 SW_SHOW 或 SW_HIDE ,而不是 TRUE 或 FALSE”。已改如下:
void CReadDlg::OnState(int bl,int size)
{
int nShow1,nShow2;
if (bl ==0)
{
nShow1 = SW_HIDE;
nShow2 = SW_SHOW;
}
else
{
nShow1 = SW_SHOW;
nShow2 = SW_HIDE;
}
m_B1.EnableWindow(!bl); //按钮停用
m_B2.EnableWindow(!bl); GetDlgItem(IDC_RADIO1)->EnableWindow(!bl);
GetDlgItem(IDC_RADIO2)->EnableWindow(!bl);
m_S1.ShowWindow(nShow2); //字符隐藏
m_S2.ShowWindow(nShow2); m_E1.ShowWindow(nShow2); //输入框隐藏
m_E2.ShowWindow(nShow2); m_CHULI.ShowWindow(nShow1);
m_P1.ShowWindow(nShow1); //进度条初始化 struct stat buf; //需要头文件:<sys/stat.h><sys/types.h><errno.h>
int result = stat(m_IN,&buf); //获得文件指针
m_P1.SetRange(0,buf.st_size/(1000*size)+1);//获得文件长度
m_P1.SetPos(0);
m_P1.SetStep(0);
m_P1.StepIt();
Sleep(10);
}
现在问题依旧,静态文本控件3在文件处理程序完成后才显示。不是SW_SHOW、TRUE的问题,用那个参数系统都能认出来。现在又有新发现:.EnableWindow(SW_SHOW/SW_HIDE)可以实时显示。
.ShowWindow(SW_HIDE)可以实时隐藏。
但.ShowWindow(SW_SHOW)必须要等待到当前程序“停止”后才能显示出来。比如OnButton1函数结束(不论该函数做了什么),或弹出个Messagebox()都可以。
有什么办法可以解决吗?
.SetWindowText("xxx")可以实时显示,但是,m_S1的内容长短变化时,用什么方法可以改变控件的长度,使m_S1的内容可以显示完全?
UpdateWindow();
----------------
改变控件的长度。
如果要多行显示,最好用Eidt(Read only),可以高每行的最大长度自动换行。
或者加上消息处理循环......m_CHULI.ShowWindow(nShow1);
m_P1.ShowWindow(nShow1); //进度条初始化 MSG msg
for(int i=0;i<xxx;i++)
{
GetMessage(......);
DispatchMessage(..........);
Sleep(..);
}struct stat buf; //需要头文件: <sys/stat.h> <sys/types.h> <errno.h>
int result = stat(m_IN,&buf); //获得文件指针
m_P1.SetRange(0,buf.st_size/(1000*size)+1);//获得文件长度
m_P1.SetPos(0);
m_P1.SetStep(0);
m_P1.StepIt();
Sleep(10);
消息处理循环的作用是什么?
MSG *msg;
HWND hWnd;
for(int i=0;i <10;i++)
{
GetMessage(msg, hWnd, 0, 0);
DispatchMessage(msg);
Sleep(10);
}
一般msg和hWnd该如何初始化?
typedef struct tagMSG { // msg
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
object.ShowWindow(SW_HIDE);
ojbect.ShowWindow(SW_SHOW);
也就是同一个控件隐藏后立即显示,结果它隐藏了,要等到按钮单击事件运行结束后才会显示。
所以看来你要实现的效果,即用静态控件3来显示当前状态,看来真的只能用另一个线程了。
我也是这么想的,看来就这条路可走了。请教 小龙
一般的添加新线程用什么方法比较好些,以前照着《Visual C++6_0程序设计培训教程》中介绍的添加线程方法,怎么写也写不出效果来。
第1次看时看错了。试过之后果然有效果。
现在结贴散分。