我知道这个问题被问了好几次,但到目前为止我还没有找到一个好的解决方案.
我有一个其他控件的面板.
我想在它上面和在面板中的所有控件上绘制一条线
我遇到了3种类型的解决方案(其中没有按照我想要的方式工作):
获取桌面DC并在屏幕上绘图.
如果它们与表格重叠,这将吸引其他应用程序.
覆盖面板的"CreateParams":
=
protected override CreateParams CreateParams {
get {
CreateParams cp;
cp = base.CreateParams;
cp.Style &= ~0x04000000; //WS_CLIPSIBLINGS
cp.Style &= ~0x02000000; //WS_CLIPCHILDREN
return cp;
}
}
Run Code Online (Sandbox Code Playgroud)
//注意我也尝试过禁用WS_CLIPSIBLINGS
然后绘制OnPaint()行.但是......由于面板的OnPaint在其中的控件的OnPaint之前被调用,因此内部控件的绘制仅在该行顶部绘制.
我见过有人建议使用消息过滤器来收听WM_PAINT消息,并使用定时器,但我不认为这个解决方案要么是"良好实践",要么是有效的.
你会怎么做 ?确定内部控件在X ms后完成绘图,并将定时器设置为X ms?
此屏幕截图显示了WS_CLIPSIBLINGS和WS_CLIPCHILDREN关闭的面板.
蓝线在Panel的OnPaint上绘制,只是被文本框和标签绘制.
红色线条仅仅涂在上面,因为它没有从面板的OnPaint上绘制(它实际上是由于点击了按钮而绘制的)

第3步:创建透明图层并在该图层的顶部绘图.
我使用以下方法创建了一个透明控件:
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
Run Code Online (Sandbox Code Playgroud)
问题仍然存在,将透明控件置于Panel及其所有控件之上.
我尝试使用"BringToFront()"把它带到前面,但它似乎没有帮助.
我把它放在Line控件的OnPaint()处理程序中.
我应该尝试把它放在其他地方吗?
- 这也会在面板顶部设置另一个控件时产生问题.(抓住鼠标点击等..)
任何帮助将不胜感激!
**编辑:黑线是我试图做的样本.(用过的窗户油漆来涂漆)

我注意到一些.NET结构可以与null进行比较.例如:
TimeSpan y = new TimeSpan();
if (y == null)
return;
Run Code Online (Sandbox Code Playgroud)
将编译得很好(与Guid结构相同).
现在我知道stucts是值类型,并且上面的代码不应该编译,除非有一个带有对象的operator ==的重载.但是,据我所知,没有.
我用Reflector和MSDN上的文档查看了这个类.
他们两个确实实现了以下接口:
IComparable, IComparable<T>, IEquatable<T>
Run Code Online (Sandbox Code Playgroud)
但是,尝试使用相同的接口似乎没有帮助:
struct XX : IComparable, IComparable<XX>, IEquatable<XX> {
public int CompareTo(Object obj) {
return 0;
}
public int CompareTo (XX other){
return 0;
}
public bool Equals (XX other){
return false;
}
public override bool Equals(object value){
return false;
}
public static int Compare(XX t1, XX t2){
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用:.NET 2.0 Visual Studio 2005.
有谁知道这是什么原因?我只是想更好地理解.这不是问题,因为我知道我不应该将结构与null进行比较.
我在SQL Server 2005上遇到了多个死锁的问题.这个死锁是在INSERT和SELECT语句之间.
有两张桌子.表1和表2.Table2将Table1的PK(table1_id)作为外键.
table1_id上的索引是群集的.
INSERT一次在table2中插入一行.
SELCET加入了2个表.(这是一个很长的查询,可能需要12秒才能运行)
根据我的理解(和实验),INSERT应该获取table1上的IS锁以检查参照完整性(这不应该导致死锁).但是,在这种情况下,它获得了IX页锁
死锁报告:
<deadlock-list>
<deadlock victim="process968898">
<process-list>
<process id="process8db1f8" taskpriority="0" logused="2424" waitresource="OBJECT: 5:789577851:0 " waittime="12390" ownerId="61831512" transactionname="user_transaction" lasttranstarted="2010-04-16T07:10:13.347" XDES="0x222a8250" lockMode="IX" schedulerid="1" kpid="3764" status="suspended" spid="52" sbid="0" ecid="0" priority="0" transcount="2" lastbatchstarted="2010-04-16T07:10:13.350" lastbatchcompleted="2010-04-16T07:10:13.347" clientapp=".Net SqlClient Data Provider" hostname="VIDEV01-B-ME" hostpid="3040" loginname="DatabaseName" isolationlevel="read uncommitted (1)" xactid="61831512" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="DatabaseName.dbo.prcTable2_Insert" line="18" stmtstart="576" stmtend="1148" sqlhandle="0x0300050079e62d06e9307f000b9d00000100000000000000">
INSERT INTO dbo.Table2
(
f1,
table1_id,
f2
)
VALUES
(
@p1,
@p_DocumentVersionID,
@p1
) </frame>
</executionStack>
<inputbuf>
Proc [Database Id = 5 …Run Code Online (Sandbox Code Playgroud) 我正在寻找最好的解决方案,这将使我能够将2个用户(此时只有2个)的实时视频/音频会议整合到闪存游戏平台中.视频聊天不仅仅是一个额外的功能,它是主要功能.
我主要关注开源实现或者我自己能够实现的东西,但如果它们正是我需要的话,它会考虑商业产品.
以下是我看过的一些事情,但到目前为止,我没有发现它们中的任何一个足够好:
Flash Player 10的P2P功能听起来很有前景,但我知道Adobe没有发布有关RTMFP协议的任何信息,并且此时没有支持它的商业服务器.
通过闪存服务器(而不是p2p)实时流式传输所有视频/音频,但根据我的个人经验,您无法顺利进行对话.
我认为TokBox使用这种方法
Java applet也是一种可能的解决方案(执行p2p),但我不认为在这一点上将它们组合在游戏中并且需要用户授权它们将是一个很好而优雅的解决方案.顺便说一句,我找不到任何有用的实现.所以,如果你知道,我会调查他们.
谷歌Gmail视频聊天使用自定义(和专有)浏览器插件,该插件执行p2p并将视频/音频流式传输到Flash播放器.这是一个可能的解决方案,但我宁愿不在此阶段实现整个p2p协议栈+浏览器插件,而是专注于游戏本身的其他方面.我认为他们正在使用类似于Jingle的基于XMPP的协议,他们发布了一个Jingle librarby,但没有视频实现.
编辑:回应Branden:
我知道Adobe Stratus.Stratus是一个测试版托管的集合服务,可帮助在Flash Player端点(RTMFP服务器)之间建立通信.
Stratus的当前版本是预发行版,仅用于评估目的.该服务不是最终的.
无法保证该服务将来会继续存在或任何有关未来成本的信息.
这就是我不认为它可以用作商业解决方案的原因.至少还没有.
我很感激你的建议和意见.谢谢!
我正在尝试使用 VideoView 运行视频,Android 模拟器向我抛出库“无法打开 libwvm.so”,该库应该位于 /system/lib 文件夹中,但缺少。由于 libwvm,SurfaceFlinger 无法创建缓冲区。任何替代建议...提前致谢