我想可以肯定地说 WPF 将其内容呈现为窗口背景。不存在传统 HWND 意义上的子窗口。因此,当人们在 WPF 应用程序中引入基于 HWND 的东西(例如 Web 浏览器)时,视觉外观方面的情况就开始出错。
考虑一个窗口,它有一个带有两个子项的网格、WebBrowser 和其他东西,例如文本框。如果 WebBrowser 是一个红色圆圈,则文本框将呈现在其顶部。对于 WebBrowser,在任何地方都找不到 TextBox。这是因为 TextBox 被渲染为主窗口的背景,而 WebBrowser 实际上是主窗口的 HWND 子窗口,遮挡了背景。
所以一切都(不)很好。一个人如何实现期望的行为?我想让 TextBox 在 WebBrowser 之上呈现。有人遇到过这个问题吗?
我正在考虑拥有第二个透明的顶级无边框 WPF 窗口,重新设置它的父级,以便主窗口拥有它,并执行一些其他技巧来实现它。
在深入研究之前,我想知道是否有人有一个明显或更简单的解决方案?
我向任何可以发布 Ray Burns Answer 实现的人提供此赏金AirRepair。我自己尝试过但没有成功
管道的哪些部分是使用 CPU 完成的,哪些部分是使用 GPU 完成的?
阅读有关图形管道的维基百科,也许我的问题并不能准确代表我要问的内容。
参考这个问题,哪些“步骤”是在CPU中完成的,哪些是在GPU中完成的?
编辑:
我的问题更多的是[从文件]显示地形+3D模型所需的逻辑高级步骤的哪些部分正在使用CPU/GPU而不是哪些函数。
假设我有一个获取 GLuint 纹理作为参数的方法,并且我想渲染其中的一部分。例如,考虑一个图块集,我希望能够在加载关卡时加载图块集并渲染它的部分(图块)。
如果我能够以某种方式从要绘制的图块集中定义像素坐标中的高度、宽度、posX 和 posY,那将是最佳的。
我已经尝试了几个小时了,任何帮助将不胜感激。
我目前绘制纹理的简化版本:
void Render::draw(GLuint texture, float posX, float posY, float sizeX, float sizeY) {
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glAlphaFunc(GL_GREATER,0.1f);
glBindTexture( GL_TEXTURE_2D, texture );
glPushMatrix();
glTranslatef(posX,posY,0);
glBegin( GL_QUADS );
//Bottom-left vertex (corner)
glTexCoord2i( 0, 0);
glVertex2f( -sizeX,-sizeY);
//Bottom-right vertex (corner)
glTexCoord2i( 1, 0);
glVertex2f(sizeX,-sizeY);
//Top-right vertex (corner)
glTexCoord2i( 1, 1);
glVertex2f(sizeX,sizeY);
//Top-left vertex (corner)
glTexCoord2i( 0, 1);
glVertex2f( -sizeX,sizeY);
glEnd();
glPopMatrix();
glDisable(GL_BLEND);
}
Run Code Online (Sandbox Code Playgroud) 首先我要说的是,我知道您可以在标头中指定内容处置并使用“附件”或“内联”,而这个问题与此无关(至少不是直接)。
我有一个扩展名为 .txt 的文件。我注意到不同的浏览器行为取决于该 .txt 文件的内容。如果我的文件包含字母数字字符,并且我将文件的位置粘贴到(例如)Chrome 的 URL 栏中,则该文件会在浏览器中打开。
如果我的文件包含“SI”字符,则会下载该文件而不是在浏览器中打开该文件。
起初我认为这可能是因为“SI”是控制代码,但“CR”和“LF”也是控制代码,当它们存在时文件会显示在浏览器中。当 .txt 文件中存在“DC2”字符时,该文件甚至会在 Chrome 中打开。
我的问题是:在文件内容级别,什么决定文件是否显示或下载?
(我意识到这可能会因浏览器的不同而有所不同,但如果有一些至少在某种程度上可靠的东西,那么了解一下会很有帮助)
提前致谢。
编辑(基于山姆的回答):
当“SI”或“DC2”字符位于文本文件的前 1000 个左右字符中时,将下载该文件;如果这些字符位于前 1000 个左右字符之后,则文件将显示在浏览器中。
我现在正在开发 NES 模拟器,但无法弄清楚如何渲染像素。我使用 3 维数组来保存每个像素的 RGB 值。对于 256 x 224 屏幕尺寸,数组定义如下所示:
byte screenData[224][256][3];
Run Code Online (Sandbox Code Playgroud)
例如,保存屏幕位置 处像素的[0][0][0]蓝色值、[0][0][1]绿色值和红色值。 [0][0][2][0][0]
当 vblank 标志变高时,我需要渲染屏幕。当 SDL 渲染屏幕时,screenData 数组将充满每个像素的 RGB 值。我找到了一个名为的函数SDL_CreateRGBSurfaceFrom,看起来它可能适合我想做的事情。然而,我见过的所有示例都使用 1 维数组来表示 RGB 值,而不是 3 维数组。
对我来说渲染像素的最佳方式是什么?如果该函数允许我以某种方式调整表面大小,这样我就不必使用 256 x 224 窗口大小,那就太好了。
是否存在可以智能处理递归(即自引用)svg 文件的现有渲染器?
例如,这个问题的代码:
<svg width="100%" height="100%" viewBox="-100 -100 200 200" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<circle cx="-50" cy="-50" r="30" style="fill:red" />
<image x="10" y="20" width="80" height="80" xlink:href="recursion.svg" />
</svg>
Run Code Online (Sandbox Code Playgroud)
在 Firefox、Chrome 或 Inkscape 中无法正确渲染 - 但 制作一个渲染器来跟踪打开特定文件的次数,并在一定次数的迭代后停止似乎并不困难......
(如果不存在,如果我想自己编写一个代码,我可以去哪里寻找?)
我开始使用 JavaFX 来可视化 3D 非结构化网格,但我面临渲染问题。
如 [1] 中所示,JavaFX 仅渲染三角形的正面,除非您使用 CullFace.NONE 选项。但后面却是黑色的。
由于 3D 网格是由外部工具(例如 Gmsh http://geuz.org/gmsh/)生成的,因此我无法控制面方向。使用网格的科学软件也不需要定向网格。
因此,我不想随后重新调整网格的方向,只想以相同的方式渲染三角形的正面和背面。JavaFX 8 可以实现这一点吗?如何?
感谢您的回答。
值得注意的是:我也在 Oracle 论坛 [2] 上发布了类似的问题,但它们看起来很空。如果你们中的一些人知道 JavaFX 社区在哪里活跃,那么链接将会很有用。如果我有有用的答案可以分享,我当然会更新这两个线程。
亲切的问候

有人可以解释一下为什么使用预乘 alpha(和校正后的混合函数)渲染看起来与“正常”alpha 不同,而从数学上来说,它们是相同的?
我研究了这篇文章以了解预乘阿尔法:
http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx
作者还说最终计算是一样的:
“查看传统与预乘 Alpha 的混合方程。如果将此颜色格式转换替换为预乘混合函数,您将得到传统混合函数,因此无论哪种方式都会产生相同的最终结果。不同之处在于预乘 Alpha 应用了(source.rgb * source.a) 计算作为预处理,而不是在混合硬件内部。”
我错过了什么吗?那为什么结果不同呢?
内肖内
如今,我从不同的地方听说所谓的 GPU 驱动渲染,这是一种新的渲染范例,根本不需要绘制调用,并且它受到新版本 OpenGL 和 Vulkan API 的支持。有人可以解释它在概念层面上的实际工作原理以及与传统方法的主要区别是什么?
似乎StateHasChanged()只有在对 Task 执行 await 操作后才会触发组件的重新渲染(在此处找到)。
所以我只想StateHasChanged用于重新渲染而不是使用Task.delayor Task.Run。
这是我的代码:
protected async Task ClearSearch()
{
SearchTestCoupon = new Mechanic.Shared.TestCouponSearch();
IsBusy = true;
TestCouponGroups = new List<Mechanic.Shared.TestCouponGroup>();
StateHasChanged(); // << -------- **FIRST TIME**
//await Task.Delay(TimeSpan.FromSeconds(1));
await GetTestCouponGroups(SearchTestCoupon);
}
protected async Task GetTestCouponGroups(object args)
{
TestCouponGroups = await TestCouponService.GetTestCouponGroupsAsync(SearchTestCoupon);
IsRowSelected = false;
IsBusy = false;
StateHasChanged(); // << -------- **SECOND TIME**
}
Run Code Online (Sandbox Code Playgroud)
在这里,我使用加载器,它使用IsBusy. 但是StateHasChanged在代码中提到的第一次调用时它不起作用。
但它第二次按预期呈现组件。
我已经使用过,Task.Delay但它破坏了我的其他功能,例如清除网格和显示搜索数据等。