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

TImage canvas 在視窗最大化時會 lag?

尚未結案
boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-06-25 01:48:49 IP:122.116.xxx.xxx 訂閱
附件為測試 project 檔,以下說明
程式按鈕後會有一個 timer 在對 一個 TImage 做移動
另一個TImage在滑鼠按下並拖拉時,在畫布上畫出路徑
當視窗沒有最大化時,一切看似正常
當視窗最大化時,為什麼當畫出路徑時,另一個做移動的TImage 竟然會暫停
我試過直接畫在 Form1 上,結果一樣
也試過移動的圖,直接用畫清掉、畫清掉,結果一樣
不知哪位前輩有愛迪爾
感恩~
[code cpp]
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
void DrawOnImage( TImage *TargetImage, int Mode , TRect DrawRect ){
switch(Mode){
case 0:
TargetImage->Canvas->Pen->Color = clBlue;
break;
case 1:
TargetImage->Canvas->Pen->Color = clWhite;
TargetImage->Canvas->Brush->Color = clWhite;
TargetImage->Canvas->Rectangle( DrawRect );
break;
case 2:
TargetImage->Canvas->Pen->Color = clGreen;
TargetImage->Canvas->Rectangle( DrawRect );
break;
}
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Image2->Width = Form1->ClientWidth;
Image2->Height = Form1->ClientHeight;
Form1->DoubleBuffered = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Image2->Tag = 1;
TPoint CurrentPoint;
GetCursorPos( &CurrentPoint );
Image2->Canvas->PenPos = ScreenToClient( CurrentPoint );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image2MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(Image2->Tag == 1){
Image2->Canvas->LineTo(X,Y);
Form1->Caption = ( IntToStr(X) ", " IntToStr(Y) );
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image2MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
Image2->Tag = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if( Image1->Left > 300 ){
Image1->Left = 5;
}else{
Image1->Left = 5;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled = false;
Image1->Left = 5;
Image1->Top = 20;
if( RadioGroup1->ItemIndex == 0 ) Image1->Picture->LoadFromFile("import.bmp");
else Image1->Picture->LoadFromFile("import2.bmp");

Image2->Width = Form1->ClientWidth;
Image2->Height = Form1->ClientHeight;
Image2->Canvas->Pen->Width = 3;
Image2->BringToFront();
Image2->Tag = 0;

TRect DrawRect;
DrawRect = TRect( 0, 0, Image2->Width, Image2->Height );
DrawOnImage( Image2, 1 , DrawRect);

DrawRect = TRect( Image1->Left -1, Image1->Top -1, Image2->Width -3, Image1->Top Image1->Height 1 );
DrawOnImage( Image2, 2 , DrawRect);

DrawRect = TRect( 0, 0, Image2->Width, Image2->Height );
DrawOnImage( Image2, 0 , DrawRect);

Timer1->Enabled = true;
}
//---------------------------------------------------------------------------

[/code]
編輯記錄
boss.tw 重新編輯於 2010-06-25 01:50:07, 註解 無‧
boss.tw 重新編輯於 2010-06-25 01:50:59, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-06-25 16:21:31 IP:122.116.xxx.xxx 訂閱
將Timer改用Thread取代即可
boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-06-25 21:21:43 IP:122.116.xxx.xxx 訂閱
感謝  taishyang 回覆
我試了將 Timer 改為 thread 的方式
原本做移動的TImage 會暫停,變成會有慢下來的感覺
雖然解決了停下來的問題
不過就算我把 thread 的 優先權調到最高,還是會有 lag 的感覺
不知道有沒有前輩遇過此問題

[code cpp]
__fastcall thDraw::thDraw(bool CreateSuspended, int Direction)
: TThread(CreateSuspended)
{
this->FreeOnTerminate;
pvDirection = Direction;
//this->Priority = tpTimeCritical;
}
//---------------------------------------------------------------------------
void __fastcall thDraw::Execute()
{
while( Form1->Image1->Left < Form1->ClientWidth -5 ){
switch( pvDirection ){
case 0:
Form1->Image1->Left = 3;
break;
case 1:
Form1->Image1->Top = 3;
Form1->Image1->Left = 3;
break;
}
}
Form1->Image1->Top = 20;
Form1->Image1->Left = 5;
this->Terminate();
}
//---------------------------------------------------------------------------

[/code]
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-06-28 16:03:41 IP:122.116.xxx.xxx 訂閱
把改過的專案上傳,來讓前輩們幫你看看問題在哪 ^^
系統時間:2024-04-16 21:54:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!