2012-02-02 7 views
1

Ive получил простой безмоментный диалог, который я хотел бы разместить в нижнем правом углу родительского окна. Это мой первый раз, когда я работаю с окнами в C (поэтому, пожалуйста, будьте терпеливы, если я не понимаю).Место окна относительно родителя

Я попытался позиционировать окно с SetWindowPos, но безрезультатно, так как координаты x и y относительно верхнего левого угла экрана.

//hWnd is the parent window 
hwndStatusBox = CreateDialog(hInst, MAKEINTRESOURCE(IDD_STATUSBOX), 
          hWnd, svnStatusBoxProc); 

SetWindowPos(hwndStatusBox,NULL, 100, 100, 0, 0, 
      SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOZORDER); 

У меня отсутствует функция или мне нужно рассчитать смещение самостоятельно?

Я не хочу использовать координаты, определенные в ресурсе, я бы хотел ее решить программно.

+0

Кто downvoted без комментариев, так что я буду upvote компенсировать ... – Lundin

ответ

3

Для окна верхнего уровня, то есть нет окна , координаты действительно относятся к экрану.

Вам нужно будет прочитать координаты окна владельца, определить, какое значение вам необходимо, добавить на смещение и, наконец, установить координаты для вашего диалога относительно начала экрана. Или вы можете позвонить ClientToScreen, минуя hWnd и получить систему, чтобы сделать это за вас.

+0

окно Я хочу, чтобы поместить это ребенок. Невозможно ли разместить его релятив с родителем? – SanBen

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms632679.aspx) говорит об этих координатах: «Для дочернего окна x является x-координатой в верхнем левом углу окна относительно верхнего левого угла клиентской области родительского окна. " Другими словами, то, что вы нам говорите, не кажется последовательным. Я сомневаюсь, что это действительно ребенок. Диалоги - это окна верхнего уровня. Они не являются дочерними окнами. –

+0

Да, действительно, я думаю, что что-то не хватает: P Я добавил код, где создаю окно, правильно ли я делаю это? – SanBen

3

Существует функция, чтобы сделать это:

ClientToScreen 

, который преобразует клиент координат экрана координат. Например: -

message_box_position = {ParentWidth - MessageBoxWidth, ParentHeight - MessageBoxHeight} 
ClientToScreen (parent_window_handle, &message_box_position) 
SetWindowPos (message_box_handle, messahe_box_position) 
+0

-1 Я пытаюсь сделать обратное. Пожалуйста, внимательно прочитайте вопрос. – SanBen

+0

@ R34lthing Нет, это именно то, что вы пытаетесь сделать. Вы хотите указать координаты относительно клиентской области окна владения. Но поскольку у вас есть диалог на верхнем уровне, вы должны указывать относительные координаты экрана. И «ClientToScreen» выполнит это преобразование. +1 для компенсации. –

+0

@DavidHeffernan Хорошо, я этого не знал. Прошу прощения за такой опрометчивый и неподходящий ответ. – SanBen

Смежные вопросы