在Windows中设置SWT检查/单选按钮前景色

时间:2011-08-01 10:43:10

标签: windows swt

这不是How to set SWT button foreground color?的重复。这更像是一次跟进。我写了后续问题作为评论,但没有得到任何答复,所以我想我会把它作为一个问题提出来,希望有些专家会看到它。

正如引用的问题所指出的,Windows原生按钮小部件不支持设置前景色(事实上,经过更多的进一步研究(更像实验),已经发现setForeground()在经典主题下工作,但是不是其他人。)

在引用的问题中给出的答案/建议是一个很好的答案(a.k.a提供一个绘画监听器并用正确的颜色绘制文本)。我给了它一个旋转,但遇到了一个问题世界,试图决定绘制文本的坐标:

看起来 - 除了像对齐等SWT属性之外 - Windows还有一些很难确定的决定文本位置的规则。更糟糕的是,该位置似乎取决于有效的Windows主题。由于我需要在本机绘制的Windows文本上绘制文本以覆盖颜色,这是一个很大的问题。

请有人在这里提供一些急需的帮助吗?非常感谢!

谢谢!

2 个答案:

答案 0 :(得分:2)

在用于绘制彩色背景的同一PaintListener上,您必须计算位置并绘制文本。这是我们在这里做的方式:

public void paintControl( PaintEvent event ) {
    // Is the button enabled?
    if ( !isEnabled() ) {
        return;
    }

    // Get button bounds.
    Button button = (Button)event.widget;
    int buttonWidth = button.getSize().x;
    int buttonHeight = button.getSize().y;

    // Get text bounds.
    int textWidth = event.gc.textExtent( getText() ).x;
    int textHeight = event.gc.textExtent( getText() ).y;

    // Calculate text coordinates.
    int textX = ( ( buttonWidth - textWidth ) / 2 );
    int textY = ( ( buttonHeight - textHeight ) / 2 );

    /*
     * If the mouse is clicked and is over the button, i.e. the button is 'down', the text must be
     * moved a bit down and left.
     * To control this, we add a MouseListener and a MouseMoveListener on our button.
     * On the MouseListener, we change the mouseDown flag on the mouseDown and mouseUp methods.
     * On the MouseMoveListener, we change the mouseOver flag on the mouseMove method.
     */
    if ( mouseDown && mouseOver ) {
        textX++;
        textY++;
    }

    // Draw the new text.
    event.gc.drawText( getText(), textX, textY );

    // If button has focus, draw the dotted border on it.
    if ( isFocusControl() ) {
        int[] dashes = { 1, 1 };
        evento.gc.setLineDash( dashes );
        evento.gc.drawRectangle( 3, 3, buttonWidth - 8, buttonHeight - 8 );
    }
}

答案 1 :(得分:0)

最后,我决定将它作为一个带有复选框/单选按钮和标签的自定义Composite实现。不理想,但我必须做。