surfaceview移除悬浮窗覆盖黑屏

如果您在使用 SurfaceView 显示视频时,出现了悬浮窗覆盖导致黑屏的情况,可以尝试以下方法解决:

1在 SurfaceView 对应的 Activity 的 onResume() 方法中,调用 SurfaceView 的 setZOrderOnTop(true) 方法,将它放置到内容视图(Content View)的顶部。

2 在 onPause() 方法中调用 setZOrderOnTop(false),恢复原本的布局关系。

下面是示例代码:

```java

@Override

protected void onResume() {

superonResume();

surfaceViewsetZOrderOnTop(true);

}

@Override

protected void onPause() {

superonPause();

surfaceViewsetZOrderOnTop(false);

}

```

通过上述方法,可以让 SurfaceView 始终处于最顶端,并且避免被其他悬浮窗口阻挡。

先将borderstyle设为0

然后在窗体load事件中添加如下代码:

private sub form_load()

mewindowstate = 2

end sub

居于form窗体底部?是空间的z坐标位置?如果是的话用控件的zorder属性就行了,比如text2zorder

(0)这句会将text2移到窗体所有控件的最前面。

如果是它的二维坐标位置的话用move方法就行了,如:text2move

1000,1000

先将BorderStyle设为0

然后在窗体load事件中添加如下代码:

Private Sub Form_Load()

    MeWindowState = 2

End Sub

居于FORM窗体底部?是空间的z坐标位置?如果是的话用控件的ZOrder属性就行了,比如Text2ZOrder (0)这句会将text2移到窗体所有控件的最前面。

如果是它的二维坐标位置的话用move方法就行了,如:Text2move 1000,1000

 可以使用牛牛截图控件,完全免费使用。 

牛牛截图控件是一个具备当前主流截图功能的插件,方便集成进不同的应用系统中,节省开发时间。具体可见:>

1 本控件实现的基本功能及特点如下

1) 支持窗口区域的自动识别

2) 支持矩形、圆形、箭头、文字的绘制以及撤销

3) 可另存为png、jpg、bmp等格式

4) 支持鼠标所在区域的图像放大功能,以便精准定位

5) 窗口大小、鼠标坐标显示以及光标处的颜色拾取

6) 采用C++语言开发的Win32动态库,大小为260KB

7) 支持XP、WIN7、WIN8及WIN2003、WIN2008等 *** 作系统;

8) 此控件提供标准的接口,方便集成进其他软件中;

例如可以与浏览器控件整合,实现Web页面截图的功能,也可以与其他如即时通讯等其他任何系统中

先看看使用效果:

2 控件使用方法

1) 在测试程序中点击启动截图[在集成此控件后,可以自行通过热键进行启动],按下鼠标左键并拖动,以确定需要截图的范围,也可以直接在自动识别到的窗口上点击一下鼠标左键,确定截图范围;此时可以通过放大的区域来精确定位截图区域。

2) 确定截图范围后,工具栏将会显示出来,选中指定的绘制类型[绘制类型、大小、颜色],可以进行二次绘制涂鸦。

3) 可以通过点击撤销按钮来取消上一笔所绘制的形状。

4) 在截图的过程中,可以按ESC键或者点击鼠标右键来取消截图。

5) 按下回车键或者在截图区域内双击鼠标左键,可以完成截图[也可以点击工具栏上的“完成”按钮]。

6) 点击“保存”按钮,可以将所截区域保存至文件。

3 控件接口的使用方法

可以在程序中使用LoadLibrary的方式加载此控件,进行初始化后,直接调用启动截图的函数即可:

[cpp] view plaincopy

typedef int (FnStartScreenCapture)(const char szAuth, const char szDefaultSavePath, void pCallBack, unsigned long hWndNotice, unsigned int noticeMsg);

FnStartScreenCapture m_StartScreenCapture = NULL;

typedef int (FnInitScreenCapture)(unsigned long trackerColor, unsigned long editBorderColor, int nTransparent, int flag);

FnInitScreenCapture m_InitCapture = NULL;

//加载截图控件

m_hModule = LoadLibrary("NiuniuCapturedll");

m_StartScreenCapture = (FnStartScreenCapture)GetProcAddress(m_hModule, "StartScreenCapture");

m_InitCapture = (FnInitScreenCapture)GetProcAddress(m_hModule, "InitScreenCapture");

m_InitCapture(RGB(255, 0, 0), RGB(0, 174, 255), 180, 0);

m_StartScreenCapture("niuniu", "", NULL, (unsigned long)m_hWnd, WM_USER + 1111);

具体可以参考调用Capturedemo_sourcerar [下载地址见本文末尾],接口的具体描述如下:

1) 初始化接口

int InitScreenCapture(unsigned long trackerColor, unsigned long editBorderColor, int nTransparent, int flag);

此接口函数用于初始化界面的显示效果,如果不调用,则以默认值处理。

参数说明:

参数名

参数类型

参数说明

备注

trackerColor

COLORREF

用于设置橡皮筋框的颜色以及自动识别窗口的边框色

如果不调用此函数,则此框颜色默认为:

RGB(0, 174, 255);

editBorderColor

COLORREF

用于设置文本输入框的边框颜色

如果不调用此函数,则此框颜色默认为:

RGB(255, 0, 0);

nTransparent

int

用于指定工具栏窗口的透明度(0-255)

如果不调用此函数,则透明度默认为200

flag

int

暂未使用

2) 启动截图接口:

int StartScreenCapture(const char szAuth, const char szDefaultSavePath, void pCallBack, unsigned long hWndNotice, unsigned int noticeMsg);

参数说明:

参数名

参数类型

参数说明

备注

szAuth

字符串

用于调用控件时的授权

目前固定传入”niuniu”即可

