Как мне обработать WM_NCCALCSIZE и сделать хром-подобный интерфейс? - PullRequest
2 голосов
/ 28 января 2011

В настоящее время я использую Google Chrome в качестве основного браузера. Мне было интересно, как разработчики поместили пользовательский заголовок, потому что я хотел включить его в одно из своих приложений.

Если вы, ребята, не знаете, о чем я, вот картинка:

Screenshot

Я нашел статью об интерфейсе, которая находится здесь: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/33870516-9868-48d3-ab53-6269d9979598

Однако я не знаю, как это сделать. В настоящее время я использую VC ++ Express. Может кто-нибудь дать мне пошаговые инструкции и как получить такой интерфейс? За исключением того, что я не хочу вкладки сверху.

Я пишу это в Win32.

Ответы [ 2 ]

3 голосов
/ 30 января 2016

ОК, ответ прост:

Chomre просто не использует встроенную функциональность Windows для рисования рамки, заголовка, кнопок заголовка и т. Д.

Когда вы вызываете GetWindowRect(hChromeWindow) и GetClientRect (hChromeWindow) вы заметите, что прямоугольники идентичны.Это означает, что Chrome отключает все функциональные возможности Windows для рисования границы (просто возвращают 0 в WM_NCCALSIZE, ничего не делая), а затем они рисуют ВСЕ в клиентскую область.

Таким образом, в WM_PAINT они рисуют заголовок и верхнюю частьчасть окна (панель URL, вкладки и т. д.) вместе.В WM_NCPAINT они ничего не делают.

Это не обычный способ сделать это, но самый простой, и это пуленепробиваемый.

Кстати: Java-приложения делают то же самое.

3 голосов
/ 28 января 2011

Если память используется, то main , которые вам нужно обрабатывать, - это не WM_NCCALCSIZE, а WM_NCHITTEST и WM_NCPAINT.

WM_NCHITTEST - это то, что сообщает системе, когда курсор находится над строкой заголовка, поэтому вам нужно занять позицию курсора и решить, находится ли он над областью, которую вы считаете "строкой заголовка". В частности, если пользователь щелкает и перетаскивает курсор в этой области, перетаскивается все окно.

WM_NCPAINT аналогичен WM_PAINT, за исключением области, не относящейся к клиенту, т. Е. Это когда вам нужно нарисовать все, что вы собираетесь, для строки заголовка (и границ окна, если память служит).

Я должен добавить, что давно не играл с этим. Почти наверняка больше я сейчас не вспомню.

...