当绘制包含带逐像素 alpha channel 的位图的子控件时,每当需要重新绘制它们时,我们会遇到很多闪烁。实际混合工作正常。我找到了很多关于减少闪烁的信息(例如 this question 或 this site ),但我似乎找不到任何专门适用于这种情况的信息。
例如,我有一个带有几个不同位图的按钮,这些位图根据按钮的状态进行了 alpha 混合并 blit 到窗口。当它们的状态发生变化并且我需要绘制不同的位图时,我需要先重新绘制背景,否则它会与前一个状态位图遗留下来的像素混合。这就是我出现闪烁的地方,偶尔会有一些背景撕裂。
让顶层父窗口绘制位图背景而不是纯色,以及子控件重叠的可能性,使问题变得更加复杂;仅仅将底层颜色乘以子位图是不可能的,使用 WS_CLIPCHILDREN 也是如此。
由于窗口有位图背景,我在 WM_ERASEBKGND 上返回 true,以避免绘制将被覆盖的颜色。
当然,双缓冲似乎可以解决所有这些问题,但我无法让它正常工作。我为顶级窗口设置了 WS_COMPOSITED,为子窗口设置了 WS_TRANSPARENT。当需要使用新位图重绘子窗口时,我遇到了一些问题(很可能是因为我不了解绘制顺序在这种情况下的工作方式):
InvalidateRect() 并传递子句柄,子窗口确实会重绘,但背景不会重绘,因此像素会叠加在一起,混合在一起。 InvalidateRect() 并传入 parent 句柄,其中一个矩形由子窗口的尺寸组成,则背景会重绘,但子窗口是不是。InvalidateRect() 似乎非常骇人听闻,因为我猜每次调用都可能导致缓冲区翻转,这违背了目的)。我得出的结论是,我真的不明白我需要如何修改我的程序来处理双缓冲,或者双缓冲是否有助于解决这种情况。我觉得肯定会,但我不太明白我需要如何修改才能让所有内容再次正常播放。
最佳答案
你在使用 layered windows ?如果没有,也许可以尝试一下。
也用于双缓冲 consider this technique .
关于c++ - 带有 alpha channel 的闪烁子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/865851/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我想用这两种语言中的任何一种(最好是ruby)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生
假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question
我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=