Можете ли вы сделать это в .NET / C #?
Да, конечно, можете, но это требует немного усилий. Я бы порекомендовал следующий подход. Создайте форму верхнего уровня, у которой нет границы или области заголовка, а затем убедитесь, что она не рисует фон клиентской области, установив для TransparencyKey и BackColor одно и то же значение. Итак, теперь у вас есть окно, которое ничего не рисует ...
public class DarkenArea : Form
{
public DarkenArea()
{
FormBorderStyle = FormBorderStyle.None;
SizeGripStyle = SizeGripStyle.Hide;
StartPosition = FormStartPosition.Manual;
MaximizeBox = false;
MinimizeBox = false;
ShowInTaskbar = false;
BackColor = Color.Magenta;
TransparencyKey = Color.Magenta;
Opacity = 0.5f;
}
}
Создайте и разместите это окно DarkenArea над клиентской областью вашей формы. Затем вам нужно иметь возможность отображать окно без того, чтобы оно занимало фокус, и поэтому вам нужно будет вызвать платформу следующим образом, чтобы показать, не становясь активным ...
public void ShowWithoutActivate()
{
// Show the window without activating it (i.e. do not take focus)
PlatformInvoke.ShowWindow(this.Handle, (short)SW_SHOWNOACTIVATE);
}
Вам нужно сделать так, чтобы он действительно что-то рисовал, но исключил рисование в той области элемента управления, которую вы хотите оставить выделенной. Так что переопределите обработчик OnPaint и нарисуйте черным / синим цветом или чем угодно, но исключая область, которую вы хотите оставить яркой ...
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Do your painting here be exclude the area you want to be brighter
}
Наконец, вам нужно переопределить WndProc, чтобы предотвратить взаимодействие мыши с окном, если пользователь пытается что-то сумасшедшее, например, щелкнуть затемненную область. Что-то вроде этого...
protected override void WndProc(ref Message m)
{
if (m.Msg == (int)WM_NCHITTEST)
m.Result = (IntPtr)HTTRANSPARENT;
else
base.WndProc(ref m);
}
Этого должно быть достаточно, чтобы получить желаемый эффект. Когда вы будете готовы отменить эффект, вы избавляетесь от экземпляра DarkenArea и продолжаете.
person
Phil Wright
schedule
16.09.2008