天天看點

ExtJs4 筆記(13) Ext.menu.Menu 菜單、Ext.draw.Component 繪圖、Ext.resizer.Resizer 大小變更...

《回到系列目錄

本篇講解菜單、繪圖、還有大小變更控件。菜單控件可以附加到各種其他控件中,比如按鈕、工具欄等,甚至可以直接通過通過右鍵打開(模拟右鍵菜單);ext對繪圖的支援可以讓我們通過js來繪圖;大小變更控件可以讓各種html元素擷取可變更大小的能力。下面我們一一詳細介紹。

一、Ext.menu.Menu 菜單

1.菜單的定義

下面我們來定義一個菜單,它包括一個下拉清單,還有顔色選擇器,日期選擇器等菜單項。

[Js]

//下定義一個下拉清單
    var combo = Ext.create('Ext.form.ComboBox', {
        store: new Ext.data.ArrayStore({
            fields: ['id', 'name'],
            data: [[1, "張三"], [2, "李四"], [3, "王五"], [4, "趙六"]]
        }),
        displayField: 'name',
        typeAhead: true,
        mode: 'local',
        triggerAction: 'all',
        emptyText: '請選擇..',
        selectOnFocus: true,
        width: 135
    });

    //這裡是菜單的定義
    var menu = Ext.create('Ext.menu.Menu', {
        id: 'mainMenu',
        style: {
            overflow: 'visible'
        },
        items: [
            combo,
            {
                text: '複選框',
                checked: true
            }, '-', {
                text: '單選子菜單',
                menu: {
                    items: [
                        '<b>請選擇一個人名</b>',
                        {
                            text: '張三',
                            checked: true,
                            group: 'theme'
                        }, {
                            text: '李四',
                            checked: false,
                            group: 'theme',
                            checkHandler: function () {
                                Ext.MessageBox.alert("消息", "李四被選擇!")
                            }
                        }, {
                            text: '王五',
                            checked: false,
                            group: 'theme'
                        }, {
                            text: '趙六',
                            checked: false,
                            group: 'theme'
                        }
                    ]
                }
            }, {
                text: '請選擇一個日期',
                menu: Ext.create('Ext.menu.DatePicker', {
                    handler: function (dp, date) {
                        Ext.MessageBox.alert('消息', '你選擇了:' + date.format('Y-m-d'));
                    }
                })
            }, {
                text: '選擇一個顔色',
                menu: Ext.create('Ext.menu.ColorPicker', {
                    handler: function (cm, color) {
                        Ext.MessageBox.alert('消息', '你選擇了:' + color);
                    }
                })
            }
        ]
    });
           

2.把菜單附加到面闆工具欄

我們定義一個面闆,然後通過剛剛定義的菜單實作菜單欄。

[Js]

//把菜單附加到工具欄上
    var panel = new Ext.Panel({
        renderTo: 'div1',
        width: 600,
        height: 250,
        collapsible: true,
        layout: 'fit',
        title: '示範工具欄',
        tbar: [{ text: "菜單", menu: menu}]
    });
           

下面看看展示效果:

ExtJs4 筆記(13) Ext.menu.Menu 菜單、Ext.draw.Component 繪圖、Ext.resizer.Resizer 大小變更...

2.實作右鍵菜單

還是用第一步定義的菜單,現在我們通過右鍵事件的方式實作右鍵菜單:

[Js]

//定義右鍵菜單
    Ext.getDoc().on('contextmenu', function (e, o) {
        e.preventDefault();
        menu.showAt(e.getXY());

        //第二種寫法:
        //e.stopEvent();
        //menu.showAt([e.getPageX(), e.getPageY()]);
    });
           

單擊右鍵,效果如下:

ExtJs4 筆記(13) Ext.menu.Menu 菜單、Ext.draw.Component 繪圖、Ext.resizer.Resizer 大小變更...

3.在ListView中定義右鍵菜單

這裡我們借用第11篇的ListView,我們要實作當資料行右鍵單擊時,彈出菜單的效果。

[Js]

