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

Repaint()的問題

答題得分者是:taishyang
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-03 21:37:10 IP:163.13.xxx.xxx 未訂閱
大家好, 我在自己的程式中解AVI檔,並透過Timer繪製到另一個TBitmap中,並呼叫Repaint()藉以顯示,但會出現一閃一閃的現象,之前在BCB 5.0並無此現象,BCB 6.0就發生了. 查了HELP知道是Repaint中會呼叫Update,而Update會將Repaint的區域清為空白,因此就出現了一閃一閃的現象. 不知道大家是否有解決的辦法, 謝謝
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-03 21:46:24 IP:140.135.xxx.xxx 未訂閱
pchw8598您好: 試試加入下面的code
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Form1->DoubleBuffered=true;
}
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-03 22:02:00 IP:163.13.xxx.xxx 未訂閱
謝謝您, 問題已獲得得解決.
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-03 22:11:05 IP:163.13.xxx.xxx 未訂閱
抱歉, 問題又出現了. 當顯示的區域比較小時(160*100), 閃爍的現象確實消失, 但當顯示的區域比較大時(例如320*200),則閃爍的現象依然存在. 不知是否還有更好的解決方法否? 謝謝.
taishyang
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-03 22:15:36 IP:140.135.xxx.xxx 未訂閱
chw8598您好: 方便將您的程式碼PO上來嗎?好讓有經驗的人可以幫您看看< > 順心< >
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-03 22:25:26 IP:163.13.xxx.xxx 未訂閱
那就麻煩大家了. 解AVI的那一個程式太雜太大了,所以難po上來,在此po CAM的程式,  仍然是使用Repaint(),問題依舊.
//-------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
#include "vfw.h"    //-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;    //HDRAWDIB hCapWnd;
HWND  hCapWnd;
LRESULT PASCAL OnFrame(HWND Hwnd,LPVIDEOHDR lpvhead);
int cwidth=320,cheight=240;
bool Preview;    //-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{      Form1->DoubleBuffered=true;
  
  Image1->Picture->Bitmap= new Graphics::TBitmap();
  Image1->Picture->Bitmap->Height=cheight;
  Image1->Picture->Bitmap->Width=cwidth;
  Image1->Picture->Bitmap->PixelFormat=pf24bit;
}
//-------------------------------------------------------------------
void __fastcall TForm1::Connect1Click(TObject *Sender)
{
  ConnectCamera();
  GetCameraName();
  N320x2401Click(Sender);
  PreView1Click(Sender);
  DisplayCameraInfo(hCapWnd);
}    //-------------------------------------------------------------------
bool TForm1::ConnectCamera()
{     if (hCapWnd)
    return true;      if(!PreDetectCameraInfo())
    {
       StatusBar1->Panels->Items[0]->Text="No device.";
       return false;
     }        
  hCapWnd = capCreateCaptureWindow("My Capture Window",
                                   WS_CHILD | WS_VISIBLE,
                                   Panel1->Left 2, Panel1->Top 2, cwidth, cheight,
                                   Form1->Handle, 0);      if (!hCapWnd)
     {
       StatusBar1->Panels->Items[0]->Text="Not Connect...";
       return false;
     }
  else
    {
      if(!capDriverConnect (hCapWnd, 0))
        {
          StatusBar1->Panels->Items[0]->Text="Not Connect...";
          return false;
        }          StatusBar1->Panels->Items[0]->Text="Connecting...";
      capPreviewRate(hCapWnd, 33.3);
      capSetCallbackOnFrame(hCapWnd, OnFrame);
      return true;
    }    }    //-------------------------------------------------------------------
void __fastcall TForm1::Disconnect1Click(TObject *Sender)
{
  DisConnectCamera(&hCapWnd);
}    //-------------------------------------------------------------------
void TForm1::GetCameraName()
{      char szDeviceName[80];
  char szDeviceVersion[80];      for (int i= 0; i< 10; i  )
  {
    if(capGetDriverDescription(i, szDeviceName, sizeof (szDeviceName),
                                 szDeviceVersion,sizeof (szDeviceVersion)))
      {
        ListBox1->Items->Add(szDeviceName);
        ListBox1->Items->Add(szDeviceVersion);
      }      }    }    //-------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
  Disconnect1Click(Sender);
  exit(0);
}    //-------------------------------------------------------------------
void __fastcall TForm1::GetInfo1Click(TObject *Sender)
{
  CAPDRIVERCAPS cap;      if (!hCapWnd)
    return;      capDriverGetCaps(hCapWnd,&cap,sizeof(CAPDRIVERCAPS));
  
  if(!cap.fHasDlgVideoDisplay)
    capDlgVideoFormat(hCapWnd);
  else
    capDlgVideoDisplay(hCapWnd);    }    //-------------------------------------------------------------------
