c# winform 如何清除picturebox控件关联的句柄
答案:4 悬赏:10 手机版
解决时间 2021-02-01 14:24
- 提问者网友:寂寞梧桐
- 2021-02-01 02:03
现在是通过picturebox控件显示视频图像,但是视频关闭的时候,picturebox控件中的图像还存在,如何清除。
最佳答案
- 五星知识达人网友:洎扰庸人
- 2021-02-01 02:35
CWnd::GetDlgItem
CWnd* GetDlgItem( int nID ) const;
void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;
返回值:
指向给定的控件或子窗口的指针,如果没有控件具有nID给出的整数ID,则返回NULL。
返回的指针可能是临时的,不能被保存以供将来使用。
参数: nID 指定了要获取的控件或子窗口的标识符。
phWnd 指向子窗口的指针。
说明:
这个函数获得对话框或其它窗口中指定控件或子窗口的指针。
返回的指针通常被强制转换为nID所标识的控件类型。
CWnd* GetDlgItem( int nID ) const;
void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;
返回值:
指向给定的控件或子窗口的指针,如果没有控件具有nID给出的整数ID,则返回NULL。
返回的指针可能是临时的,不能被保存以供将来使用。
参数: nID 指定了要获取的控件或子窗口的标识符。
phWnd 指向子窗口的指针。
说明:
这个函数获得对话框或其它窗口中指定控件或子窗口的指针。
返回的指针通常被强制转换为nID所标识的控件类型。
全部回答
- 1楼网友:底特律间谍
- 2021-02-01 05:42
picturebox.Image = null; //直接null不就行了?
- 2楼网友:玩世
- 2021-02-01 04:51
picturebox的backcolor属性设置成color.transparent 然后设置picturebox.parent = 父容器; 一般地,在.net中,多个控件之间重叠时是不会实现透明效果的。 如下图所示: 下面开始介绍这几种解决方案: 第一种方案:记录不透明图片的路径,再设置透明效果。参考代码如下: /// /// picturebox透明示例 /// date:2012-3-4 07:25:56 /// public partial class form1 : form { [dllimport("user32.dll")] public static extern int releasecapture(); [dllimport("user32.dll")] public static extern int sendmessage(intptr hwnd, int wmsg, int wparam, int lparam); public const int wm_syscommand = 0x0112; public const int sc_move = 0xf010; public const int htcaption = 0x0002; public form1() { initializecomponent(); //this.picmodelimage.controls.add(this.pichair); } private void pichair_mousedown(object sender, mouseeventargs e) { setpictureboxtransparent(pichair, pichair.image); //setpictureboxtransparent(picmodelimage, picmodelimage.image); releasecapture(); sendmessage(this.pichair.handle, wm_syscommand, sc_move + htcaption, 0); } // 使用不安全的指针 // 返回不透明的图片路径 private unsafe graphicspath notegraphicspath(image image) { if (image == null) return null; // 声明graphicspath类以便计算位图路径 graphicspath graphicspath = new graphicspath(fillmode.alternate); bitmap bitmap = new bitmap(image); int picwidth = bitmap.width; int picheight = bitmap.height; bitmapdata bitmapdata = bitmap.lockbits(new rectangle(0, 0, picwidth, picheight), imagelockmode.readwrite, pixelformat.format24bpprgb); byte* point = (byte*)bitmapdata.scan0; int offset = bitmapdata.stride - picwidth * 3; int p0, p1, p2; p0 = point[0]; p1 = point[1]; p2 = point[2]; int start = -1; for (int h = 0; h < picheight; h++) { for (int x = 0; x / 如果之前的点没有不透明且不透明 if (start == -1 && (point[0] != p0 || point[1] != p1 || point[2] != p2)) { start = x; } else if (start > -1 && (point[0] == p0 && point[1] == p1 && point[2] == p2)) { // 如果之前的点是不透明 graphicspath.addrectangle(new rectangle(start, h, x - start - 1, 1)); start = -1; } // 如果之前的点是不透明且是最后一个点 if (x == picwidth - 1 && start > -1) { graphicspath.addrectangle(new rectangle(start, h, x - start + 1, 1)); start = -1; } point += 3; } point += offset; } bitmap.unlockbits(bitmapdata); bitmap.dispose(); return graphicspath; } /// /// 需要设置透明效果的控件调用该方法 /// /// 要设置透明效果的控件 /// 控件的图片 public void setpictureboxtransparent(control control, image image) { graphicspath graphic = null; graphic = notegraphicspath(image); if (graphic == null) return; control.region = new region(graphic); } } 需要添加2个命名空间: using system.drawing.drawing2d; using system.drawing.imaging; 运行后效果如下所示: 注意:由于本示例有不安全的代码[关键字unsafe],需要在项目属性中设置"允许不安全代码",如下图: 第二种方案:使用gdi +中绘制图像与透明 这种方案是需要我使用gdi+绘制图像,具体步骤如下所示: 1. 需要添加两个组件类: pictureboxmodel.cs 和 panelextend.cs panelextend.cs 中代码: using system; using system.drawing; using system.windows.forms; using system.drawing.drawing2d; /// /// panel扩展类 /// public abstract class panelextend : panel { protected graphics graphics; protected override createparams createparams { get { createparams cp = base.createparams; cp.exstyle |= 0x00000020; // 实现透明样式 return cp; } } public panelextend() { } protected override void onpaintbackground(painteventargs pevent) { } protected override void onpaint(painteventargs e) { this.graphics = e.graphics; this.graphics.textrenderinghint = system.drawing.text.textrenderinghint.antialias; this.graphics.interpolationmode = system.drawing.drawing2d.interpolationmode.highqualitybilinear; this.graphics.pixeloffsetmode = system.drawing.drawing2d.pixeloffsetmode.highquality; this.graphics.smoothingmode = system.drawing.drawing2d.smoothingmode.highquality; ondraw(); } protected abstract void ondraw(); } pictureboxmodel.cs 代码: using system; using system.collections.generic; using system.text; using system.drawing; /// /// 实现绘制图像 /// public class pictureboxmodel : panelextend { public pictureboxmodel() { //this.setstyle(system.windows.forms.controlstyles.supportstransparentbackcolor, true); } protected override void ondraw() { // 获取图像 image imagemodel = global::mypictureboxdemo.properties.resources.model; image imagehair = global::mypictureboxdemo.properties.resources.hair; //int width = imagemodel.size.width; //int height = imagemodel.size.height; int width = this.width; int height = this.height; rectangle recmodel = new rectangle(0, 0, width, height); rectangle rechair = new rectangle(0, 0, imagehair.width, imagehair.height); this.graphics.drawimage(imagemodel, recmodel); this.graphics.drawimage(imagehair, rechair); } } 实现效果图如下所示
- 3楼网友:零点过十分
- 2021-02-01 03:51
把控件销毁了重绘个新的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