線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1381
推到 Plurk!
推到 Facebook!

請問關于MSN彈岀窗口的問題!

尚未結案
sincereli
一般會員


發表:6
回覆:7
積分:2
註冊:2003-10-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-17 02:55:17 IP:220.184.xxx.xxx 未訂閱
我想實現MSN彈岀窗口的傚果,但是髮現每次窗口彈岀到落下的這段時間內,我不能對主窗體進行操作,直到窗口落下后才可以。請問如何解決這個問題,使彈岀窗口不影響對其他窗體的操作?謝謝!        TForm *pActiveForm = Screen->ActiveForm;     TForm3 *pForm3 = new TForm3(NULL);  //創建彈岀窗體     pForm3->BorderStyle = bsNone;     RECT rec;     SystemParametersInfo(SPI_GETWORKAREA,0,&rec,SPIF_SENDCHANGE);     pForm3->Left = rec.right - rec.left - pForm3->Width;     pForm3->Top = rec.bottom;     pForm3->Show();     Form1 = (TForm1 *)pActiveForm;  //主窗體恢復焦點     Form1->SetFocus();     while(pForm3->Top > (rec.bottom - pForm3->Height))     {         pForm3->Repaint();         pForm3->Top -= 1;         Sleep(1);     }    // Sleep(4000);     while(pForm3->Top < rec.bottom)     {        pForm3->Repaint();        pForm3->Top += 1;        Sleep(1);     }     delete pForm3;
apang
一般會員


發表:11
回覆:20
積分:6
註冊:2003-06-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-17 09:36:40 IP:211.23.xxx.xxx 未訂閱
sincereli你好 我覺得是你的 while loop 的影響吧^^"
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-17 09:53:02 IP:211.23.xxx.xxx 未訂閱
sleep(1) ; 再加上一行 Application->ProcessMessages ; 這樣應該就可以了!! ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
sincereli
一般會員


發表:6
回覆:7
積分:2
註冊:2003-10-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-17 11:29:03 IP:220.184.xxx.xxx 未訂閱
哦,謝謝,但是還有一個問題,我想讓窗體彈岀后停畱一會再落下,即上麵的: while(...) {...} Sleep(4000); //停畱一會,但不能操作主窗體暸 Application->ProcessMessage(); while(...) {...} 但是這樣的話在停畱的過程中又不能操作主窗體,這是為什么?
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-17 14:28:24 IP:211.23.xxx.xxx 未訂閱
引言: 哦,謝謝,但是還有一個問題,我想讓窗體彈岀后停畱一會再落下,即上麵的: while(...) {...} Sleep(4000); //停畱一會,但不能操作主窗體暸 Application->ProcessMessage(); while(...) {...} 但是這樣的話在停畱的過程中又不能操作主窗體,這是為什么?
因為 SLEEP 是讓整個行程去睡覺了... 當然主FORM也不會回應囉! 要讓主程式可以有回應, 可以用一個迴圈來達成
 
int iNow ;    iNow=GetTickCount ;
while (GetTickConut-iNow<4000)
{
  sleep(100) ; 
  Application->ProcessMessages ;
}    
...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
sincereli
一般會員


發表:6
回覆:7
積分:2
註冊:2003-10-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-18 00:43:57 IP:220.184.xxx.xxx 未訂閱
還有最后一個小問題,按上麵的程式,在下落的過程中,我如果對主窗體做操作,比如鼠標點擊主窗體的狀態欄不動,則彈岀窗體就會停住,隻有放開后窗體纔可以下落。請問這個有什么辦法么?也就是在Application->ProcessMessage();的中處理主窗體的消息,又怎么纔能不影響彈岀窗體?謝謝!
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-18 09:33:22 IP:211.23.xxx.xxx 未訂閱
引言: 還有最后一個小問題,按上麵的程式,在下落的過程中,我如果對主窗體做操作,比如鼠標點擊主窗體的狀態欄不動,則彈岀窗體就會停住,隻有放開后窗體纔可以下落。請問這個有什么辦法么?也就是在Application->ProcessMessage();的中處理主窗體的消息,又怎么纔能不影響彈岀窗體?謝謝!
要完美解決這種問題... 就改用 Thread 吧!! 只是這可要改不少東西.. ;) 不過若彈出訊息也只是看一下, 不是經常性的出現... 我倒不認為有必要一定要重寫! ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
sincereli
一般會員


