請問如何做到像 Windows 關機時快速將整個畫面填滿透明的網點? |
答題得分者是:richtop
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
我在嘗試作到像 Windows 關機動作時,將畫面都填滿網點的狀態,我使用以下的方式來處理: 1. 動態建立一個 TForm,並設為透明狀態: ClipBox = new TForm(this);
ClipBox->BorderStyle = bsNone;
ClipBox->Brush->Style = bsClear;
ClipBox->SetBounds(0, 0, Screen->Width, Screen->Height);
ClipBox->Show(); 2. 動態建立一個 TBitmap,並載入一個 2x2 點的網點圖檔: Graphics::TBitmap *MaskBitmap = new Graphics::TBitmap;
TRect RR = ClipBox->BoundsRect; // Bitmap2x2.bmp 圖檔內僅有四個黑白交錯的點,右上與左下角是白色
MaskBitmap->LoadFromFile("Bitmap2x2.bmp"); 3. 我嘗試以下方式,但各有缺點:
(1)可以正確填出透明網點,但僅能填出 2x2 的區域 (原圖大小) MaskBitmap->Transparent = true;
MaskBitmap->TransparentMode = tmAuto;
ClipBox->Canvas->Draw(0, 0, MaskBitmap); (2)承襲第一個方式,加上迴圈處理,可以正確的將整個畫面填滿透明網點,但速度太慢。 int y = 0;
int x;
while( y < Screen->Height){
x = 0;
while( x < Screen->Width){
ClipBox->Canvas->Draw(x, y, MaskBitmap);
x = MaskBitmap->Width;
}
y = MaskBitmap->Height;
} (3)速度較快,但是卻無法做到透明效果。 ClipBox->Canvas->Brush->Bitmap = MaskBitmap;
ClipBox->Canvas->FillRect(RR); *************************************** 請教各位先進們,可有什麼好方式可以快速的在整個畫面上填滿透明網點嗎? 發表人 - RedSnow 於 2004/11/01 00:39:56
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
RedSnow 您好: 底下程式碼,可以產生透明網點的效果,請參考修改! < class="code">
Form1屬性設定如下:
Form1
BorderStyle = bsNone;
TransparentColor = true;
TransparentColorValue = clWhite;
WindowState = wsMaximized;
=================================================
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender)
{ int pw=8, dw=12; Form1->Canvas->Pen->Width = pw;
Form1->Canvas->Pen->Color = clWhite; for (int y=0; y<Form1->ClientHeight; y =dw)
{ Form1->Canvas->MoveTo(0, y);
Form1->Canvas->LineTo(Form1->ClientWidth, y);
}
for (int x=0; x<Form1->ClientWidth; x =dw)
{ Form1->Canvas->MoveTo(x, 0);
Form1->Canvas->LineTo(x, Form1->ClientHeight);
}
}
//---------------------------------------------------------------------------
RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
RichTop 您好: 因為您提供的程式碼畫出來的效果是粗方格,因此我將您設定的參數做了下列調整: int pw=1, dw=2; 測試後所產生的結果是很接近我要的效果,但仍與視窗系統關機時所顯示出來的效果有些微差距: 1. 您提供的程式碼產生的是 "網格" 的效果,視窗系統關機時所顯示的則是 "網點" 的效果。 2. 程式使用兩道迴圈並縮小 pw, dw 值之後,效果雖較接近但顯示速度變慢了。 不過到目前為止您提供的方法比我自己先前使用的方法為佳,如果我最終未能找到更好的方式的話,我就用您這段來代換掉原有的動作了,多謝您提供程式碼。
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
RedSnow 您好: 不好意思,沒有完全了解您的需求。
我已將程式修改了一下(上一篇的紅字部分),利用Pen的Not模式來畫線。
還有您必須將Form1的Color與TransparentColorValue同時設成clWhite或clBlack,兩種顏色會有不同的視覺效果。 至於用Bitmap Brush去刷畫面會不會比較快,我沒試,您再試試看吧。 RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
RichTop 您好: 我在網路上找到更好的方式了,以下的程式碼供您及其他的網友們參考 (粗體字是處理效果的重點部份,其它的設定與處理略過): ClipBox = new TForm(this);
ClipBox->BorderStyle = bsNone;
ClipBox->Brush->Style = bsClear;
ClipBox->SetBounds(0, 0, Screen->Width, Screen->Height);
ClipBox->Show(); unsigned short ptn[8]={0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA};
HBITMAP hbm=CreateBitmap(8, 8, 1, 1, ptn);
HBRUSH hbs=CreatePatternBrush(hbm);
HDC hdc = GetDC(ClipBox->Handle); SelectObject(hdc, hbs); DWORD ROP = 0xA0329;
// ROP 也可用 0xA000C9 這個值來設定,效果大致相同
PatBlt(hdc, 0, 0, ClipBox->Width, ClipBox->Height, ROP); DeleteObject(hbm);
ReleaseDC(ClipBox->Handle, hdc); 這段碼蠻簡潔的,執行速度夠快、效果也正是我想要的,但是我查看 WIN API 的說明資料,PatBlt() 的 ROP 參數僅有 PATCOPY, PATINVERT, DSTINVERT, BLACKNESS, WHITENESS 這幾個設定值,因此還沒弄清楚 0xA000C9 與 0xA0329 這兩個值是怎麼來的? 謝謝您的熱心,本題得分就加給您囉~希望下次有機會再向您討教。 發表人 -
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |