我的朋友,这将是一个很长的...
当我尝试在分层窗口中渲染文本时,我得到了一些非常奇怪的行为.
奇怪的是,对于font/font-style/font-size的某些组合,GDI +会更改渲染方法.对于Tahoma-Bold字体大小介于 8.49和16.49(像素单位)之间,包括"失败".对于其他字体和样式,我会以不同的大小"失败".

为清楚起见,我提供了一个完整的可执行示例.要使用的两个关键参数是第23行:
Color g_oTextColor( 255, 240, 0, 0 ); // Simply change Color to ( 254, 240, 0, 0 ) [to add slight transparency] and everything will work!
#define USE_LAYERED_WINDOW // or just comment this line out [to use a regular window], and everything will work!
Run Code Online (Sandbox Code Playgroud)
当使用分层窗口和完全不透明度时,字体在背景中绘制一个透明的"洞".但是,如果我为文本颜色添加轻微的透明度(alpha-channel = 254),则字体会变得不透明.或者,如果我使用常规(非分层)窗口,则字体呈现不透明.这里发生了什么??
但即使没有分层/透明问题,很明显这里发生了一些奇怪的事情.字体大小为8.49 - 16.48,渲染像素完美,其他字体质量模糊,特别是小字体.因此,系统似乎采用不同的方法来渲染这些中等大小.有人可以对此有所了解,我怎么可能渲染例如字体大小8.0像素而没有上面的模糊?我已经尝试过各种各样的设置SetTextRenderingHint(),SetTextContrast()但是对于8号字体来说,没有一个看起来很清晰.我只尝试了Tahoma和Arial ......
问题1:
我想使用纯GDI +进行离屏绘图,但我无法通过简单地创建Bitmap&Graphics对象来实现它.我仍然不得不使用旧的GDI东西来创建DC并选择HBitmap.我怎样才能在GDI +中完成所有工作?
问题2(仅限Geeks): 我也尝试在古老的GDI中绘制字体,但是我得到了一些更奇怪的效果:(1)在分层窗口中,文本变得透明,但是以一种附加的方式.(所以如果背后的窗户是黑暗的,那么红色的文字看起来会很好但是如果背后的窗户是白色的,那么文字完全消失了!)此外,如果我用半透明的方形填充我自己的窗户,那么表现就像预期的那样.(如果背后的窗口是黑色的话,红色正方形会变成深红色,并且正方形会在白色窗口上变成浅红色).我可以在一个分层窗口中同时观察这两种行为.并且 …
作为一个C++老朋友,我设法解决了我的问题,但我不能在这里围绕底层Java机制:
Vector<Object> x = new Vector<Object>(); // OK
ArrayList<Object> y = new ArrayList<Object>(); // OK
List<Object> zzz = new ArrayList<Object>(); // OK solves problem below but question remains
List<Object> z = new List<Object>(); // WHY? Compiler error: Cannot instantiate
Run Code Online (Sandbox Code Playgroud) [编辑,完全改写:]似乎我的问题确实措辞不好,而且收到的也很差.所以我希望这个完整的改述有助于......
MSDN告诉清楚指定: Control.BeginInvoke()在创建控件的句柄的线程上执行委托,通常这将是GUI线程.和Dispatcher.BeginInvoke()将在其中创建调度对象的线程上运行.这将是我创建的任何线程.
但是对于代理" CLR自动定义 BeginInvoke和EndInvoke",这些调用在ThreadPool-thread上运行.除了这种略微令人惊讶的不同行为,我想知道如何找到自动实现的所有函数的规范.
例如:Intelli-sense显示我的委托有一个DynamicInvoke().类System.Delegate {}确实有一个DynamicInvoke(),这可能意味着我的委托继承了它.但Delegate {}没有BeginInvoke().而且委托{}有几个我的代表没有的功能.我的委托也得到一个GetObjectData()方法.这似乎来自ISerializable.
总而言之,一个委托似乎从(1)CLR"自动"获取其方法,(2)Delegate {}的某个子集可能是MulticastDelegate {},并且可能(3)ISerializble.我在哪里可以找到委托获得的所有方法的全面规范?特别有趣的是BeginInvoke(),它是精确的签名,因为前面提到的两个具有该名称的方法具有不同的签名集.
[有人在编辑中建议"委托"是"代表".我敢说,事实并非如此.
谢谢
网上满是"可怕的钻石问题"的解释.StackOverflow也是如此.我想我明白这一点,但我没有将这些知识转化为理解类似但不同的东西.
我的问题始于一个纯粹的C++问题,但答案很可能转移到MS-COM细节中.一般问题是:
class Base { /* pure virtual stuff */ };
class Der1 : Base /* Non-virtual! */ { /* pure virtual stuff */ };
class Der2 : Base /* Non-virtual! */ { /* pure virtual stuff */ };
class Join : virtual Der1, virtual Der2 { /* implementation stuff */ };
class Join2 : Join { /* more implementation stuff + overides */ };
Run Code Online (Sandbox Code Playgroud)
这不是经典的钻石解决方案.究竟"虚拟"在这里做什么?
我真正的问题是试图理解我们朋友在CodeProject上的讨论.它涉及一个自定义类,用于为Flash播放器创建透明容器.
我以为我会尝试这个地方的乐趣.事实证明,以下声明使您的应用程序崩溃,其中包含Flash播放器的第10版.
class FlashContainerWnd: virtual public …Run Code Online (Sandbox Code Playgroud) 我想在我的JTable-derrived类的标题中设置标签的垂直对齐方式.
我知道 setVerticalAlignment(SwingConstants.BOTTOM);
我的标题比字体高得多,我想把文字放在垂直中心的下方.
我怎么能这样做,而不是压倒一切paint()?
谢谢
缓冲区溢出问题是众所周知的.因此,我们有幸使用标准库函数,如wcscat_s().微软的好心人已经创建了类似的安全字符串函数,如StringCbCat().
但我有一个问题,我需要搜索一些字符串的内存.标准库函数:
wcsstr( wchar_t* pMem, wchar_t* pStr )
Run Code Online (Sandbox Code Playgroud)
看起来很棒,但是...有时我的记忆包含垃圾,有时候是字符串.当它是垃圾时,我有时会运行已分配的内存页面,[=访问冲突].我可以写自己的功能是的.但我的问题是,是否有任何"标准"功能来进行安全字符串搜索,例如:
"wcsstr_s( wchar_t* pMem, size_t uiSize, wchar_t* pStr )" ?
Run Code Online (Sandbox Code Playgroud)
感谢名单
[编辑] 感谢Charles Bailey对我的问题的完美回答.感谢其他人的努力.
对于那些怀疑我的场景的理智的人:是的,当然,在我的记忆中永远不会有垃圾是好的.但我可以想象出现这种情况的几种情况.在我的特殊情况下,它是逆向工程,而我正在处理的内存实际上不是"我的记忆",它属于另一个我无法控制的过程.
(另一个假设场景可能是一个棘手的调试情况,需要跟踪损坏的内存.)