Пользовательская реализация Min Max Close Button - PullRequest
2 голосов
/ 04 марта 2012

Я использую простой C ++ (без MFC) для реализации приложения.Я хотел добавить пользовательскую кнопку Мин / Макс / Закрыть

Код, который я использовал ниже.Для HTCAPTION и других связанных с границами определений работает как шарм, но я не мог заставить HTMINBUTTON, HTMINBUTTON, HTCLOSE работать таким же образомНужно ли что-то еще, чтобы NCHITTEST вступил в силу?

// Defining min/max/close
if ((p.x > rt.right - 130) && (p.x < rt.right - 104) &&
    (p.y > 41) && (p.y < 67))
    return HTMINBUTTON;
else if ((p.x > rt.right - 100) && (p.x < rt.right - 74) &&
    (p.y > 41) && (p.y < 67))
    return HTMAXBUTTON;
else if ((p.x > rt.right - 70) && (p.x < rt.right - 44) &&
    (p.y > 41) && (p.y < 67))
    return HTCLOSE;

// Defining window border and caption
else if ((p.x > EDGE) && (p.x < rt.right-EDGE) &&
    (p.y > EDGE) && (p.y < rt.bottom-EDGE))
    return HTCAPTION;
else if (p.x <= EDGE && p.y <= EDGE)
    return HTTOPLEFT;
else if (p.x <= EDGE && p.y >= rt.bottom - EDGE)
    return HTBOTTOMLEFT;
else if (p.x >= rt.right - EDGE && p.y <= EDGE)
    return HTTOPRIGHT;
else if (p.x >= rt.right - EDGE && p.y >= rt.bottom - EDGE)
    return HTBOTTOMRIGHT;
else if (p.x <= EDGE)
    return HTLEFT;
else if (p.x >= rt.right - EDGE)
    return HTRIGHT;
else if (p.y <= EDGE)
    return HTTOP;
else if (p.y >= rt.top - EDGE)
    return HTBOTTOM;
else
    return DefWindowProc(hWnd, message, wParam, lParam);

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Если вы рисуете всю область, не относящуюся к клиенту, в вашей программе (т. Е. У вас есть пользовательская строка заголовка окна и рамка), тогда лучшим вариантом будет удалить панель заголовка и рамку по умолчанию и использовать весь клиентПлощадь как ваше окно.Таким образом, вы можете просто создать пользовательскую кнопку (или нарисованную владельцем кнопку) с графикой, необходимой для ваших кнопок min / max / exit, и поместить их в область строки заголовка в качестве элемента управления кнопки.Ваша программа будет по-прежнему работать так, как будто у нее есть строка заголовка и рамка, потому что вы обрабатываете сообщение WM_NCHITTEST.Я только что сделал эту вещь с моим настраиваемым окном сегодня, и оно работает очень хорошо.

Редактировать: Я забыл добавить, что возврат HTMAX / HTMIN / HTCLOSE не вызовет реакцию окна.Значение, которое вы возвращаете из WM_NCHITTEST, отправляется в WPARAM других сообщений, в частности WM_NCLBUTTONDOWN и WM_NCLBUTTONUP.К сожалению, сообщение WM_NCLBUTTONUP не отправляется должным образом, потому что когда вы щелкаете в строке заголовка, оно захватывает мышь.

0 голосов
/ 25 февраля 2014

У меня есть решение, которое работает для меня. Вот мои шаги для воспроизведения

1. WM_NCHITTEST

Подписаться на WM_NCHITTEST. Теперь вам нужно обработать сообщение и вернуть результат вашего теста.

Это может помочь вам: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645618(v=vs.85).aspx

Для меня я создал несколько областей в моей форме. TopLeft, Top, TopRight, подпись, влево, вправо, BottomLeft, BottomRight, BottomRight, MinButton, MaxButton, CloseButton

Каждый из них представляет собой Прямоугольник, определяющий область в моей форме. Я просто проверяю, находится ли курсор мыши в одной из этих областей, и возвращаю правильный HT-CODE.

2. WM_NCLBUTTONDOWN

Теперь подпишитесь на WM_NCLBUTTONDOWN. Проверьте WPARAM для значения NCHITTEST, которое вы хотите обработать. Для проверки кнопки свертывания для HTMINBUTTON (0x0008)

Но здесь я просто возвращаю IntPtr.Zero в результате. Это указывало на то, что я обработал сообщение.

3. WM_NCLBUTTONUP

После этого подпишитесь на WM_NCLBUTTONUP. Проверьте WPARAM на целевое значение NCHITTEST и делайте то, что здесь, что хотите.

Я выложу свой источник позже!

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