做了一個udp傳說的桌面采集的東西,但在接收方顯示時出了一些問題
我的顯示流程:將接收到的圖片流拼接成大圖,再直接用Form中的image空間assign生成的大圖,效果是顯示沒問題,不閃爍(在Form中已經定義了doublebuffered = true),但是只要將滑鼠移入視窗或者在視窗中移動,視窗就會閃爍且記憶體會開始不正常增加,考慮是不是歐尼mousemove的問題但是具體不清楚,望大神指導
貼上我的合成圖片及顯示的代碼
void CSCREENFORCEDSYNCLIENTCLASS::TransformPngToBmpAndMergeIntoOneImage()
{
int i = 0;
unsigned short usTotalWidthTemp = 0;
unsigned short usTotalHeightTemp = 0;
unsigned short usSingleWidthTemp = 0;
unsigned short usSingleHeightTemp = 0;
this->iMergeSuccess = 0;
//char cFilenameTemp[32]= ".\\test\\total.bmp";
//AnsiString ansiFileName = AnsiString(cFilenameTemp);
//定義單張bmp影像
Graphics::TBitmap *tBmpSingleBitmapTemp;
//建立整張完整的bmp物件
this->tBmpTotalBmp = new Graphics::TBitmap;
this->tBmpTotalBmp->Width = this->usTotalImageWidth;
this->tBmpTotalBmp->Height = this->usTotalImageHeight;
this->tBmpTotalBmp->PixelFormat = pf16bit;
//this->tBmpTotalBmp->Assign(Form1->Image1->Picture->Bitmap);
//建立僅由變化了的影像組成的影像
Graphics::TBitmap *tBmpChangedTotalBitmap;
tBmpChangedTotalBitmap = new Graphics::TBitmap;
tBmpChangedTotalBitmap->Width = this->usTotalImageWidth;
tBmpChangedTotalBitmap->Height = this->usTotalImageHeight;
tBmpChangedTotalBitmap->PixelFormat = pf16bit;
while(usTotalHeightTemp<this->usTotalImageHeight)
{
while(usTotalWidthTemp<this->usTotalImageWidth)
{
//若整張圖片還未填滿但存盤當前單張圖片的向量串列中所有圖片已經全部復制到整張圖片上,說明此次接受完成后圖片不全,需向發送方請求所有圖片發送
if(i>=this->vRecvImageListNow.size())
{
this->SendRequestForTotalImage();
break;
}
//將單張png轉為bmp
tBmpSingleBitmapTemp = new Graphics::TBitmap();
tBmpSingleBitmapTemp->Assign(this->vRecvImageListNow[i].tPngOfSinglePiece);
usSingleWidthTemp = tBmpSingleBitmapTemp->Width;
usSingleHeightTemp = tBmpSingleBitmapTemp->Height;
//將串列中的圖片按順序拷貝到整張大圖上
BitBlt(this->tBmpTotalBmp->Canvas->Handle,usTotalWidthTemp,usTotalHeightTemp,usSingleWidthTemp,usSingleHeightTemp,tBmpSingleBitmapTemp->Canvas->Handle,0,0,SRCCOPY);
//將變化了的圖片拷貝到另一張大圖上
if(this->vRecvImageListNow[i].iIsThisImageChanged==1)
{
this->vRecvImageListNow[i].iIsThisImageChanged = 0;
BitBlt(tBmpChangedTotalBitmap->Canvas->Handle,usTotalWidthTemp,usTotalHeightTemp,usSingleWidthTemp,usSingleHeightTemp,tBmpSingleBitmapTemp->Canvas->Handle,0,0,SRCCOPY);
}
usTotalWidthTemp = usTotalWidthTemp+usSingleWidthTemp;
i++;
//tBmpSingleBitmapTemp->FreeImage();
//tBmpSingleBitmapTemp->ReleaseHandle();
delete tBmpSingleBitmapTemp;
}//end while usTotalWidthTemp<this
usTotalHeightTemp = usTotalHeightTemp+usSingleHeightTemp;
usTotalWidthTemp = 0;
} //end while usTotalHeightTemp<this
Form1->Image1->Picture->Bitmap->Assign(this->tBmpTotalBmp);
Form2->Image1->Picture->Bitmap->Assign(tBmpChangedTotalBitmap);
delete this->tBmpTotalBmp;
delete tBmpChangedTotalBitmap;
//this->iMergeSuccess = 1;
//this->iImageShowed = 0;
//this->tBmpTotalBmp->SaveToFile(ansiFileName);
}
uj5u.com熱心網友回復:
樓主可以看一下這個有沒有用:http://blog.163.com/tab_98/blog/static/1192409720170247251785/
注意 WM_ERASEBKGND
uj5u.com熱心網友回復:
這種情況沒有必要使用Image控制元件了,你得到了圖,直接畫到記憶體CD上,然后在視窗上放一個Panel或者Label什么的,直接呼叫BitBlt畫到這些控制元件的DC就可以了,也不用開啟DoubleBufferDoubleBuffer這個東西,你不知道它內部是怎么實作的,而且Image控制元件,你也不知道它的內部重繪是怎么實作的
所以你這個問題,可以化繁為簡,不使用Image控制元件來顯示影像,自己畫到Panel上就行了
在我看來Image這個控制元件,是用來顯示靜態影像的,也就是硬碟上某一個已經存在的圖片檔案,僅此用途而已
如果你需要在某個控制元件里重復繪制很多次影像,那還是自己bitblt比較好
從你上面的代碼來看,改幾行就可以實作我說的了,應該不會閃爍的
uj5u.com熱心網友回復:
我把收到合成的bitmap用TRect復制到paint box里,游標經過不會閃爍了可是會出現床體內影像部分丟失,出現色塊,而且記憶體會暴漲,游標不碰沒有問題,跑了一晚上也很穩定uj5u.com熱心網友回復:
這個我試了,效果不是很明顯uj5u.com熱心網友回復:
還是謝了,我再試試uj5u.com熱心網友回復:
不要使用 paint box,用panel或者label試試看,paint box和image控制元件內部都有BCB自己在維護,我們在上面做渲染的時候,容易和它沖突uj5u.com熱心網友回復:
凡是用到DOUBLEBUFFER的地方,全部關閉,不要使用DOUBLEBUFFERuj5u.com熱心網友回復:
不要使用 paint box,用panel或者label試試看,paint box和image控制元件內部都有BCB自己在維護,我們在上面做渲染的時候,容易和它沖突
uj5u.com熱心網友回復:
凡是用到DOUBLEBUFFER的地方,全部關閉,不要使用DOUBLEBUFFER
uj5u.com熱心網友回復:
你是否使用了第三方皮膚庫,或者IDE自帶的皮膚?uj5u.com熱心網友回復:
你是否使用了第三方皮膚庫,或者IDE自帶的皮膚?
uj5u.com熱心網友回復:
沒有,我只使用了自帶的image/paintbox控制元件 你是否使用了第三方皮膚庫,或者IDE自帶的皮膚?
TImage和TPaintBox,最好不要作為自繪的“畫布”,用Label或者Panel即可
uj5u.com熱心網友回復:
沒有,我只使用了自帶的image/paintbox控制元件 你是否使用了第三方皮膚庫,或者IDE自帶的皮膚?
TImage和TPaintBox,最好不要作為自繪的“畫布”,用Label或者Panel即可
uj5u.com熱心網友回復:
你的畫圖,是在執行緒里面的?那不出問題是有鬼了。。。你處理資料可以在執行緒中,但是一旦涉及到任何與界面相關的內容,請使用SendMessage或者PostMessage發送訊息到主執行緒,然后主執行緒去畫圖
你在執行緒中去處理界面上的任何東西:控制元件,表單,畫圖。都會造成程式崩潰
uj5u.com熱心網友回復:
執行緒里面不要呼叫任何表單資源,表單,控制元件,只做資料處理,切記uj5u.com熱心網友回復:
執行緒里面不要呼叫任何表單資源,表單,控制元件,只做資料處理,切記
uj5u.com熱心網友回復:
怎么解決的分享一下?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/50640.html
標籤:VCL組件使用和開發
