如何強化PopupMenu效果 |
答題得分者是:daldal
|
l90425
初階會員 發表:95 回覆:152 積分:49 註冊:2008-04-03 發送簡訊給我 |
一般直接用PopupMenu物件做出來的效果是
http://cn.ziddu.com/download/442119/2.JPG.html 但是要如何才能做到下面的效果呢? http://cn.ziddu.com/download/442117/1.JPG.html 能否請大大給予提示呢! 感謝大大!謝謝!!
------
-謝謝大大熱心的回覆!謝謝! 編輯記錄
l90425 重新編輯於 2009-12-23 21:53:32, 註解 無‧
|
daldal
高階會員 發表:6 回覆:102 積分:226 註冊:2007-06-18 發送簡訊給我 |
希望實做元件的話
那就是把Popmenu的OnwerDraw=true 然後在MenuItem的OnAdvanceDraw, OnMeasureItem自己處理Canvas的問題囉 OnMeasureItem -> 決定欄位大小 通常你左邊希望有圖片的話,就是在這邊決定額外的大小 若是字體變更的話,也是在這邊決定每一行的高度 OnAdvanceDraw -> 實作Checked, Unchecked, focus, select .....等狀態 決定背景、字體、位置、圖片等等 應用的話,可以直接使用一些第三方控件 XPMenu 3.1 原始網站 www.shagrouni.com/english/software/xpmenu.html 安裝方式 http://delphi.ktop.com.tw/board.php?cid=31&fid=77&tid=45989 他裡面有附上source code (pascal format) 可以參考看看,可以省下很多摸索的時間
編輯記錄
daldal 重新編輯於 2009-12-23 13:31:59, 註解 附上安裝方式‧
|
l90425
初階會員 發表:95 回覆:152 積分:49 註冊:2008-04-03 發送簡訊給我 |
|
daldal
高階會員 發表:6 回覆:102 積分:226 註冊:2007-06-18 發送簡訊給我 |
http://delphi.ktop.com.tw/download.php?download=upload/4b32d1643cf4d_popupmenu.7z
Disable, Grey, Radio 等等狀態 端看需求自行增加囉 放入 ImageList1 , PopupMenu1(裡面新增四個 MenuItem, N1, N2, N3, N4) N1~N4 使用共同的事件 MyMeasureItem, MyAdvancedDrawItem .cpp [code cpp] //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } ACanvas->Pen->Color=clSkyBlue; ACanvas->Brush->Style=bsSolid; ACanvas->Brush->Color=clSkyBlue; ACanvas->Rectangle(PictureRect); //畫出Checked的部分 if(State.Contains(odChecked)) { ACanvas->Pen->Style=psSolid; ACanvas->Pen->Color=clBlack; ACanvas->Brush->Style=bsSolid; ACanvas->Brush->Color=clBackground; ACanvas->Rectangle(CheckRect); } //畫出圖形部分 Images->Draw(ACanvas, ARect.left (32-Images->Width)/2, ARect.top (32-Images->Height)/2, ((TMenuItem*)Sender)->ImageIndex, true); //畫出文字的背景部分 ACanvas->Brush->Style = bsSolid; if(State.Contains(odSelected)) { ACanvas->Pen->Color = clBlue; ACanvas->Brush->Color = clBlue; } else { ACanvas->Pen->Color = clBtnFace; ACanvas->Brush->Color = clBtnFace; } ACanvas->Rectangle(TextBgRect); //畫出文字部分 ACanvas->Font->Size = 11; ACanvas->Brush->Style = bsClear; DrawText(ACanvas->Handle, ((TMenuItem*)Sender)->Caption.c_str(), ((TMenuItem*)Sender)->Caption.Length(), &TextRect, DT_VCENTER|DT_SINGLELINE); } //--------------------------------------------------------------------------- [/code] .h [code cpp] //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include #include #include #include <Forms.hpp><br />#include #include //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TPopupMenu *PopupMenu1; TImageList *ImageList1; TMenuItem *N1; TMenuItem *N2; TMenuItem *N3; TMenuItem *N4; void __fastcall MyMeasureItem(TObject *Sender, TCanvas *ACanvas, int &Width, int &Height); void __fastcall MyAdvancedDrawItem(TObject *Sender, TCanvas *ACanvas, TRect &ARect, TOwnerDrawState State); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif [/code] |
l90425
初階會員 發表:95 回覆:152 積分:49 註冊:2008-04-03 發送簡訊給我 |
|
daldal
高階會員 發表:6 回覆:102 積分:226 註冊:2007-06-18 發送簡訊給我 |
不好意思,借你主題順便紀錄一下國外一些美化效果的教學
如何做出玻璃透明選單特效
需要使用 api,hook 改變其內定屬性 (透明、有無邊框、字體等等) 這種方式比較簡單,主要是在既有的 api 上面稍作修改 如何更換不同主題,那就得用自訂的類別囉 其實OFFICEXP能做的漂亮,很大的因素是在於他沒有直接 使用WINDOWS內建API去畫出menu選單,而是重新繼承 類別後再改寫出來,果然是一分努力才可能有一分收穫...
編輯記錄
daldal 重新編輯於 2009-12-25 11:07:52, 註解 排版‧
|
l90425
初階會員 發表:95 回覆:152 積分:49 註冊:2008-04-03 發送簡訊給我 |
不會!
SetLayeredWindowAttributes( Hwnd: THandle;{透明色} bAlpha: Byte;{LWA_COLORKEY(=1)表示使用透明色; LWA_ALPHA(=2)表示使用 Alpha 值} ): Boolean;當取值為LWA_ALPHA時,crKey參數無效,bAlpha參數有效; 當取值為LWA_COLORKEY時,bAlpha參數有效而窗體中的所有顏色為crKey的地方將變為透明。LWA_ALPHA =0x2 LWA_COLORKEY=0x1。 要使使窗體擁有透明效果,首先要有WS_EX_LAYERED擴展屬性(舊的sdk沒有定義這個屬性,所以可以直接指定為0x80000). WS_EX_LAYERED = 0x80000 [code cpp] void __fastcall TForm1::Button1Click(TObject *Sender) { HWND hwnd=Form1->Handle; ::SetWindowLong(hwnd, GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE) | WS_EX_LAYERED); ::SetLayeredWindowAttributes(hwnd,0,150,LWA_ALPHA); } [/code]
------
-謝謝大大熱心的回覆!謝謝!
編輯記錄
l90425 重新編輯於 2009-12-25 12:28:45, 註解 無‧
l90425 重新編輯於 2009-12-25 12:32:47, 註解 無‧ l90425 重新編輯於 2009-12-25 12:38:50, 註解 無‧ l90425 重新編輯於 2009-12-25 12:40:58, 註解 無‧ l90425 重新編輯於 2009-12-25 12:41:45, 註解 無‧ l90425 重新編輯於 2009-12-25 12:44:06, 註解 無‧ l90425 重新編輯於 2009-12-25 12:44:27, 註解 無‧ l90425 重新編輯於 2009-12-25 12:45:23, 註解 無‧ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |