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

如何強化PopupMenu效果

答題得分者是:daldal
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-12-23 02:06:23 IP:114.33.xxx.xxx 訂閱
一般直接用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-12-23 12:44:13 IP:61.219.xxx.xxx 未訂閱
希望實做元件的話
那就是把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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-12-23 21:55:00 IP:114.33.xxx.xxx 訂閱
請要如何做出左側的灰色條裝呢?

謝謝!!
------
-謝謝大大熱心的回覆!謝謝!
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-12-24 10:33:38 IP:61.219.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-12-24 23:15:45 IP:114.33.xxx.xxx 訂閱
實在太感謝daldal 大大 ,這麼用心的回覆!
謝謝!!
------
-謝謝大大熱心的回覆!謝謝!
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-12-25 11:04:02 IP:61.219.xxx.xxx 未訂閱
不好意思,借你主題順便紀錄一下國外一些美化效果的教學

如何做出玻璃透明選單特效
  • Using WM_INITMENUPOPUP message
  • Using Owner Draw method
  • Superclassing menu class
  • Using Hooks
重點在於選單也是一種form, 所以若是要讓form擁有某些特效
需要使用 api,hook 改變其內定屬性 (透明、有無邊框、字體等等)
這種方式比較簡單,主要是在既有的 api 上面稍作修改

如何更換不同主題,那就得用自訂的類別囉
其實OFFICEXP能做的漂亮,很大的因素是在於他沒有直接
使用WINDOWS內建API去畫出menu選單,而是重新繼承
類別後再改寫出來,果然是一分努力才可能有一分收穫...
編輯記錄
daldal 重新編輯於 2009-12-25 11:07:52, 註解 排版‧
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-12-25 12:28:22 IP:114.33.xxx.xxx 訂閱
不會!

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, 註解 無‧
系統時間:2024-04-27 4:44:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!