我正在尝试创建一个自定义控件,显示每像素alphablend的位图(正如你们中的一些人已经知道其他问题).
现在我在资源编辑器中使用自定义控件,并将其附加到从CWnd派生的类.当我注册我的自定义类时,我将WNDCLASS structe的hbrBackground设置为NULL_BRUSH以获得控件的透明度.
在控件的OnPaint中,我使用AlphaBlend绘制每像素alpha混合位图.
这很有效,但我有两个问题:
我想在鼠标悬停在控件上时更改显示的位图.由于控件是透明的,因此不会擦除一个位图与另一个位图不重叠的区域.如何在图像更改时删除背景?
第二个问题与两个重叠控制有关.我的控件被绘制在具有渐变的其他控件上(实际上是在其他控件内).问题是,如果我之前将控件放在z顺序中,则其他控件与我的控件重叠,并且不会显示我的控件.如果我之前将其他控件放在z顺序中,则无法在我的控件中获取鼠标消息.
也许我做错了什么,或者我错误地想要实现我的控制.任何形式的帮助将不胜感激.
谢谢,
哈维尔
我正在构建一个画布控件.此根画布具有多个重叠的子画面(画布也是如此).这样做是为了让每个孩子都可以处理自己的绘图,然后我可以用任何子组合来组合最终结果,以获得所需的行为.
就渲染而言,这非常有效.但是,对于鼠标事件,这不能很好地工作.鼠标事件的工作方式如下(使用previewmousemove作为示例):
1-如果root画布位于鼠标下,则触发事件2-检查所有子项,如果一个项目在鼠标下,则触发事件并停止
因此,只有我添加的第一个孩子才会收到鼠标移动事件.事件不会传播给所有子项,因为它们重叠.
为了解决这个问题,我尝试了以下方法:1-在根画布中覆盖鼠标事件2-对于每个事件,使用VisualTreeHelper.HitTest查找要处理事件的所有子项3-对于返回有效命中测试结果的所有子项(即:在鼠标下并愿意处理事件(IsHitTestVisible == true)),???
这是我被卡住的地方,我不知何故需要将鼠标事件发送给所有孩子,并停止事件的正常流程以确保第一个孩子没有收到它两次(通过事件中的processed = true).
通过使用RaiseEvent并在子节点上传递相同的事件,事情似乎有效,但不知何故它也会在父(根画布)上引发事件.为了绕过这个,我需要创建事件的副本并设置强制设置源,尽管它看起来更像是一个黑客而不是解决方案.有没有正确的方法来做我想做的事情?代码示例如下.
public class CustomCanvas : Canvas
{
private List<object> m_HitTestResults = new List<object>();
public new event MouseEventHandler MouseMove;
public CustomCanvas()
{
base.PreviewMouseMove += new MouseEventHandler(CustomCanvas_MouseMove);
}
private void CustomCanvas_MouseMove(object sender, MouseEventArgs e)
{
// Hack here, why is the event raised on the parent as well???
if (e.OriginalSource == this)
{
return;
}
Point pt = e.GetPosition((UIElement)sender);
m_HitTestResults.Clear();
VisualTreeHelper.HitTest(this,
new HitTestFilterCallback(OnHitTest),
new HitTestResultCallback(OnHitTest),
new PointHitTestParameters(pt));
MouseEventArgs tmpe = new MouseEventArgs(e.MouseDevice, …Run Code Online (Sandbox Code Playgroud) 我有一个根面板(2行,1列),其中有面板P和标签L. P里面有一个JComboBox B. 每当我点击B时,结果下拉显示在L后面.如何修复此问题?我玩各种setComponentZOrder(),但我无法解决这个问题.我该怎么办?
当我画这样的东西时(这里只是随机图纸):
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DrawingVisual visual = new DrawingVisual();
DrawingContext context = visual.RenderOpen();
Pen pen = new Pen(Brushes.Black, 1);
context.DrawEllipse(Brushes.YellowGreen, pen, new Point(0,0), 40, 40);
for (int i = 0; i <= 100 - 1; i++)
context.DrawLine(new Pen(Brushes.Black, 1), new Point(0, i), new Point(i, i));
context.Close();
RenderTargetBitmap bmp = new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Pbgra32);
bmp.Render(visual);
image1.Source = bmp;
}
}
Run Code Online (Sandbox Code Playgroud)
DrawLine和DrawEllipse混合的颜色.(我发现只有DrawLine才使用笔,而不是像Rectangle和Ellipse这样使用Brush的其他形式).奇怪的是,即使是基础网格背景(argh)的LinearGradientBrush的颜色. 我希望它们是z-Ordered,每个都具有完全不透明度.
这里是XAML代码:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"> …Run Code Online (Sandbox Code Playgroud) 我使用Delphi XE2构建了下面的代码.它创建Form1,Form1立即创建Form2的实例.当我按下Form2上的按钮时,将创建第二个Form2.
现在,如果我将鼠标悬停在第二个,最上面的Form2上的按钮上,并等待工具提示出现,工具提示出现的那一刻,第一个 Form2来到前面,窃取焦点.
只有在出现问题Application.MainFormOnTaskbar的True.它还依赖于从Form1 FormCreate方法创建的第一个Form2 .如果我使用PostMessage()延迟创建第一个Form2直到应用程序完成初始化,问题就会消失.
我想知道为什么会这样.我已经知道Delphi的Application对象处理很多事情,包括提示显示,我知道Delphi可以在初始化期间重新创建一个窗口的句柄,但是我无法通过这个来完全解释上述行为(或者确实上述两个事实是否相关).
Project1.dpr
program Project1;
uses
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True; // False makes problem go away
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)
Unit1.pas
unit Unit1;
interface
uses
Vcl.Forms, Unit2;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
public
procedure CreateForm2;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateForm2;
end;
procedure TForm1.CreateForm2;
var
frm …Run Code Online (Sandbox Code Playgroud) 我有多个 SVG 元素,它们位于不同的组中。它们相互重叠。例子:
<svg id="board" width="100%" height="80%">
<g id="terrain" class="layer">
<path d="M-32,-32L32,-32 32,32 -32,32Z" transform="translate(0, 0)" class="mote terrain hill"></path>
</g>
<g id="guy" class="layer">
<path d="M-21...Z" transform="translate(192, 448)" class="mote guy"></path>
</g>
</svg>
Run Code Online (Sandbox Code Playgroud)
当单击与两者匹配的 x、y 位置时,我想知道两者都被单击的所有内容。如果我将每个事件绑定到“单击”事件,则只会调用顶部事件处理程序。这是合理的,尽管不是我想要的。
我正在考虑创建一个最顶层并让它捕获所有点击,然后找出应该通知其他层中的哪些元素。如果可能的话,我想避免大量的跟踪。有更简单的方法吗?
我在.NET Framework 4.0版中使用C#Winforms
我有一个面板,其中包含四个标签,所有标签都停靠在面板的顶部.中间的两个标签是隐藏的.
---顶部---
标签一(可见)
标签二 - (不可见)
标签三(不可见)
标签四 - (可见)
---底部---
单击带有以下代码的按钮时
private void btnShowLabels_Click(object sender, EventArgs e)
{
this.lblTwo.Visible = true;
this.lblThree.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)
标签二和三出现,但它们的z顺序混合起来,如下所示.
---顶部---
标签一(可见)
标签三(可见)
标签二 - (可见)
标签四 - (可见)
---底部---
为什么z顺序会发生变化,如何阻止这种情况发生.
我意识到我可以BringToFront()在点击事件中使用重新排序所有标签,但这对于更复杂的对接安排尤其有点过分.
根据Apple文档:
子视图数组的顺序定义了子视图的Z顺序。如果视图重叠,则索引较低的子视图将出现在索引较高的子视图之后。
我可以看到是这种情况,因为我试图使用对其进行手动排序sendSubviewToBack,而不起作用。如何在UIStackView中调整安排的子视图的z顺序?
我有一个带有许多标记的 matplotlib 散点图:
plt.scatter(x_position,y_position,c=z_position,s=90, cmap=cm.bwr,linewidth=1,edgecolor='k')
Run Code Online (Sandbox Code Playgroud)
有时标记重叠。我希望每个的 zorder 基于单个标记的 z_position。
这在散点图中是否可行,或者我是否必须为每个数据点使用单独的线和自己的 zorder 值?
谢谢你。
使用此 HTML,我无法弄清楚为什么文本显示在图像后面:
<div style="position: relative">
<img src="image_url_here" style="position:absolute; top: 10px; left: 10px;" />
This is some text, drawn on the page after the image, why is it drawn behind the image?
</div>
Run Code Online (Sandbox Code Playgroud)
?
在 Mac 和 PC 上的 Chrome 和 PC 上的 IE 中测试。