singlepost

Непрямоугольные формы в C# << На главную или назад  

Есть проблема. Сделал с помощью свойства TransparencyKey часть формы прозрачной за счёт того что вставил своё изображение как BackgroundImage.
Сделал по нажатию, поднятию и перетаскиванию левой кнопки мыши по форме, перемещение формы, но вопрос:

Как сделать так, чтобы перетакскивать можно было лишь тогда, когда нажатие произошло над видимой частью формы? А потом как передать нажатие окнам, находящимся "под" данным?

Если кто сталкивался, подскажите выход, или направление(кроме google и MSDN :) ).

8 ответов в теме “Непрямоугольные формы в C#”

  1. 1
    Антон Кононов ответил:

    прикол :) а в дельфи и так работает. кидаешь картинку и все.

  2. 2
    Дима Рубекин ответил:

    перетаскивание у форм происходит при нажатии на заголовок, а не на площади всей формы

  3. 3
    Дмитрий Милють ответил:

    чтобы заголовка не было выстаялял свойство FormBorderStylenone,
    но если имеете ввиду сделать самому часть формы "заголовком" (например PictureBox добавить на форму) и таскать форму при нажатии по нему, я об этом тоже думал, спасибо.

  4. 4
    Дима Рубекин ответил:

    так ИМХО будет более логичнее)))

  5. 5
    Антон Кононов ответил:

    проще все
    перехватываешь событие формы WM_NCHITTEST
    заменяешь result (или как он там) с простой области на заголовок (см. справку и гугль). Примерно 1-2 строки кода чтобы окно перетаскивалось за любую область (разумеется компоненты не в счет).

  6. 6
    Дмитрий Милють ответил:

    брутфорс немного) т.к. форма не прямоугольная, а вырезается оверлеем(уже жесть), то чтобы определить прозрачно сие место или нет, надо изобретать велосипед(например опять же сравнивать с цветом в TransparencyKey по нажатию мыши, и если да то попали в прозрачное).
    нашёл на кодпрожэкт статью http://www.codeproject.com/KB/GDI-plus/CsTranspTutor...
    вроде то, но пока нету времени. Как изучу отпишусь, возможно кому-то поможет.

  7. 7
    Дмитрий Милють ответил:

    вобщем делаем пустую форму с FormBorderStyle none, форме даём к примеру белый цвет фона, добавляем к примеру Panel, вставляем в него пикчу на которой "то что нужно отрезать" белого цвета. Делаем для формы TrasparencyKey White.
    А события перемещения делаем уже для Panel, но можно и как написал Антон RichDad Кононов обрабатывать событие WM_NCHITTEST, выглядеть это будет так

    private const int WM_NCHITTEST = 0×84;
    private const int HTCAPTION = 0×2;
    protected override void WndProc(ref Message m)
    {
    if(m.Msg == WM_NCHITTEST)
    m.Result = new IntPtr(HTCAPTION);
    else
    base.WndProc(ref m);
    }

  8. 8
    Ульяна Шабельник ответил:

    Создание сайтов, полное их продвижение, опытные специалисты!

    http://vkontakte.ru/club10929307
    http://license-soft.ru

    САМЫЕ НИЗКИЕ ЦЕНЫ!

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.