void __fastcall TForm1::N320x2401Click(TObject *Sender)
{      if (!hCapWnd)
    return;
    
  N160x1201->Checked=false;
  N320x2401->Checked=true;      AdjustCapSize(&hCapWnd, 320,240);      DisConnectCamera(&hCapWnd);
  ConnectCamera();
  ImagePreView(hCapWnd, Preview);
}    //-------------------------------------------------------------------
void __fastcall TForm1::N160x1201Click(TObject *Sender)
{      if (!hCapWnd)
    return;      N160x1201->Checked=true;
  N320x2401->Checked=false;      AdjustCapSize(&hCapWnd, 160,120);      DisConnectCamera(&hCapWnd);
  ConnectCamera();
  ImagePreView(hCapWnd, Preview);
  ChangeVideoPos(hCapWnd,50,50,160,120);
  DisplayCameraInfo(hCapWnd);    }    //-------------------------------------------------------------------
void TForm1::DisplayCameraInfo(HWND Hnd)
{      BITMAPINFO bmi;      if (!Hnd)
    return;      GetCameraInfo(Hnd,&bmi);      ListBox2->Items->Add(bmi.bmiHeader.biWidth);
  ListBox2->Items->Add(bmi.bmiHeader.biHeight);
  ListBox2->Items->Add(bmi.bmiHeader.biBitCount);
  ListBox2->Items->Add(bmi.bmiHeader.biCompression);
  ListBox2->Items->Add(bmi.bmiHeader.biSizeImage);
}    //-------------------------------------------------------------------
void __fastcall TForm1::PreView1Click(TObject *Sender)
{
  PreView1->Checked=!PreView1->Checked;
  Preview=PreView1->Checked;
  ImagePreView(hCapWnd, PreView1->Checked);
}    //-------------------------------------------------------------------    void __fastcall TForm1::Scale1Click(TObject *Sender)
{
  Scale1->Checked=!Scale1->Checked;      ImageScale(hCapWnd,Scale1->Checked);
}    //-------------------------------------------------------------------
void __fastcall TForm1::Capture2Click(TObject *Sender)
{
  SaveVideoFrame(hCapWnd,"Clip.bmp");    }    //-------------------------------------------------------------------    void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
  Edit1->Text=TrackBar1->Position;
  ChangeVideoRate(hCapWnd,TrackBar1->Position);
}    //===================================================================
//                     Capture Video Tools
//===================================================================
void TForm1::ImagePreView(HWND Hnd, bool Checked)
{
  if (!Hnd)
    return;      if(Checked)
    capPreview(Hnd, true);
  else
    capPreview(Hnd, false);
}    //-------------------------------------------------------------------
void TForm1::ImageScale(HWND Hnd, bool Checked)
{
 if (!Hnd)
    return;      if(Checked)
    capPreviewScale(hCapWnd,true);
  else
    capPreviewScale(hCapWnd,false);    }    //-----------------------------------------------------------
LRESULT PASCAL OnFrame(HWND Hwnd,LPVIDEOHDR lpvhead)
{
  Byte *ptr1;
  int Y = -1;          for (int y = cheight-1; y >=0; y--)
      {
        ptr1 = (Byte *) Form1->Image1->Picture->Bitmap->ScanLine[y];
        for (int x = 0; x < cwidth*3; x =3)
        {
          ptr1[x] = (Byte)lpvhead->lpData[  Y];
          ptr1[x 1] = (Byte)lpvhead->lpData[  Y];
          ptr1[x 2] = (Byte)lpvhead->lpData[  Y];            }
      }
      Form1->Image1->Repaint();      return 0;
}    //-------------------------------------------------------------------
bool TForm1::PreDetectCameraInfo()
{
  HWND  CapWnd;
  BITMAPINFO bmi;      CapWnd = capCreateCaptureWindow("My Capture Window",
                                   WS_CHILD | WS_VISIBLE,
                                   8, 24, cwidth, cheight,
                                   Form1->Handle, 0);      if(!CapWnd)
    return false;      if(!capDriverConnect (CapWnd, 0))
    return false;      GetCameraInfo(CapWnd,&bmi);      cwidth=bmi.bmiHeader.biWidth;
  cheight=bmi.bmiHeader.biHeight;      capDriverDisconnect(CapWnd);      return true;    }    //-------------------------------------------------------------------
