請問關于MSN彈岀窗口的問題! |
尚未結案
|
sincereli
一般會員 發表:6 回覆:7 積分:2 註冊:2003-10-14 發送簡訊給我 |
我想實現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 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
|
sincereli
一般會員 發表:6 回覆:7 積分:2 註冊:2003-10-14 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: 哦,謝謝,但是還有一個問題,我想讓窗體彈岀后停畱一會再落下,即上麵的: 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 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: 還有最后一個小問題,按上麵的程式,在下落的過程中,我如果對主窗體做操作,比如鼠標點擊主窗體的狀態欄不動,則彈岀窗體就會停住,隻有放開后窗體纔可以下落。請問這個有什么辦法么?也就是在Application->ProcessMessage();的中處理主窗體的消息,又怎么纔能不影響彈岀窗體?謝謝!要完美解決這種問題... 就改用 Thread 吧!! 只是這可要改不少東西.. ;) 不過若彈出訊息也只是看一下, 不是經常性的出現... 我倒不認為有必要一定要重寫! ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com |
sincereli
一般會員 發表:6 回覆:7 積分:2 註冊:2003-10-14 發送簡訊給我 |
我就是用的綫程,不知道為什么就是不行。請問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 發送簡訊給我 |
|
sincereli
一般會員 發表:6 回覆:7 積分:2 註冊:2003-10-14 發送簡訊給我 |
|
Albertz
初階會員 發表:2 回覆:57 積分:31 註冊:2002-09-05 發送簡訊給我 |
插花一下.
這個問題不應該用 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 發送簡訊給我 |
|
Albertz
初階會員 發表:2 回覆:57 積分:31 註冊:2002-09-05 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |