Установите SWT Check / Radio Button Основной цвет в Windows - PullRequest
1 голос
/ 01 августа 2011

Это не дубликат Как установить цвет переднего плана кнопки SWT? . Это больше похоже на продолжение. Я написал последующие вопросы в качестве комментариев, но не получил никаких ответов, поэтому я подумал, что постараюсь поставить их как вопрос, и, надеюсь, какой-нибудь эксперт это увидит.

Как указано в указанном вопросе, виджеты собственных кнопок Windows не поддерживают установку цвета переднего плана (на самом деле, после более дальнейших исследований (больше похоже на эксперименты), было обнаружено, что setForeground () работает в рамках классической темы, но не другие).

Ответ / предложение, данное в указанном вопросе, является хорошим (a.k.a предоставление слушателя рисования и рисование текста с правильным цветом). Я обернулся, но столкнулся с миром проблем, пытаясь определить координату, на которой нужно нарисовать текст:

Похоже, что - помимо атрибутов SWT, таких как выравнивание и т. Д., - в Windows есть довольно сложное правило определения местоположения текста. Что еще хуже, это то, что расположение зависит от действующей темы Windows. Поскольку мне нужно нарисовать текст точно поверх текста, нарисованного в Windows, чтобы переопределить цвет, это огромная проблема.

Пожалуйста, кто-нибудь может оказать здесь столь необходимую помощь? Это будет с благодарностью!

Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

На том же 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 );
    }
}
0 голосов
/ 17 августа 2011

В конце концов, я решил реализовать его как собственный Composite с флажком / переключателем и меткой. Не идеально, но мне придется смириться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...