VSTO + ownerdraw
От: unkulunkulu  
Дата: 17.07.07 14:59
Оценка:
Привет.

Народ, кто встречался со следующей проблемой: есть аддон, написанный при помощи VSTO 2005 SE (Visual Studio Tools 2005 for Office Second Edition) к аутлуку — это 1я сборка.
Есть сборка с формой — пусть это 0я сборка.
И есть сборка — экзешник — соответственно, 3я.
На форме, которая в 0й сборке, есть ComboBox. Он OwnerDrawFixed.
Там рисуются иконки из подгружаемого в этой же сборке списка изображений.

Так вот:
Если я запускаю сборку 3, и из неё создаю форму из сборки 0, то всё работает отпадно, как и должно быть.
А вот если я создаю ту же форму из аддона к аутлуку (1й сборки), то прорисовывается всё немного странно, а именно:
Если нажать стрелку у ComboBox'а, то ни у одного элемента не будет прорисована картинка, хотя текст и выделение будут.
Если не нажимать стрелку (т.е. в самом ComboBox'е в закрытом состоянии) картинка появляется только после того, как ComboBox потеряет фокус или юзер подвинет на него мышь (!!!!)

Таких глюков давно не видел.
Кто сталкивался с подобным, прошу помощи.

P.S. эксепшенов Graphics.DrawImage никаких не выбрасывает, всё выглядит будто он что-то таки нарисовал там.

В догонку вышлю код обработчика DrawItem:

ImageList imgNodes;
private void lstElementType_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();

    if (e.Index != -1)
    {
        Rectangle rcText = e.Bounds;
        rcText.X += imgNodes.ImageSize.Width + 2;

        using (Brush textBrush = new SolidBrush( e.ForeColor ))
        using (StringFormat format = new StringFormat())
        {
            format.Alignment = StringAlignment.Near;
            format.LineAlignment = StringAlignment.Center;
            e.Graphics.DrawString( (string) lstElementType.Items[ e.Index ], e.Font, textBrush, rcText, format );
        }

        Point ptIcon = e.Bounds.Location;
        ptIcon.Offset( 1, 1 );

        e.Graphics.DrawImage( GetImage( possibleNodeIDs[ e.Index ] ), ptIcon );
    }

    e.DrawFocusRectangle();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.