var store = new Ext.data.JsonStore({
        fields: [
        { name: 'IntData', type: 'int' },
        { name: 'StringData', type: 'string' },
        { name: 'TimeData', type: 'date' }
       ],
        proxy: {
            type: 'ajax',
            url: 'ListView1Json',
            reader: {
                type: 'json',
                root: 'rows'
            }
        },
        sortInfo: { field: 'IntData', direction: 'DESC' }
    });
    store.load();

    var listView = Ext.create('Ext.ListView', {
        renderTo: "div1",
        store: store,
        multiSelect: true,
        emptyText: '無資料',
        reserveScrollOffset: true,
        hideHeaders: false,
        columns: [{
            header: "IntData",
            dataIndex: 'IntData'
        }, {
            header: "StringData",
            dataIndex: 'StringData'
        }, {
            header: "TimeData",
            dataIndex: 'TimeData',
            align: 'right',
            xtype: 'datecolumn',
            format: 'm-d h:i a'
        }],
        viewConfig: {
            stripeRows: true,
            listeners: {
                itemcontextmenu: function (view, rec, node, index, e) {
                    e.stopEvent();
                    menu.showAt(e.getXY());
                    return false;
                }
            }
        }
    });
           

在ListView中單擊右鍵,效果如下:

ExtJs4 筆記(13) Ext.menu.Menu 菜單、Ext.draw.Component 繪圖、Ext.resizer.Resizer 大小變更...

二、Ext.draw.Component 繪圖

Ext支援通過js的方式繪圖,可以繪制的包括基本圖形圓形、矩形等,還可以描繪路徑,因為它支援SVG路徑文法。

1.實作文本繪圖

[Js]

Ext.create('Ext.draw.Component', {
            renderTo: Ext.getBody(),
            viewBox: false,
            draggable: {
                constrain: true,                    //允許拖動
                constrainTo: Ext.getBody()
            },
            floating: true,
            autoSize: true,
            items: [{
                type: 'text',
                text: '圖形化的文本',
                fill: 'green',
                font: '16px Arial',
                rotate: {
                    degrees: 45
                }
            }]
        });
           

通過上面的代碼,我們可以展示出圖檔式文本,效果如下:

ExtJs4 筆記(13) Ext.menu.Menu 菜單、Ext.draw.Component 繪圖、Ext.resizer.Resizer 大小變更...

2.基本圖形,路徑繪圖

我們先通過基本圖形繪制一個圓形,一個長方形,最後通過路徑文法繪制一個等腰三角形:

[Js]

var drawComponent = Ext.create('Ext.draw.Component', {
        viewBox: false,
        items: [{
            type: 'circle',                     //園
            fill: '#79BB3F',
            radius: 100,
            x: 100,
            y: 100
        }, {
            type: 'rect',                       //矩形
            width: 50,
            height: 30,
            fill: '#f00',
            x: 0,
            y: 0
        }, {
            type: "path",
            path: "M100 0 L150 50 L200 0 Z",    //路徑
            "stroke-width": "1",
            stroke: "#000",
            fill: "blue"
        }]
    });

    Ext.create('Ext.Window', {
        width: 230,
        height: 250,
        layout: 'fit',
        items: [drawComponent]
    }).show();
           

效果如下:

ExtJs4 筆記(13) Ext.menu.Menu 菜單、Ext.draw.Component 繪圖、Ext.resizer.Resizer 大小變更...

三、Ext.resizer.Resizer 大小變更

官方示例上作者說,他奶奶都會寫這段代碼,是以我也不想多講了,應該很簡單。控件的實作方式如下:

[Js]

Ext.onReady(function () {

    var basic = Ext.create('Ext.resizer.Resizer', {
        target: 'basic',
        pinned: true,               //是否顯示調節邊框
        width: 200,
        height: 100,
        minWidth: 100,
        minHeight: 50,
        dynamic: true,              //動态設定
        preserveRatio: true,        //當變更大小時,長寬比例是否固定
        heightIncrement: 20,        //單次變更,高度變更值
        widthIncrement: 20,
        transparent: false          //是否徹底隐藏調節邊框
    });
});
           

效果如下:

ExtJs4 筆記(13) Ext.menu.Menu 菜單、Ext.draw.Component 繪圖、Ext.resizer.Resizer 大小變更...

作者:李盼(Lipan)

出處: [Lipan] ( http://www.cnblogs.com/lipan/)

版權聲明:本文的版權歸作者與部落格園共有。轉載時須注明本文的詳細連結,否則作者将保留追究其法律責任。

轉載于:https://www.cnblogs.com/lipan/archive/2011/12/26/2301426.html