如何在c#winforms(TabControl)中的TabPage上绘制一些png图片?

如何在c#winforms(TabControl)中的TabPage上绘制一些png图片?,c#,winforms,tabs,drawing,C#,Winforms,Tabs,Drawing,所以我在winform上基本上有3个选项卡,我要做的是,当在第一个选项卡中单击按钮时,切换到第三个选项卡(System.Windows.Forms.TabControl)(它是空的)并在上面绘制一些图片 我想找到的是一种在winform上显示一些png的快速简便方法。 如有任何建议,将不胜感激 提前谢谢。 机械师 EDIT1~按照我的设计,有一个System.Windows.Forms.TabControl(winforms工具箱),其中的第一个tabPage中有3个按钮,代表我的主菜单。我想做

所以我在winform上基本上有3个选项卡,我要做的是,当在第一个选项卡中单击按钮时,切换到第三个选项卡(System.Windows.Forms.TabControl)(它是空的)并在上面绘制一些图片

我想找到的是一种在winform上显示一些png的快速简便方法。 如有任何建议,将不胜感激

提前谢谢。 机械师

EDIT1~按照我的设计,有一个System.Windows.Forms.TabControl(winforms工具箱),其中的第一个tabPage中有3个按钮,代表我的主菜单。我想做的是,当单击开始(其中一个按钮)时,我的“地图”(一些.png图像)将显示在第二个选项卡页面中

