欢迎使用CSDN-markdown编辑器

c# 多TabPage中的PictureBox实现拖拽文件并显示

代码块

代码块语法遵循标准markdown代码,例如:

        string fileName = string.Empty;
        private void ImageScan_DragDrop(object sender, DragEventArgs e)
        {
            //获取第一个文件名
            fileName = (e.Data.GetData(DataFormats.FileDrop, false) as String[])[0];
            try
            {
                Point screenPoint = Control.MousePosition;//鼠标相对于屏幕左上角的坐标
                Point formPoint = this.PointToClient(Control.MousePosition);//鼠标相对于窗体左上角的坐标
                //Point contextMenuPoint = contextMenuStrip1.PointToClient(Control.MousePosition); //鼠标相对于contextMenuStrip1左上角的坐标


                label1.Location = winPoint;


                IntPtr formHandle = WindowFromPoint(winPoint);//得到窗口句柄
                Control con = Control.FromHandle(formHandle);

                Point point = this.PointToScreen(new Point(e.X, e.Y));
                DragOverSetPic(screenPoint, this.Controls, fileName);
            }
            catch (Exception) { MessageBox.Show("文件格式不对"); }
        }




private void DragOverSetPic(Point point, System.Windows.Forms.Control.ControlCollection c, string fileName)
        {
            foreach (Control item in c)
            {
                if (item.HasChildren)
                {
                    //如果是tabPage,只选择当前激活页遍历,SkinTabPage,if(this.ta.tabControl1.SelectedTab==)
                    if (item is CCWin.SkinControl.SkinTabPage)
                    {
                        if (item.Visible)
                            DragOverSetPic(point, item.Controls, fileName);
                    }
                    else
                        DragOverSetPic(point, item.Controls, fileName);
                }
                if (item is CCWin.SkinControl.SkinPictureBox)
                {
                    Rectangle rc = item.RectangleToScreen(item.ClientRectangle);
                    if (rc.Contains(point))                    
                        ((CCWin.SkinControl.SkinPictureBox)(item)).ImageLocation = fileName;                    
                }
            }
        }


       private void ImageScan_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.All;
            else e.Effect = DragDropEffects.None;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目前这方面的软件很多,但大部分都是收费的,不收费大部分又换的不全,对于一个学生来说花钱买是有些奢侈了,所以我一直就想做一个换肤软件提供给学生,让他们做课程设计或毕业设计时能轻易给自己软件美化界面。 但是一直苦于时间有限。工作太忙有时只能在周末或晚上写上两行代码。现在终于成形了本打算开源,但是有些地方还不完善(现只支持VC MFC, Windows Type: Dialog, SDI),所以现在只讲下原理,提供部分源码供感兴趣的人研究。现在发出来与大家共享。 现在商业的换肤软件大部分都是采用的Hook技术(呵呵,猜的,也许采用的更高深的技术)。Hook窗体消息,对窗体消息进行截获最终换成自已的处理方式。所以本人写的SkinMaster也是采用了同样的技术原理。说很简单但做起来有些困难。下面是我做Skin时遇到的问题及处理方式。 1.对于Windows基本控件进行Hook则可完成绘制。 2.对于菜单会制则有些麻烦,程序运行时窗体菜单WM_MEASUREITEM只运行一次,所以会出现在动态换另一套皮肤时菜单项大小不会跟据皮肤改变,解决方法是所有菜单你要动态生成。 3.主窗体的绘制,没啥太深技术就是要处理大量的消息。 4.滚动条的绘制,滚动条全靠Hook消息就没办法完成了,这个东西微软做的不像基本控件那样工作,还要对滚动条的API进行Hook。 先写这些,有时间我会把更详细的方法给大家写出来。下面程序TestSkin程序提供源码,并完成了按钮等控件的换肤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值