szDefaultSavePath

字符串

用于指定在截图完成时自动保存的文件路径

如:c:\\testjpg,如果此字符串为空,则完成时将只写入剪贴板

pCallBack

Void

用于指定在截图完成时自动回调的函数

用于通知调用程序截图完成

hWndNotice

UINT

用于指定截图完成时发送通知的窗口句柄及发送的消息

用于通知调用程序截图完成,截图完成时,控件将会发送消息:

::PostMessage(hWndNotice, noticeMsg, 1, 1);

noticeMsg

UINT

4 控件的主要技术点简介

本控件采用C++语言,通过Win32程序进行实现,内部使用了Duilib来做工具栏以及放大区域的显示;对于画图部分,主要采用了GDI+,以下对我个人认为需要注意的技术点进行简要描述:

41 橡皮筋类的绘制、大小调整以及拖动等

此橡皮筋类是从MFC的源代码中提取的CRectTracker,进而移植到Win32环境中的,具体橡皮筋类的原理就不描述了,需要重点关注的是TrackRubberBand及Track两函数:

1) 当鼠标按下,且橡皮筋没有显示的情况下,使用TrackRubberBand,以确定橡皮筋所包含区域

[cpp] view plaincopy

if(!gl_rectTrackerTrackRubberBand(hWnd, pt, TRUE))

{ //说明鼠标没有移动,则获取自动识别到的窗口

if (gl_borderRtright != 0 && gl_borderRtright > gl_borderRtleft)

{

gl_rectTrackerm_rectSetRect(gl_borderRtleft, gl_borderRttop, gl_borderRtright, gl_borderRtbottom);

}

}

2) 当橡皮筋类已经显示,则需要判断此时鼠标的落点,如果在橡皮筋区域内[gl_rectTrackerHitTest(pt)的返回值 大于0],则需要调用Track,以便拖动橡皮筋调整大小或者移动它。

42 自动窗口区域识别

在Windows系统中,所有的窗口都是有一个层级的(ZORDER),此处采用的方法是在获取屏幕截图之前,保存下当前所有可见的窗口句柄以及其子窗口句柄[主要利用FindWindowEx],此处值得一提的是,需要过滤掉一些带WS_EX_LAYERED属性的窗口[在不过滤的情况下,WIN8下会有问题,存在透明的窗口处于当前窗口之上],同时针对任务栏窗口不能过滤掉。

43  GDI+绘制矩形、圆形、箭头、文字

1) 绘制箭头的代码类似如下:

[cpp] view plaincopy

void DrawArraw(Graphics& graphics, CPoint pt1, CPoint pt2, Color color )

{

Point pt[3] = { Point(3, -5), Point(-3, -5), Point(0, 0)};

GraphicsPath strokePath;

strokePathAddLines(pt, sizeof(pt)/sizeof(Point));

Pen pen(color, 1);

CustomLineCap custCap(&strokePath, NULL);

penSetCustomEndCap(&custCap);

graphicsDrawLine(&pen, pt1x, pt1y, pt2x, pt2y);

}

此处需要通过对所画的直线进行平滑处理,否则线条将会很难看。

2) 绘制文字

此处有两点需要注意,我只解决了其中的第一点:

a) 针对每一行需要单独绘制,否则在EDIT控件中的行高要比DrawString的行高要少,导致绘制出来的文字占用高度比在EDIT中要多,感觉文字的Y坐标有移位

b) 在同时有中文与英文时,绘制出来的文字的X坐标是有移位的,我暂时没有处理,估计需要一个字符一个字符的绘制来解决

44 可变大小、可拖动的EDIT控件

此处在效果上参考了微软的mspaint程序的实现,通过将一个EDIT控件与橡皮筋类进行组合来实现,此处需要重点处理一下鼠标按下以及防止闪烁;还需要注意与EDIT控件组合的橡皮筋类的绘制细节

45 鼠标所在区域的放大镜效果显示

通过一个透明的PNG做背景图 StretchBlt函数,通过光标所在点为基点,以4倍大小放大显示即可

5 未解决的问题

51 目前没有处理当输入文字或者粘贴文字时,自动改变文本框的大小,此处不太清楚如何处理控件的自动变更大小

52 当文本框中有中文与英文混合时,绘制到截图上后,文字的X坐标会有移位

注:

控件包及调用说明、代码见:

牛牛截图控件最终版:>

Hwnd = PluginWindowFind("CabinetWClass", "屏幕分辨率")

hwndex = PluginWndEx6_51FindChildWindowZOrder(hwnd,"Button",0,0)

MessageBox hwndex

Call PluginBkgndLeftClick(Hwndex, 15, 15)

//语句本人已亲测

//下面网址下载 窗口插件增强版V651rar

>

c++中如果你的按钮是从资源管理器中的控件框创建的,那可以用鼠标拖动来改变大小,通过继承自CWND类的GetWindowRect()函数可以获得一个关于这个控件的大小和位置参数。

如果是在代码中创建的,创建时调用CBUTTON类的

Create( LPCTSTR lpszCaption,DWORD dwStyle,const RECT& rect,CWnd pParentWnd,UINT nID )函数,const RECT& rect这个参数可以指定大小和位置。在创建之后,也可以调用SetWindowRgn( HRGN hRgn, BOOL bRedraw )来改变大小。

文本框和按钮基本一样。以上函数的具体使用如果不明白,可查看MSDN

以上就是关于surfaceview移除悬浮窗覆盖黑屏全部的内容,包括:surfaceview移除悬浮窗覆盖黑屏、VB中怎么样取消刚才在FORM窗口中设置的图片谢谢~~~、VB中,怎么样使FORM窗口设置为全屏模式怎么样设置控件居于FORM窗体底部等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9580938.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存