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

關於Form Skin的程式!

尚未結案
palw
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-31 17:14:57 IP:210.243.xxx.xxx 未訂閱
請問:   先前我有試過XPMenu,的確是美化了元件,卻沒有美化到Form本身,之後,我找尋了許多的元件,但是BCB都無法使用(For Delphi),後來我找到一個元件,可以讓Form的四個角都變成圓圓的,這個元件的名稱叫做formshape..不過也僅只讓四個角都圓圓的,但我希望能做到表單是不規則的圖形(可以讓我載入圖片_圖片的圖形),至今我試過了很多的元件,不過很多都是For Delphi only...但又不希望用到ActiveSkin這個軟體..有簡單的方法/或元件可以提供給我嗎?(我有試過用API和BCB的方式繪出不規則圖形,不過感覺效果不太好.....< >) 懇請指教! < >
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-31 17:32:08 IP:203.75.xxx.xxx 未訂閱
我用過 Raize 3.0 的 RzFormShap, 感覺不錯, 可是要 $$. 另它無法做出抽屜的效果. http://www.raize.com/Default.htm Jesse Chan
------
Jesse Chan
builder78
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-31 18:11:54 IP:211.76.xxx.xxx 未訂閱
可以用SetWindowRgn 這個API 來建立不規則的視窗~~ int SetWindowRgn( HWND hWnd, //要設定區域的視窗Handle HRGN hRgn, //區域物件的Handle(區域相對於視窗左上角) BOOL bRedraw //重畫旗標(若視窗是可見的通常設true) ); 重點在 hRgn 區域物件~ 使區域物件成為你所要的不規則形狀即可~~ (1)在Form上放一個Image原件~ 並載入你要的圖形~~ (2)對圖形描邊後 建立一個區域~~ (3)將這區域指定給Form就完成了~~
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-31 22:28:14 IP:61.228.xxx.xxx 未訂閱
我補充說明一點, 這些不規則 form 的方法應都是同樣出自 Win32 API, 我不懂你說的效果不太好的意思. Jesse Chan
------
Jesse Chan
palw
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-01 11:32:10 IP:210.243.xxx.xxx 未訂閱
引言: 我補充說明一點, 這些不規則 form 的方法應都是同樣出自 Win32 API, 我不懂你說的效果不太好的意思. Jesse Chan
謝謝builder78 & jessechan: 不過因為之前在測試Win32的API有殘影,雖然可以達成我要的效果 但是非常的複雜,而且重點是效果不好...所以我後來有嘗試使用Active Skin, 雖然效果超棒,不過需要$,所以希望能找其他的元件來達成一樣的效果...可以自己設計 >
builder78
初階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-01 16:25:48 IP:211.76.xxx.xxx 未訂閱
你說的會有殘影應該是 視窗快速移動時所產生的吧~可能跟下列有關 給你參考一下~ (1)程式描邊技巧的快慢(當然越快越好) (2)圖形的複雜度盡量簡單點(因為越複雜描邊越慢) (3)設計圖形時圖的上下左右盡量不要留空白的邊 (4)圖形長寬大小越小則越快 (5)跟電腦本身的快慢也有關
palw
初階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-01 17:33:56 IP:211.78.xxx.xxx 未訂閱
引言: 你說的會有殘影應該是 視窗快速移動時所產生的吧~可能跟下列有關 給你參考一下~ (1)程式描邊技巧的快慢(當然越快越好) (2)圖形的複雜度盡量簡單點(因為越複雜描邊越慢) (3)設計圖形時圖的上下左右盡量不要留空白的邊 (4)圖形長寬大小越小則越快 (5)跟電腦本身的快慢也有關
謝謝builder78的回應: (1)程式描邊技巧的快慢(當然越快越好)-->怎麼變快呢? ( >
builder78
初階會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-01 19:05:44 IP:211.76.xxx.xxx 未訂閱
例如下面這張圖就留太多邊 這張就對了^^
palw
初階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-02 14:05:51 IP:211.78.xxx.xxx 未訂閱
引言: 例如下面這張圖就留太多邊 [img]http://delphi.ktop.com.tw/loadfile.php?TOPICID=8743355&CC=195545"> 這張就對了^^ [img]http://delphi.ktop.com.tw/loadfile.php?TOPICID=8743668&CC=195552">
喔~~瞭解了,謝謝你,builder78 我是引用keenn 會員所發表的文章之一的其中一段內容: 圖形外觀 這部分比較難, 你必須有修過"影像處理"或"電腦繪圖"等相關課程, 了解邊緣搜尋相關 演算法... 這裡我直接公佈原始碼, 供大家使用, 免除大家到處找元件, 有時還找到的只是試用版 ,...#@#$ , 把source公開出來又何仿 ^_^ . . . . (請搭配此演算法, 與 SetWindowRgn 函數) 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; } 註: 當一個表單失去 caption bar時, 你便無法用滑鼠拖曳此表單, 請將下面程式加 入 FormMouseDown 事件裡: void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbLeft ) { ReleaseCapture(); Perform( WM_SYSCOMMAND, 0xf012, 0 ); Application->ProcessMessages(); } } 但是總會有Error發生,complier都無法通過....(BCB5之下)
builder78
初階會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-02 16:34:34 IP:211.76.xxx.xxx 未訂閱
我沒修過"影像處理"或"電腦繪圖"等相關課程, 但我想描邊的方法很多種不一定要用複雜演算法 我以前找到一篇不錯的文章(含圖)~原理很簡單不必修任何課程也看的懂~^^    我已上傳請到這裡下載(下載完用IE打開) http://delphi.ktop.com.tw/loadfile.php?TOPICID=8760883&CC=195937
palw
初階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-02 17:12:44 IP:211.78.xxx.xxx 未訂閱
引言: 我沒修過"影像處理"或"電腦繪圖"等相關課程, 但我想描邊的方法很多種不一定要用複雜演算法 我以前找到一篇不錯的文章(含圖)~原理很簡單不必修任何課程也看的懂~^^ 我已上傳請到這裡下載(下載完用IE打開) http://delphi.ktop.com.tw/loadfile.php?TOPICID=8760883&CC=195937
謝謝builder78 ~
系統時間:2024-04-30 3:56:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!