如何在C语言中添加背景图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C语言中添加背景图片相关的知识,希望对你有一定的参考价值。

如题! 那位大侠告诉我哈!!

参考技术A C语言写控制台程序是无法加图片的,只能用命令行输出,最多就是设置下背景和字体,颜色之类的。如果开发API窗口程序,完全依赖于操作系统的函数库。C语言本身并不提供这类函数。
下面是windows系统下实现的函数代码,第一个参数是图片的存放的位置,第二个参数是窗口句柄。
HRESULT ShowPic(char *lpstrFile,HWND hWnd)

HDC hDC_Temp=GetDC(hWnd);
IPicture *pPic;
IStream *pStm;
BOOL bResult;
HANDLE hFile=NULL;
DWORD dwFileSize,dwByteRead;
//打开图形文件
hFile=CreateFile(lpstrFile,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile!=INVALID_HANDLE_VALUE)

dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数  
if (dwFileSize==0xFFFFFFFF)
return E_FAIL;

else

return E_FAIL;

//分配全局存储空间  
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;
if (hGlobal == NULL)
return E_FAIL;
if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块  
return E_FAIL;
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
if(FAILED(bResult))
return E_FAIL;
OLE_XSIZE_HIMETRIC hmWidth; //图片的真实宽度, 单位为英寸 
OLE_YSIZE_HIMETRIC hmHeight; //图片的真实高度, 单位为英寸
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//转换hmWidth和hmHeight为pixels距离,1英寸=25.4毫米
int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);
int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);
//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,0,hmHeight,hmWidth,-hmHeight,NULL);
hmHeight,NULL);
pPic->Release();
CloseHandle(hFile);//关闭打开的文件
if (SUCCEEDED(bResult))

return S_OK;

else

return E_FAIL;

如何使用C#在图片框中添加标注?

我需要使用C#在picturebox上添加WedgeRectCallout标注。

有办法吗?

请使用以下链接参考图片了解标注。

enter image description here

在word文档中,我可以使用Spire.Doc库并在代码下面编写相同的代码:

 ShapeObject Shape1 = para1.AppendShape(30, 50, ShapeType.WedgeRectCallout);
答案

这是一个最小的例子。它创建了一个带有嵌套PanelTextBox子类。

请注意,您无法在设计器中向PictureBox添加控件。相反,你可以将它放在顶部并使用Nest函数将其嵌入PBox中。

(我使用一个技巧来简化边框的绘制:因为缩小GraphicsPath很难,我懒得写出其中两个,我画两次边框并添加一点偏移。效果是阴影效果,看起来很讨厌作弊..)

这是实际的课程:

enter image description here

这是类代码:

class WedgeCallout : Panel
{
  public WedgeCallout()
  {
    tb = new TextBox();
    Controls.Add(tb);
  }

  TextBox tb = null;
  GraphicsPath gp = new GraphicsPath();

  protected override void OnLayout(LayoutEventArgs levent)
  {
    tb.Size = new Size(Width - 10, (int)(Height * 0.66));
    tb.Location = new Point(5, 5);
    tb.BackColor = BackColor;
    tb.ForeColor = ForeColor ;
    tb.BorderStyle = BorderStyle.None;
    tb.Text = "Hiho";
    tb.Multiline = true;
    tb.TextAlign = HorizontalAlignment.Center;
    tb.Font = Font;
    SetRegion();
    base.OnLayout(levent);
  }

  protected override void OnBackColorChanged(EventArgs e)
  {
    base.OnBackColorChanged(e);
    if (BackColor != Color.Transparent) 
        tb.BackColor = BackColor;
  }

  protected override void OnPaint(PaintEventArgs e)
  {
    base.OnPaint(e);
    if (Tag == null) return;

    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    using(SolidBrush brush = new SolidBrush(tb.BackColor))
        e.Graphics.FillPath(brush, (GraphicsPath)Tag);
    using (Pen pen = new Pen(Color.DarkGray, 2f))
        e.Graphics.DrawPath(pen, (GraphicsPath)Tag);
    e.Graphics.TranslateTransform(-1, -1);
    using (Pen pen = new Pen(ForeColor, 2f))
        e.Graphics.DrawPath(pen, (GraphicsPath)Tag);
  }

  void SetRegion()
  {
    Rectangle r = ClientRectangle;
    int h = (int)(r.Height * 0.75f);
    if (gp != null) gp.Dispose();
    gp = new GraphicsPath();
    gp.AddPolygon(new PointF[]{   new Point(0,0),
        new Point(r.Width-1, 0),  new Point(r.Width-1, h),
        new PointF(50, h) ,       new Point(0, r.Height-1),
        new PointF(20, h),        new PointF(0, h)});

    Region = new Region(gp);
    Tag = gp;
  }
}

您可以在设计器中设置颜色和字体。

Nest功能:

void Nest(Control child, Control parent)
{
    Point p0 = parent.PointToScreen(Point.Empty);
    Point p1 = child.PointToScreen(Point.Empty);
    child.Location = new Point(p1.X - p0.X, p1.Y - p0.Y);
    child.Parent = parent;
}

它是从控件所在的表格中调用的:Nest(wedgeCallout1, pictureBox1);

请注意,要在一个图像中使用pbox保存到标注,您需要

  • 将标注嵌入PBox中
  • 使用pbox.DrawToBitmap
  • 暂时将背景颜色设置为透明

例:

private void saveBtn_Click(object sender, EventArgs e)
{
    Size sz = pictureBox1.ClientSize;
    using (Bitmap bmp = new Bitmap(sz.Width, sz.Height))
    {
        Color old = wedgeCallout1.BackColor;
        wedgeCallout1.BackColor = Color.Transparent;
        pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle);
        bmp.Save(filename, ImageFormat.Png);
        wedgeCallout1.BackColor = old;
    }
}

以上是关于如何在C语言中添加背景图片的主要内容,如果未能解决你的问题,请参考以下文章

怎么给你的C语言程序添加BGM背景音乐?

易语言如何在画板中添加一个半透明的图片

C语言制作小游戏时怎么添加图片音乐,代码怎么打?

如何在c语言 读取BMP图片的信息

C语言如何在编写的程序中插入图片

这个贪吃蛇c语言代码在哪里添加啥可以改变它的背景色????