發表:6
回覆:7
積分:2
註冊:2003-10-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-18 11:02:31 IP:220.184.xxx.xxx 未訂閱
我就是用的綫程,不知道為什么就是不行。請問aquarius,如果要重寫應該怎么重寫呢?謝謝! 綫程的程式如下: __fastcall PopupThread::PopupThread(bool CreateSuspended) : TThread(CreateSuspended) { } //-------------------------------------------------------------------- void __fastcall PopupThread::Execute() { //---- Place thread code here ---- FreeOnTerminate = true; Synchronize(PopupWindow); } //-------------------------------------------------------------------- void __fastcall PopupThread::PopupWindow(void) { TForm *pActiveForm = Screen->ActiveForm; TForm3 *pForm3 = new TForm3(NULL); pForm3->BorderStyle = bsNone; RECT rec; SystemParametersInfo(SPI_GETWORKAREA,0,&rec,SPIF_SENDCHANGE); pForm3->Left = rec.right - rec.left - pForm3->Width; pForm3->Top = rec.bottom; pForm3->Show(); Form1 = (TForm1 *)pActiveForm; Form1->SetFocus(); while(pForm3->Top > (rec.bottom - pForm3->Height)) { pForm3->Repaint(); pForm3->Top -= 2; Sleep(0); Application->ProcessMessages(); } DWORD iNow ; iNow = GetTickCount(); while (GetTickCount() - iNow < 4000) { Sleep(1); Application->ProcessMessages(); } while(pForm3->Top < rec.bottom) { pForm3->Repaint(); Application->ProcessMessages(); pForm3->Top = 1; Sleep(0); Application->ProcessMessages(); } delete pForm3; } //------------------------------------------------------------------ 然后主窗體程式部分隻有一句代碼: void __fastcall TForm1::Button1Click(TObject *Sender) { PopupThread *pThread = new PopupThread(false); }
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-18 12:06:27 IP:211.23.xxx.xxx 未訂閱
我用 DELPHI 的, 你的 SOURCE 我這兒不能編譯. 不過看了一下你的寫法, 在 EXECUTE 中就只有 Synchronize , 這樣不是就和沒用 Thread 差不多嗎? ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
sincereli
一般會員


發表:6
回覆:7
積分:2
註冊:2003-10-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-11-18 12:13:24 IP:220.184.xxx.xxx 未訂閱
aquarius老師,請問在Delphi中是怎么寫的呢?
Albertz
初階會員


發表:2
回覆:57
積分:31
註冊:2002-09-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-11-18 13:17:39 IP:211.20.xxx.xxx 未訂閱
插花一下. 這個問題不應該用 sleep, 也不該用 thread.  1. sleep 會 block 住 main execution thread, 以至於在 sleep return 前 程式會沒有反應, 這點 sincereli兄已經試過了.    2. sincereli兄的thread中, 並沒有 message handler; 各位別忘了, Windows  是一個"事件驅動"的作業系統. 誰去 dispatch message? 另外一件事, 在同 一個行程裡 create 一個 execute thread, 然後叫 main execute thread 去 幫你 dispatch message? sincereli兄, 不知道你的thread版本的 code 動作 正常嗎?    有沒有考慮用 timer 去做?
sincereli
一般會員


發表:6
回覆:7
積分:2
註冊:2003-10-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-11-18 21:36:57 IP:220.184.xxx.xxx 未訂閱
因為沒有別的代碼,所以現在還是正常的,就是下落的時候對主窗體的操作會影響彈岀窗體。因為我想做成事件觸髮型的,就是說當髮生某事件的時候彈岀窗體,請問Albertz用timer該怎么弄? 發表人 - sincereli 於 2003/11/18 21:44:21
Albertz
初階會員


發表:2
回覆:57
積分:31
註冊:2002-09-05

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-11-20 18:51:02 IP:211.20.xxx.xxx 未訂閱
TFadeForm 繼承 TForm, TFadeForm 內再 create 一個 Timer.  Timer interval 為 50ms.
 
//---------------------------------------------------------------------------
void __fastcall TFadeForm::ProcessTimerTimer(TObject *Sender)
{
        switch(fFadeStatus)
        {        //-------------------------------------------------------------------
                case fade_fstFadeIn:
                switch(fFadePos)
                {        //---------------------------------------------------------------
                        case fade_fpRightBottom:
                        case fade_fpRightTop:
                        if ((this->Left   this->Width) < WorkRegion.Right)
                        {
                                iCount = 0;
                                fFadeStatus = fade_fstDelay;                //next stage!!
                        }
                        else
                        {        this->Left = this->Left - FADE_MOVE_STEP;        }
                        break;
                        //---------------------------------------------------------------
                        case fade_fpLeftBottom:
                        if (this->Left > WorkRegion.Left)
                        {
                                iCount = 0;
                                fFadeStatus = fade_fstDelay;                //next stage!!
                        }
                        else
                        {        this->Left = this->Left   FADE_MOVE_STEP;        }                            break;
                        //---------------------------------------------------------------
                }
                break;
                //-------------------------------------------------------------------
                case fade_fstDelay:
                iCount  ;
                if (((this->ProcessTimer->Interval * iCount) > FADE_DELAY_MS) &&
                        (bAutoFadeOut))
                {
                                fFadeStatus = fade_fstFadeOut;                //next stage!!
                }
                break;
                //-------------------------------------------------------------------
                case fade_fstFadeOut:
                switch(fFadePos)
                {        //---------------------------------------------------------------
                        case fade_fpRightBottom:
                        case fade_fpRightTop:
                        this->Left = this->Left   FADE_MOVE_STEP;
                        if ((this->Left) > WorkRegion.Right)
                        {
                                //fFadeStatus = fade_fstHibernate;
                                //this->ProcessTimer->Enabled = false;
                                this->Close();
                        }
                        break;
                        //---------------------------------------------------------------
                        case fade_fpLeftBottom:
                        if ((this->Left   this->Width) < WorkRegion.Left)
                        {
                                //fFadeStatus = fade_fstHibernate;
                                //this->ProcessTimer->Enabled = false;
                                this->Close();
                        }
                        else
                        {        this->Left = this->Left - FADE_MOVE_STEP;        }
                        break;
                        //---------------------------------------------------------------
                }
                break;
                //-------------------------------------------------------------------
        }
}
//---------------------------------------------------------------------------    
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-05-06 16:05:04 IP:211.23.xxx.xxx 未訂閱
請回覆或結案。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D -------------------------------
系統時間:2024-05-05 8:17:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!