全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1003
推到 Plurk!
推到 Facebook!

請問如何做到像 Windows 關機時快速將整個畫面填滿透明的網點?

答題得分者是:richtop
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-01 00:26:57 IP:219.137.xxx.xxx 未訂閱
我在嘗試作到像 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-01 17:31:27 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-01 22:46:28 IP:219.137.xxx.xxx 未訂閱
RichTop 您好: 因為您提供的程式碼畫出來的效果是粗方格,因此我將您設定的參數做了下列調整: int pw=1, dw=2; 測試後所產生的結果是很接近我要的效果,但仍與視窗系統關機時所顯示出來的效果有些微差距: 1. 您提供的程式碼產生的是 "網格" 的效果,視窗系統關機時所顯示的則是 "網點" 的效果。 2. 程式使用兩道迴圈並縮小 pw, dw 值之後,效果雖較接近但顯示速度變慢了。 不過到目前為止您提供的方法比我自己先前使用的方法為佳,如果我最終未能找到更好的方式的話,我就用您這段來代換掉原有的動作了,多謝您提供程式碼。
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-02 09:56:12 IP:140.129.xxx.xxx 未訂閱
RedSnow 您好:    不好意思,沒有完全了解您的需求。 我已將程式修改了一下(上一篇的紅字部分),利用Pen的Not模式來畫線。 還有您必須將Form1的Color與TransparentColorValue同時設成clWhite或clBlack,兩種顏色會有不同的視覺效果。 至於用Bitmap Brush去刷畫面會不會比較快,我沒試,您再試試看吧。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-02 17:31:34 IP:219.137.xxx.xxx 未訂閱
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 這幾個設定值,因此還沒弄清楚 0xA000C90xA0329 這兩個值是怎麼來的? 謝謝您的熱心,本題得分就加給您囉~希望下次有機會再向您討教。 發表人 -
系統時間:2024-04-17 3:16:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!