我最近了解到,引入size_t是为了帮助面向未来的代码,防止本机位数增加和可用内存增加.具体的使用定义似乎是存储某些东西的大小,通常是一个数组.
我现在必须想知道这种未来的证明应该走多远.当迭代数组的下一个任务使用一个unsigned intas作为索引数组时,使用面向未来并且大小适当的size_t定义数组长度毫无意义:
void (double* vector, size_t vectorLength) {
for (unsigned int i = 0; i < vectorLength; i++) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
事实上,在这种情况下,我可能希望语法严格地将unsigned int上变换为关系运算符的size_t.
这是否意味着迭代器变量i应该只是一个size_t?
这是否意味着任何程序中的任何整数必须在功能上确定是否它将被用作数组索引?
它意味着使用编程开发索引然后应该创建size_t类型的一个新的结果值,特别是如果逻辑依赖于潜在符号的整数值逻辑的任何代码?即
double foo[100];
//...
int a = 4;
int b = -10;
int c = 50;
int index = a + b + c;
double d = foo[(size_t)index];
Run Code Online (Sandbox Code Playgroud)
当然,由于我的代码逻辑创建了一个固定的边界,因此向上转换为size_t不会提供额外的保护.
在System.Windows.Forms.Control的继承者中重写OnPaint或OnPaintBackground方法时,一个参数始终是System.Windows.Forms.PaintEventArgs对象.部分对象结构:
Graphics.Clip似乎是适用于后续绘制操作的像素的1位映射.
MSDN:"获取或设置一个限制此图形的绘图区域的区域."
Graphics.ClipBounds是一个只读矩形,看起来是完全包含Clip区域的最小矩形.
MSDN:"获取一个RectangleF结构,该结构绑定了此Graphics的剪切区域."
Graphics.VisibleClipBounds似乎是一个更"智能"的剪辑,但我无法理解它是如何运作的.
MSDN:"获取此Graphics的可见剪切区域的边界矩形."
在所有情况下,ClipRectangle似乎都复制了Graphics.ClipBounds属性.
MSDN:"获取要绘制的矩形."
有人可以回答主要问题,并可能阐明所有各种边界物体的用途吗?
编辑:根据Dan-o的回答添加了MSDN的描述.
每当我看到代码调用说kernel32.dll或User32.dll时,即使在MSDN上,代码片段也要求开发人员将任何所需的常量(例如WM_SETREDRAW = 11)硬编码到例程中.由于这些常量永远不会按定义更改并始终具有一个标准定义,为什么.net不能在某处提供它们?我觉得我们最终都会根据需要创建自己的常量库和标准的Windows dll调用.看起来这种重复工作是浪费的,容易出错.
也许我看起来不够努力而且他们都在某处,如果有的话,有人可以提供他们的位置吗?
鉴于对3D图形渲染的天真看法,立体3D渲染对于开发人员来说应该是基本透明的,并且完全是图形硬件和驱动程序的一个特征.无论OpenGL窗口在何处显示场景,都需要几何,光照,相机和纹理等信息来渲染场景的2D图像.
将立体3D添加到场景似乎基本上意味着使用两个横向偏移的相机,其中最初有一个,并且所有其他场景变量保持不变.然后唯一的附加信息是制作相机的距离以及使它们的中心光线会聚多远.鉴于此,采用GL命令序列并在驱动程序级交错适当的命令以驱动3D渲染似乎是微不足道的.
虽然应用程序需要专门编写才能使用特殊的3D硬件架构,这使得它很麻烦且难以实现.我们是否希望这是立体3D实现的未来,还是我对太多重要细节的掩饰?
在我的具体情况下,我们使用的是.net OpenGL视口控件.我原本希望只需启用立体声硬件和驱动程序即可启用立体3D.
所以现在看了一会儿,我已经阅读了大概20种不同的实现,但还没有看到基于控件的基于框架的通用解决方案来实现真正透明的控件.
这种可能过于简单的方法根本不做任何事情并创建一个永远不会被使用的例程(InvalidateEx):http://bytes.com/topic/c-sharp/answers/248836-need-make-user-control-transparent
这似乎暗示了之前的答案:http://www.bobpowell.net/transcontrols.htm
但是使用计时器勾选来执行InvalidateEx方法.
这似乎是放弃了多层控件并处理单个分层面板上的所有绘图,同时掩盖了标签对象如何实现其自身的透明度:http://www.codeproject.com/Articles/25048/How-用型,透明图像,和标签功能于窗口
这是一种完全基于非框架的方法:http://www.codeproject.com/Articles/30135/General-solution-for-transparent-controls
这个答案中接受的解决方案根本不适用于我:透明控制的透明控制?
我得到的控件是一般的纯色(白色),上面绘有透明图像.
所以,我从我自己的实现开始.
我宁愿不依赖于自下而上的GDI绘图,即以最父形式执行所有绘图,我宁愿不预先渲染到透明位图,我宁愿不从Forms.Control以外的东西继承这是为了缩短透明度而采取一些巧妙的技巧.我真的想深入了解如何在完全透明支持的控制界面上绘图.显然,标签控件本身内部有一个完整的实现,它是如何工作的?
从逻辑上讲,透明控件不能依赖于简单的1位剪辑区域,并且需要保持大部分完整.需要正确处理多层控件,即正确的绘图顺序等,而不会导致无限循环.
第一个也是最常见的建议是这样的:
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
Me.BackColor = Color.Transparent
Run Code Online (Sandbox Code Playgroud)
我理解的第一行是同义词
Protected Overrides ReadOnly Property CreateParams As System.Windows.Forms.CreateParams
Get
Dim result As System.Windows.Forms.CreateParams = MyBase.CreateParams
result.ExStyle = result.ExStyle Or WindowsMessages.WS_EX_TRANSPARENT
Return result
End Get
End Property
Run Code Online (Sandbox Code Playgroud)
根据继承的类,具有非常不同的行为.在Forms.Control的情况下,OnPaintBackground选择使用父控件的背景颜色清除剪辑矩形.不太聪明.
覆盖和删除基本的OnPaintBackground调用会导致控件保持"脏"状态,从未覆盖它下面的内容.使用透明颜色(乐观方法)清除会产生一个黑色透明像素区域,并使控件显示为完全黑色.
从逻辑上讲,这是有道理的,为了提高效率而进行的基础控制不会重新划分他们预期此控制的区域.然后表单中的那个区域永远不会更新,并保留表单存在之前的所有内容.在这上面绘制透明色有点令人困惑,因为它暗示图形缓冲区甚至不包含底层像素,而是用黑色透明的东西替换的实际值,使控件显示为黑色.
第一个挑战似乎是在控件本身重绘时处理,让所有底层控件在该区域重绘(不会自动使控件本身无效以启动堆栈溢出),然后在底层和最新像素上绘制自己.我还没有办法做到这一点.我最接近的是通过挖掘.net代码并找到ButtonRenderer.DrawParentBackground方法.这似乎很有效,尽管快速测试显示重叠组件的z顺序仍未正确处理,底层控件覆盖此控件的顶部.
然后,第二个挑战是在底层控件发生变化时让控件正确地重绘.通过断开挑战1中的自动失效,使得难以通知控件使其自身无效并且不使其父亲无效.
如果有人完全解决了这个问题,请提供代码,如果没有,请提供一些经验,说明如何处理一个或几个问题的部分.
非常感谢.
编辑:
根据WS_EX_TRANSPARENT显示有关WS_EX_TRANSPARENT的假设细节- 它实际上做了什么?
研究更新: ButtonRenderer.DrawParentBackground实际上仅由Control本身使用,仅在使用Application.EnableVisualStyles()时才强制执行父级的背景绘制.它似乎是一个同义词
InvokePaintBackground(Parent, e.Graphics)
Run Code Online (Sandbox Code Playgroud)
这将重现父控件的所有背景绘制细节.
我正在开发一个SFunction并在Simulink中编译子模型,这是一个调用使用Realtime Workshop编译的DLL的SFunction.问题是,一旦我编译了子模型一次,通过SFunction在本机Simulink中执行它,模型就完成了,MATLAB仍然保留了子模型DLL的句柄.在重新启动MATLAB之前,我无法重新编译DLL,从而强制释放DLL.
我甚至走得太远,看看ProcessExplorer是否可以强行关闭手柄,但它不能.
版本:MATLAB Simulink 2010b
如何从代码中强制模型子系统图标重新绘制自身。我有一个显示模型设置的图标,但是该块不负责更改该设置。当设置更改时,我希望看到模型块的显示更新。如何才能实现这一目标?
编辑:更多信息
想象一下,我的模型中有两个屏蔽子系统,其中一个子系统的屏蔽设置了全局工作区变量,另一个在其图标处显示值。忽略该示例的毫无意义,我不知道如何向系统发送消息/事件以通知其他块重绘自身并在此过程中读取新的工作区值。
我在VB.net中观察到一种行为,其中属性设置器被调用的次数比看似必要的更多,并且调用了对姐妹setter方法的调用.
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Console.WriteLine("Calling WorkReferenceTypeByReference")
WorkReferenceTypeByReference(ReferenceTypeData)
Console.WriteLine("Called WorkReferenceTypeByReference")
Console.WriteLine("Calling WorkReferenceTypeByValue")
WorkReferenceTypeByValue(ReferenceTypeData)
Console.WriteLine("Called WorkReferenceTypeByValue")
End Sub
Public Sub WorkReferenceTypeByReference(ByRef ref As Point)
Dim b As Point = New Point(4, 4) + ref
Console.WriteLine(" adding (4,4) to " & ref.ToString)
End Sub
Public Sub WorkReferenceTypeByValue(ByVal ref As Point)
Dim b As Point = New Point(4, 4) + ref
Console.WriteLine(" adding (4,4) to " & ref.ToString)
End Sub
Private m_ReferenceType …Run Code Online (Sandbox Code Playgroud) 我见过Friend修饰符的唯一地方是在WinForms设计器中,为什么修改器在Winforms中设置为Friend?和VB.NET:'朋友'修饰符有什么作用?.
朋友修饰符似乎是一个几乎任意宽的访问级别,是为解决VB中的一些历史性架构问题而创建的,我只是想知道是否有人有意义的继续使用它?
我有一些愿望只将方法暴露给给定的命名空间,以便将相关的对象集合的功能集合在一起并管理它们的任何非线程安全方法,同时将安全的公共方法暴露给更广泛的范围.同一个集会.朋友没有此访问级别.可能是一个必然的问题,那就是我对程序集和命名空间的使用与预期的不一致?
在许多情况下,由于程序集具有严格的层次结构,因此无法将功能分离到不同的程序集中,从而导致具有相互但不同的对象组,这些对象可以访问彼此不安全的方法.
编辑: 虽然我知道修饰符的功能,但我很好奇人们对它的实际目的,因为我没有遇到过这样一个合适的解决方案.
我无法帮助阅读关于析构函数的大量论坛帖子并完全混淆.
有人说调用析构函数(带delete)一次为每个调用到new.有人说析构函数会在各种情况下自动调用,即 当指针被重新分配时,当对象超出范围时.有人建议指针超出范围,同时作为返回值,其中对象作为其前自身的副本存在,(这是否需要显式销毁,因为它最初是用new?创建的?
似乎有一些建议是不止一次地调用相同的析构函数会破坏内存,因此所有delete调用都应该与之合作*pointer = NULL;以避免损坏.如果没有,那么一些更高级的对象管理系统将需要实施,或铁腕严格的所有权.
我似乎无法对调用析构函数序列进行任何讨论,即调用1)是否源自基类超类并级联到特定类,在路上调用所有虚拟化析构函数,2)源于实例化class并向上移动到超类,或3)发起类在超出范围时所具有的特定强制转换,然后遍历实例化和基类.做级联析构
最终,我根本不知道如何或何时删除对象,无论对象是否负责删除它们引用的所有对象,如何干净地处理适当的面向对象的删除例程,其中多次引用对象,它只是一个我脑子里一团糟.正如你所看到的那样,我无法真正提出一个可靠的问题,我真的希望有人可以提供一个简洁而简洁的讨论,如果不是单一的"正确"方法,至少是行业最佳实践来反对删除.