Mobile开发(九宫格控件)

      Mobile开发个人感觉使用九宫格的时候并不多,但有时候又不得不使用,有点类似于手机开发标志性的控件了,客户指明要用,咱们还能说啥。

      老规矩,先上控件,控件竖屏时显示为九格,横屏时显示为八格,具体需求大家可以在控件代码中自行更改,同样支持键盘和触摸操作。大家读着代码再往下看。九宫格控件

      其实,控件和代码就是自己的助手,根据自己开发的实际情况来使用,不是我有什么我都给你加上。猜测客户的真实意图,满足客户实际需求你的程序就能交工了。废话不多说了,首先介绍控件的一些要点:

      在FlexStartMenu文件中,下面这行代码取消注释将显示九宫格边框,看个人喜好

 

ContractedBlock.gif ExpandedBlockStart.gif Code
//绘制九宫格边框
                if (viewableItemCount == 9)
ExpandedBlockStart.gifContractedBlock.gif                
{
                    
//横向
                    gOffScreen.DrawLine(new Pen(SystemColors.InactiveCaption), 00this.Width, 0);
                    gOffScreen.DrawLine(
new Pen(SystemColors.InactiveCaption), 0this.Height / 3this.Width, this.Height / 3);
                    gOffScreen.DrawLine(
new Pen(SystemColors.InactiveCaption), 0this.Height * 2 / 3this.Width, this.Height * 2 / 3);

                    
//纵向
                    gOffScreen.DrawLine(new Pen(SystemColors.InactiveCaption), this.Width / 30this.Width / 3this.Height);
                    gOffScreen.DrawLine(
new Pen(SystemColors.InactiveCaption), this.Width * 2 / 30this.Width * 2 / 3this.Height);

                }

                
else if (viewableItemCount == 8)
ExpandedBlockStart.gifContractedBlock.gif                
{
                    
//横向
                    gOffScreen.DrawLine(new Pen(SystemColors.InactiveCaption), 00this.Width, 0);
                    gOffScreen.DrawLine(
new Pen(SystemColors.InactiveCaption), 0this.Height / 2this.Width, this.Height / 2);
                    
//纵向
                    gOffScreen.DrawLine(new Pen(SystemColors.InactiveCaption), this.Width / 40this.Width / 4this.Height);
                    gOffScreen.DrawLine(
new Pen(SystemColors.InactiveCaption), this.Width / 20this.Width / 2this.Height);
                    gOffScreen.DrawLine(
new Pen(SystemColors.InactiveCaption), this.Width * 3 / 40this.Width * 3 / 4this.Height);
                }

      控件中可显示图片,文字,图片还分为选中前图片和选中后图片,控制代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
//选中时的图片
            if (m_item.Press && m_item.PressIcon != null)
ExpandedBlockStart.gifContractedBlock.gif            
{
                bmp 
= m_item.PressIcon;
                selFont 
= new Font("宋体"9, FontStyle.Bold);
            }

            
else
ExpandedBlockStart.gifContractedBlock.gif            
{
                
//初始化图片
                bmp = m_item.Icon;
                selFont 
= new Font("宋体"9, FontStyle.Regular);
            }


            
//imgRect默认位置范围(绘制图片范围)
            Rectangle imgRect = new Rectangle((m_item.Left), (m_item.Top+this.Height / rowsCount * 2 / 5-30), this.Width/cellsCount, this.Height / rowsCount);

            
//imgRect
            if (bmp != null)
ExpandedBlockStart.gifContractedBlock.gif            
{
                bmp.Draw(gOffScreen, imgRect);
            }

            
//绘制文字
            
//gOffScreen.DrawString(m_item.ItemText, selFont, new SolidBrush(Color.White), (m_item.Left + 40 - gOffScreen.MeasureString(m_item.ItemText, selFont).Width / 2), (m_item.Top + this.Height / rowsCount * 2 / 5));
            

      加载控件,首先设置全局变量:

