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

Form Skin 不規則表單的快速顯示程式

尚未結案
palw
初階會員


發表:45
回覆:89
積分:26
註冊:2003-02-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-03 10:50:33 IP:211.78.xxx.xxx 未訂閱
上次我引用了builder78所回應的 http://delphi.ktop.com.tw/loadfile.php?TOPICID=8760883&CC=195937 文章,去測試不規則表單,但是,我得到的結果卻不是我想要的.... 不知道我是哪裡寫錯,或是做錯了? 我有個疑問: 此篇文章的準備工作: 為你的程式準備一幅背景圖片,推薦方法是:在>>>>>>>>>>>>>=>>>>>>>> 執行之後: [> 懇請指教!
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-03 14:00:19 IP:61.221.xxx.xxx 未訂閱
存成的BMP原圖: 執行之後: 庵幫你貼上圖片 哈哈 使用方式 請參考 如何發表一篇圖文並茂的文章? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=7332 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
palw
初階會員


發表:45
回覆:89
積分:26
註冊:2003-02-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-03 14:18:19 IP:211.78.xxx.xxx 未訂閱
引言: 存成的BMP原圖: 執行之後: 庵幫你貼上圖片 哈哈 使用方式 請參考 如何發表一篇圖文並茂的文章? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=7332 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
感謝您,我知道了!!
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-03 14:42:00 IP:61.221.xxx.xxx 未訂閱
palw 網友 使用站內 搜索文章 鍵入 透明 搜尋:透明 本次搜尋共找到80筆 裡面有你要的解答 還有 建議使用小畫家 因為其他繪圖軟體之色票比較好 一但使用 會顯示嚴重 鋸齒狀 所以使用小畫家編修才能與2000的api色階較符合 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
palw
初階會員


