哪位高手知道可以达到与DoEvents同样效果的API函数 最好使用多线程来实现,CreateProcess和CreateThread创建新的进程和线程. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我是低手,希望没有打扰。用API就复杂了,不是一个函数就能达到的。VB的语法我不太熟,我用C的语法,希望你能看得懂:void DoEventsInC(){ MSG msg; while( PeekMessage(&msg, hWnd, 0, 0, PM_NOREMOVE) ) { if(Msg.Message==WM_QUIT) break; GetMessage(&msg, hWnd, 0, 0); TranslateMessage(&msg); DispatchMessage(&msg); }} aborigine:我想达到的效果是:我执行了Me.Caption="kkk",紧接着执行一个很复杂的操作,我的目的仅仅是让"kkk"显示在窗体的标题栏上(如果没有DoEvents,则窗体的标题栏会在我的复杂的操作完成后才显示"kkk")。agui:你的函数好象是把和该窗体有关的消息全部押后处理。而我的要求恰恰相反,我是要把所有的消息都处理完,然后继续执行我的程序。 setwindowpos hwnd,0,0,0,0,0,swp_nosize _ or swp_nomove or swp_nozorder or swp_drawframe >>我想达到的效果是:我执行了Me.Caption="kkk",紧接着执行一个很复杂的操作,我的>>目的仅仅是让"kkk"显示在窗体的标题栏上(如果没有DoEvents,则窗体的标题栏会在>>我的复杂的操作完成后才显示"kkk")。"kkk"没有显示,是因为来不及显示,所以你可以抢先再复杂操作之前刷新一下这个控件(不知是什么控件).刷新的方法,我对vb不熟,大概应该是Me.Refresh; 还是用多线程效果较好,主线程处理消息,创建一个线程在后台专门执行复杂操作.不会有任何延迟感,要完成你所提的任务,即使用API也不复杂.我对VB不是很熟悉,你可去参考一本叫<<Visual Basic5 API编程指南>>的书. while ( bDoingBackgroundProcessing ) { MSG msg; while ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) { if ( ::GetMessage(&msg, NULL, 0, 0)==0 ) { bDoingBackgroundProcessing = FALSE; ::PostQuitMessage( ); break; } } LONG lIdle = 0; while ( DoIdle(lIdle++ ) ) ;} 你可以建立一个ActiveX EXE部件来完成你需要完成的复杂的操作,由于ActiveX EXE部件是线程之外运行的,所以不会影响主程序的运行,并且两个程序之间可以进行数据的交换。 @@@@@@ 旷世难题:VB6中无法实现嵌套循环显示的效果? @@@@@@@@@@@@@@@@@@@@@@的 PictureBox控件不能显示真彩色? 到底有没有高手能解决这个问题? VB查询数据库问题....在线等... 紧急求助vb中如何调用运行.exe程序 有没有办法把字符串作为代码运行 API的GetShortPathName怎么用,教教我好吗 急::如何让setupBuilder(1.5sc)正确运行"扩展exe"文件 请教一个乍样控制事件的先后次序的问题? VBA识别不了大小写,怎么提取分钟啊 怎样把一个文件装入缓冲区,又把它重新导出成一个文件? 如何实现水线
用API就复杂了,不是一个函数就能达到的。VB的语法我不太熟,我用C的语法,希望你能看得懂:void DoEventsInC()
{
MSG msg; while( PeekMessage(&msg, hWnd, 0, 0, PM_NOREMOVE) )
{
if(Msg.Message==WM_QUIT)
break;
GetMessage(&msg, hWnd, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
agui:你的函数好象是把和该窗体有关的消息全部押后处理。而我的要求恰恰相反,我是要把所有的消息都处理完,然后继续执行我的程序。
or swp_nomove or swp_nozorder or swp_drawframe
刷新的方法,我对vb不熟,大概应该是Me.Refresh;
{
MSG msg;
while ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
{
if ( ::GetMessage(&msg, NULL, 0, 0)==0 )
{
bDoingBackgroundProcessing = FALSE;
::PostQuitMessage( );
break;
}
}
LONG lIdle = 0;
while ( DoIdle(lIdle++ ) )
;
}