EDIT2~‘我的地图’=基本上是随机选择(或基于算法)的一些png,并将其中一个相邻放置以形成一个正方形或矩形(例如,32x32(png’s by png’s-每个png的像素最好为125x125)尺寸


EDIT3~地图的整体(总)大小应该(最好)易于更改(不是实时更改,但应该可以缩放,这意味着我希望(将来)制作一个“选项”按钮,使用户可以从尺寸列表中进行选择(例如32x32、64x64、78x78..任何尺寸都可以..)

绘制“几张图片”的问题原来是指:将数量灵活的图片组合成一张地图

在目标选项卡页面上放置一个足够大的
PictureBox
,可能带有
Dock=Fill
SizeMode=Center

如果你想从磁盘加载图片,你需要提供图片的名称。我选择了一个字符串列表,这是一个灵活的列表,由你来正确填写

我在磁盘上有硬编码的文件名。您可以使用代码设置文件名

我假设地图的所有部分都有相同的大小

private void button5_Click(object sender, EventArgs e)
{
    // switch to the second tabpage:
    tabControl1.SelectedIndex = 1;

     // i load all pictures from disk:
    string rootPath = "D:\\scrape\\sousers\\";

    // I use these hard coded pictures:
    List<List<string>> mapsParts = new List<List<string>>();
    mapsParts.Add(new List<string>()  
    { "dura.jpg", "SOU_HansP.png", "SOU_shiva.jpg", "SOU_Taw.jpg"} ) ;
    mapsParts.Add(new List<string>() 
    {"SOU_JonSkeet.jpeg", "SOU_geo.jpeg", "SOU_Antwina.jpg", "SOU_Enijar.png"} ) ;
    mapsParts.Add(new List<string>() 
    { "SOU_Ayna.jpg", "SOU_TAW2.jpg", "SOU_Lightness.jpg", "SOU_EricLippert.jpeg"} ) ;

    // i deduce the dimensions.. :
    int maxRow = mapsParts.Count;
    int maxCol = mapsParts[0].Count;

    // this is my screen dpi:
    int dpi = 96;
    // I deduce the size of one map part:
    Bitmap bmp = new Bitmap(rootPath + mapsParts[0][0]);
    int w = bmp.Width;
    int h = bmp.Height;
    bmp.Dispose();
    // now I know the total size of the map
    Bitmap bmpMap = new Bitmap(w * maxCol, h * maxRow);
    bmpMap.SetResolution(dpi, dpi); 
    // now I'll draw the parts onto the map:
    using (Graphics G = Graphics.FromImage(bmpMap) )
    for (int i = 0; i < maxRow; i++)
        for (int j = 0; j <maxCol; j++)
        {
           // read each part:
           bmp = new Bitmap(rootPath + mapsParts[i][j]);
           // make sure it has the same resolution:
           bmp.SetResolution(dpi, dpi);
           // draw it
           G.DrawImage(bmp, j * w, i * h);
           // clean up
           bmp.Dispose();
        }
    // done. We can show the map:
    pictureBox1.Image = bmpMap;
}
private void按钮5_单击(对象发送者,事件参数e)
{
//切换到第二个选项卡页:
tabControl1.SelectedIndex=1;
//我从磁盘加载所有图片:
字符串rootPath=“D:\\scrape\\souser\\”;
//我使用这些硬编码图片:
List mapsParts=新列表();
添加(新列表()
{“dura.jpg”、“SOU HansP.png”、“SOU shiva.jpg”、“SOU tu.jpg”);
添加(新列表()
{“SOU JonSkeet.jpeg”、“SOU geo.jpeg”、“SOU Antwina.jpg”、“SOU Enijar.png”});
添加(新列表()
{“SOU_Ayna.jpg”、“SOU TAW2.jpg”、“SOU Lightness.jpg”、“SOU EricLippert.jpg”});
//我推导出维度..:
int maxRow=mapspats.Count;
int maxCol=mapspats[0]。计数;
//这是我的屏幕dpi:
int-dpi=96;
//我推断出一个地图部分的大小:
位图bmp=新位图(rootPath+mapspats[0][0]);
int w=bmp.宽度;
int h=bmp.高度;
bmp.Dispose();
//现在我知道地图的总尺寸了
位图bmpMap=新位图(w*maxCol,h*maxRow);
bmpMap.SetResolution(dpi,dpi);
//现在,我将在地图上绘制各个部分:
使用(Graphics G=Graphics.FromImage(bmpMap))
对于(int i=0;i对于(int j=0;j),请更清楚地说明您所说的制表符是什么意思!制表符是(通常)在选项卡控件上,用于在选项卡控件中的选项卡页之间切换。那么,您想在哪里绘制图片?是的,但是您希望图片显示在哪里?在选项卡页中?在这种情况下,最简单的方法是将一个或多个图片框放在那里并加载图像,一行。或者作为选项卡上的小图像。查看上面的浏览器中带有stackoverflow徽标的浏览器选项卡!如何在其中绘制也很简单,但有很大的不同。(Tabpages有一个imageindex并使用imagelist;也很简单..)好的,现在描述一下我的“地图”(一些.png图像)将显示的意思是!?一个接一个或全部在某个布局中..?它们是您需要合并的部分,还是在单击它们时会发生更改..?因此,计算机都需要精确的任务..@TaW请告诉我,因为在我看来很明显的,在另一个人看来可能不是。(见编辑2)事实上,你现在所描述的一切都不是显而易见的;-)有多少张图片将组成地图?对于少数图片,例如4x4或6x6,您可以简单地将图片框放到选项卡页上并加载其图像属性。另一个选项是将它们绘制到一个位图上。我想我会选择一个图片框,创建一个emtpy位图作为其图像并绘制到其中。在这种情况下加载图片有好处吗(有点复杂:P)方法,而不是将它们添加到资源文件中,然后使用Properties.Resources。?绝对不是!如果可以的话,绝对要将图像放入资源中!!无论源是什么以及如何输入图形循环都无关紧要。您只需要知道要将它们放在何处的x&y值。。然后替换
bmp=new Bitmap(rootPath+mapspats[i][j]);
使用适当的方式设置位图。或者从参考资料中加载mapspats。好的,我将尝试实现所有这些,我将发布代码供您查看。感谢您容忍我:Psure,如果您对我的代码有任何疑问,请随时提问。(不过,我很快就要睡觉了。)