發表:45
回覆:89
積分:26
註冊:2003-02-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-03 17:45:37 IP:210.243.xxx.xxx 未訂閱
謝謝! 但是我搜尋之後,內有些文章是用元件(我已經都下載過了),不過還是沒達到我想要的效果...其他文章部分我也看過了..跟我之前看的文章都是一樣的..
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-03 18:04:49 IP:61.221.xxx.xxx 未訂閱
庵不會寫只能說 用api指定某一顏色為去背顏色 此顏色為三原色之一 如此即可應用 不規則表單 表單內定值需設定不指定 如果 你要使用演算法把它描繪 精準去背 這樣會粉困難喔 使用元件是最快速方式 請搭配 天使 的透明範例 如何將From視窗的底色便成透明 http://delphisearch.ktop.com.tw/search.asp?MethodStr=DOIT&SearchStr=透明&MyGood=N&memberid=411 【分享】耍花招系列, 怎麼把自己的AP透明化 http://delphi.ktop.com.tw/topic.php?topic_id=21524 【問題】Form 變成半透明為何Win2000沒問題,Win98下執行會有錯誤 http://delphi.ktop.com.tw/topic.php?topic_id=26411 【Delphi】【問題】如果製造透明效果 http://delphi.ktop.com.tw/topic.php?topic_id=27566 請問要如何才能製作出任何形狀的form http://delphi.ktop.com.tw/topic.php?topic_id=19527 [推薦] C Builder中不規則窗體的快速顯示 http://delphi.ktop.com.tw/topic.php?topic_id=19817 【BCB】【問題】請問如何將多邊形著色 http://delphi.ktop.com.tw/topic.php?topic_id=25976 如果仍不行 看來你可能要上傳檔案至求助區 可以先去請教那 RaynorPao 版主 問問他 h sir版主 剛好有事 哈哈 謝謝了 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-04 04:30:37 IP:211.76.xxx.xxx 未訂閱
用你的圖來作範例~~勿怪^^ //我用BCB5寫的~~以下為原始碼~~ HRGN __stdcall GetPictureRegion( HBITMAP, COLORREF, COLORREF); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { //載入圖片(注意一下圖片背景顏色以配合描邊函數) Image1->Picture->LoadFromFile("test.bmp"); Image1->AutoSize = true; Image1->Transparent = true; Form1->AutoSize = true; Form1->BorderStyle = bsNone; HBITMAP h = Image1->Picture->Bitmap->Handle; HRGN hrgn = GetPictureRegion(h,0x0,0x0); //呼叫描邊函數(設圖片背景為黑色) //若圖片背景為白色將上一行改成 HRGN hrgn = GetPictureRegion(h,0x00ffffff,0x0); SetWindowRgn(Handle,hrgn,true); } //--------------------------------------------------------------------------- HRGN __stdcall GetPictureRegion( HBITMAP hBmp, COLORREF cTransparentColor, COLORREF cTolerance ) /**第一個參數: bmp 的 handle 第二個參數: 背景色 第三個參數: 容錯度 **/ { HRGN hRgn = NULL; if (hBmp) { HDC hMemDC = CreateCompatibleDC(NULL); if (hMemDC) { BITMAP bm; GetObject(hBmp, sizeof(bm), &bm); BITMAPINFOHEADER RGB32BITSBITMAPINFO = { sizeof(BITMAPINFOHEADER), bm.bmWidth, bm.bmHeight, 1, 32, BI_RGB, 0, 0, 0, 0, 0 }; VOID * pbits32; HBITMAP hbm32 = CreateDIBSection(hMemDC, (BITMAPINFO *)&RGB32BITSBITMAPINFO, DIB_RGB_COLORS, &pbits32, NULL, 0); if (hbm32) { HBITMAP holdBmp = (HBITMAP)SelectObject(hMemDC, hbm32); HDC hDC = CreateCompatibleDC(hMemDC); if (hDC) { BITMAP bm32; GetObject(hbm32, sizeof(bm32), &bm32); while (bm32.bmWidthBytes % 4) bm32.bmWidthBytes++; HBITMAP holdBmp = (HBITMAP)SelectObject(hDC, hBmp); BitBlt(hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hDC, 0, 0, SRCCOPY); #define ALLOC_UNIT 100 DWORD maxRects = ALLOC_UNIT; HANDLE hData = GlobalAlloc(GMEM_MOVEABLE, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects)); RGNDATA *pData = (RGNDATA *)GlobalLock(hData); pData->rdh.dwSize = sizeof(RGNDATAHEADER); pData->rdh.iType = RDH_RECTANGLES; pData->rdh.nCount = pData->rdh.nRgnSize = 0; SetRect(&pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0); BYTE lr = GetRValue(cTransparentColor); BYTE lg = GetGValue(cTransparentColor); BYTE lb = GetBValue(cTransparentColor); BYTE hr = (BYTE)min(0xff, lr + GetRValue(cTolerance)); BYTE hg = (BYTE)min(0xff, lg + GetGValue(cTolerance)); BYTE hb = (BYTE)min(0xff, lb + GetBValue(cTolerance)); BYTE *p32 = (BYTE *)bm32.bmBits + (bm32.bmHeight - 1) * bm32.bmWidthBytes; for (int y = 0; y < bm.bmHeight; y++) { for (int x = 0; x < bm.bmWidth; x++) { int x0 = x; LONG *p = (LONG *)p32 + x; while (x < bm.bmWidth) { BYTE b = GetRValue(*p); if (b >= lr && b <= hr) { b = GetGValue(*p); if (b >= lg && b <= hg) { b = GetBValue(*p); if (b >= lb && b <= hb) break; } } p++; x++; } if (x > x0) { if (pData->rdh.nCount >= maxRects) { GlobalUnlock(hData); maxRects += ALLOC_UNIT; hData = GlobalReAlloc(hData, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), GMEM_MOVEABLE); pData = (RGNDATA *)GlobalLock(hData); } RECT *pr = (RECT *)&pData->Buffer; SetRect(&pr[pData->rdh.nCount], x0, y, x, y+1); if (x0 < pData->rdh.rcBound.left) pData->rdh.rcBound.left = x0; if (y < pData->rdh.rcBound.top) pData->rdh.rcBound.top = y; if (x > pData->rdh.rcBound.right) pData->rdh.rcBound.right = x; if (y+1 > pData->rdh.rcBound.bottom) pData->rdh.rcBound.bottom = y+1; pData->rdh.nCount++; if (pData->rdh.nCount == 2000) { HRGN h = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), pData); if (hRgn) { CombineRgn(hRgn, hRgn, h, RGN_OR); DeleteObject(h); } else hRgn = h; pData->rdh.nCount = 0; SetRect(&pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0); } } } p32 -= bm32.bmWidthBytes; } HRGN h = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), pData); if (hRgn) { CombineRgn(hRgn, hRgn, h, RGN_OR); DeleteObject(h); } else hRgn = h; SelectObject(hDC, holdBmp); DeleteDC(hDC); } DeleteObject(SelectObject(hMemDC, holdBmp)); } DeleteDC(hMemDC); } } return hRgn; }
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-04 05:20:08 IP:211.76.xxx.xxx 未訂閱
忘了說明~~ 描邊函數是由深度論壇的 Keenn會員發表的~^^
系統時間:2024-04-30 5:13:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!