void TForm1::DisConnectCamera(HWND *Hnd)
{
  if (!*Hnd)
    return;      capDriverDisconnect(*Hnd);      *Hnd=NULL;
  StatusBar1->Panels->Items[0]->Text="Disconnect...";    }    //-------------------------------------------------------------------
void TForm1::AdjustCapSize(HWND *Hnd, int w, int h)
{
  BITMAPINFO bmi;      if (!*Hnd)
    return;      GetCameraInfo(*Hnd,&bmi);      cheight=h,cwidth=w;      bmi.bmiHeader.biWidth=cwidth;
  bmi.bmiHeader.biHeight=cheight;
  bmi.bmiHeader.biBitCount=24;
  SetCameraInfo(*Hnd,bmi);      DisConnectCamera(Hnd);
  ConnectCamera();    }    //-------------------------------------------------------------------
void TForm1::GetCameraInfo(HWND Hnd,BITMAPINFO *bmi)
{
  if (!Hnd)
    return;      capGetVideoFormat(Hnd, bmi, sizeof(BITMAPINFO));
}    //-------------------------------------------------------------------
void TForm1::SetCameraInfo(HWND Hnd,BITMAPINFO bmi)
{
  if (!Hnd)
    return;      capSetVideoFormat(Hnd, &bmi,sizeof(BITMAPINFO));
}    //-------------------------------------------------------------------
void TForm1::ChangeVideoPos(HWND Hnd, int x, int y, int w, int h)
{
  if (!Hnd)
    return;      CAPSTATUS s;
  capGetStatus(Hnd, &s, sizeof(CAPSTATUS));
  s.uiImageWidth=w;
  s.uiImageHeight=h;
  SetWindowPos(Hnd,NULL,x,y,s.uiImageWidth,s.uiImageHeight,WS_CHILD | WS_VISIBLE);        }    //-------------------------------------------------------------------
void TForm1::SaveVideoFrame(HWND Hnd,AnsiString Str)
{
   if (!Hnd)
    return;       capFileSaveDIB(Hnd,Str.c_str());    }    //-------------------------------------------------------------------    void __fastcall TForm1::Capture3Click(TObject *Sender)
{
  Image2->Picture->Assign(Image1->Picture);        
}    //-----------------------------------------------------------
void TForm1::ChangeVideoRate(HWND Hnd,int Rate)
{
  if (!Hnd)
    return;      capPreviewRate(Hnd, Rate);    }    //-------------------------------------------------------------------    void __fastcall TForm1::GetDevices1Click(TObject *Sender)
{
  GetCameraName();
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Source1Click(TObject *Sender)
{
  capDlgVideoSource(hCapWnd);        
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Form1->DoubleBuffered=true;        
}
//---------------------------------------------------------------------------
發表人 - taishyang 於 2003/12/03 22:39:44
taishyang
站務副站長


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-03 22:43:58 IP:140.135.xxx.xxx 未訂閱
pchw8598您好: 不好意思,請問一下您最主要的目的是? P.S:為了增將程式碼的閱讀性,您可以參考下面聯結做適當的修改 < href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41573">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41573 發表人 - taishyang 於 2003/12/03 22:48:37
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-03 23:21:50 IP:163.13.xxx.xxx 未訂閱
只是想寫一套封裝CAM functions的tools,但遇到了Repaint的問題, 雖然可以視而不見, 但.....實在很礙眼
taishyang
站務副站長


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-03 23:36:16 IP:140.135.xxx.xxx 未訂閱
pchw8598您好:
引言: 只是想寫一套封裝CAM functions的tools,但遇到了Repaint的問題, 雖然可以視而不見, 但.....實在很礙眼
原來是這樣,那您可以參考看看小弟的拙作 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=39076 【發表】擷取攝影機畫面的Panel元件 只要加上
Form1->DoubleBuffered=true;
快速的擷取單張影像應該不會有閃爍的現象< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 - taishyang 於 2003/12/03 23:44:12
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-03 23:40:32 IP:163.13.xxx.xxx 未訂閱
先謝了, 時間已晚, 準備就寢去,使用後若有問題,再請大家幫幫忙
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-12-04 21:14:14 IP:163.13.xxx.xxx 未訂閱
今天,我使用了另Canvas->Draw就不會出現閃爍的現象了,給大家參考參考
系統時間:2024-05-13 12:34:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!