// 纵横屏幕标志 动态更换图片用 默认纵向por 横向lan
string  formSign  =   " por " ;
// 屏幕显示标志 默认为9个单位图片
int  viewCount  =   9 ;
// 九宫格控件
FlexStartMenu FlexMenu  =   new  FlexStartMenu();

      给九宫格加载数据和事件,同时添加到窗体中:

ContractedBlock.gif ExpandedBlockStart.gif Code
private void Form1_Load(object sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
{
            FlexStartItem item 
= new FlexStartItem();
            item.ItemText 
= "test1";
            item.Icon 
= AlphaImage.CreateFromFile(path + @"\Resources\index_11.png");
            item.PressIcon 
= AlphaImage.CreateFromFile(path + @"\Resources\buy.png");
            FlexMenu.Items.Add(item);
            FlexMenu.Selected 
+= new PicItemInfo(FlexMenu_Selected);
            
this.Controls.Add(FlexMenu);
        }

       响应事件:

ContractedBlock.gif ExpandedBlockStart.gif Code
/// <summary>
        
/// 点击响应事件
        
/// </summary>
        
/// <param name="myControl"></param>
        void FlexMenu_Selected(FlexStartItem myControl)
        {
            
//点击后
            MessageBox.Show(myControl.ItemText);
        }

      控件属性设置,绘制控件:

ContractedBlock.gif ExpandedBlockStart.gif Code
protected override void OnPaint(PaintEventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
if (offBitmap != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                AdjustFormLayout();
                gxBuffer 
= Graphics.FromImage(offBitmap);
                gxBuffer.Clear(
this.BackColor);
                
this.BackColor = SystemColors.MenuText;
                
//
                FlexMenu.SysColor = this.BackColor;
                
//
                FlexMenu.ViewCount = viewCount;
                
//
                FlexMenu.Location = new System.Drawing.Point(00);
                FlexMenu.TabIndex 
= 0;
                
//防止开启自动滚动条时屏幕超出报错
                FlexMenu.Height = formSize.Height - 50;
                FlexMenu.Width 
= formSize.Width;

                e.Graphics.DrawImage(offBitmap, 
00);
            }

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                e.Graphics.Clear(
this.BackColor);
            }

        }


        
protected override void OnResize(EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
base.OnResize(e);
            
if (offBitmap != null)
                offBitmap.Dispose();

            offBitmap 
= new Bitmap(this.Width, this.Height, PixelFormat.Format32bppRgb);
        }


        
public void AdjustFormLayout()
ExpandedBlockStart.gifContractedBlock.gif        
{
            Rectangle screenBounds 
= Screen.PrimaryScreen.Bounds;
            
float widthRatio = 0.0F;
            
float heightRatio = 0.0F;

            DisplayManager.GetDisplayRatiosByDpi(
thisref widthRatio, ref heightRatio);


ContractedSubBlock.gifExpandedSubBlockStart.gif            
控件按比例缩放#region 控件按比例缩放

            
if (DisplayManager.GetDisplayMode() == DisplayMode.Portrait)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
// 纵向
                formSize = new Size(screenBounds.Width, screenBounds.Height);
                formSign 
= "por";
                viewCount 
= 9;
            }

            
else if (DisplayManager.GetDisplayMode() == DisplayMode.Landscape)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
// 横向
                formSize = new Size(screenBounds.Width, screenBounds.Height);
                formSign 
= "lan";
                viewCount 
= 8;
            }

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
// 正方
                formSize = new Size(screenBounds.Width, screenBounds.Height);
                formSign 
= "por";
                viewCount 
= 9;
            }

            
#endregion


        }

      完成控件绘制后,运行效果图:

 

      最后,控件并不算完整,还有不少问题,如加载图片或文字超出9个时,因为禁了滚动条,所以是显示不出来的,就算加上,也只有增加九宫格控件的高度才有可能显示,推荐大家在页面图标不多时使用,最好不超过8个图片,考虑宽屏的时候。欢迎大家探讨控件修改的方案!

转载于:https://www.cnblogs.com/Bright-Liang/archive/2009/06/18/1505600.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值