2016-01-10 1 views
0

Я рисую несколько прямоугольников, используя GDI на моей прозрачной форме.Самая открытая прозрачная кликабельная форма с возможностью кликаберования через элементы управления C#

Форма является полноэкранным и всегда сверху. Кроме того, это интерактивное за счетом использования этого метода: Topmost form, clicking "through" possible?

Однако нарисованные прямоугольники не кликабельны через как мою форму и мое приложение теряет фокус каждый раз, когда я нажимаю на них. Кроме того, когда я наводил на них курсор, я могу видеть мой курсор приложения (окно под формой - это игра, поэтому у нее есть настраиваемый курсор).

Можете ли вы рассказать мне, как я могу сделать все элементы управления не настраиваемыми и интерактивными? Возможно ли, или я должен использовать такие вещи, как рисование DirectX?

Я искал всю сеть и stackoverflow, использовал различные решения, но ничего не работал.

Спасибо.

+1

Звучит ужасно рыбный –

+0

Обычно видимые пиксели захватывают щелчок. – TaW

+0

@ Кирилл: Почему? – Frank

ответ

0

Я не уверен, я полностью понимаю, что вы пытаетесь достичь, однако если вы хотите, чтобы элемент управления, который может получать щелчки мыши, но не «украсть» фокус, это вполне возможно:

public class Box : Control 
{ 
    public Box() 
    { 
     // Prevent mouse clicks from 'stealing' focus: 
     TabStop = false; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     DrawText(e.Graphics); 
    } 

    // Display control text so we know what the button does: 
    private void DrawText(Graphics graphics) 
    { 
     using (var brush = new SolidBrush(this.ForeColor)) 
     { 
      graphics.DrawString(
       this.Text, this.Font, brush, 
       new PointF() 
       { 
        X = ((float)this.Width/2f), 
        Y = (((float)this.Height/2f) - (this.Font.GetHeight(graphics)/2f)) 
       }, 
       new StringFormat() 
       { 
        Alignment = StringAlignment.Center 
       }); 
     } 
    } 
} 


Это простое управление будет отображаться в виде прямоугольника, который все еще находится в состоянии получить щелчки мыши и пожарной кнопки мыши события, но не перехватывает фокус от других элементов управления на форме (ни сама форма).


Установка ключ прозрачности на форме ее цвет фона сделает остальные формы невидимы, так что только прямоугольная «кнопка» будет видна. Это также можно комбинировать с свойством Opacity, чтобы сделать то, что отображается полупрозрачным, но форма с непрозрачностью точно ноль не будет взаимодействовать с мышью (по дизайну Windows).


Просто установка TopMost свойства формы в истинно не может быть достаточно, чтобы держать окно поверх всех остальных окон. Вы, возможно, потребуется сделать следующее API вызова внутри формы при ее создании (например, место в конструкторе, OnLoad событие, и т.д.):

SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW)); 


MSDN документацию по этой функции можно найти here.

Для того, чтобы сделать это позвонить вам нужно будет добавить следующее объявление API для Windows в классе формы:

[DllImport("user32.dll")] 
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); 

, а также добавить следующие константы:

private const int SWP_NOMOVE  = 0x0002; 
private const int SWP_NOSIZE  = 0x0001; 
private const int SWP_SHOWWINDOW = 0x0040; 

private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); 


Надеюсь, это поможет!