Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2012, 03:01   #1
Merano
Пользователь
 
Регистрация: 30.07.2012
Сообщений: 32
По умолчанию окно по центру экрана (delphi)

Здравствуйте.
Помогите, пожалуйста, решить проблему.
Пишу на winapi, создаю окно через CreateWindow(), и никак не получается создать окно по центру экрана... Пробовал через флаг DC_CENTER, и через функцию GetSystemMetrics, вот код:
Код:
var
 x, y : integer;
begin
 x := getsystemmetrics(sm_cxscreen);
 y := getsystemmetrics(sm_cyscreen);

 window := createwindow('wndclass', 'main', ws_popup or ws_visible, x, y, 350, 250, 0, 0, hinstance, nil);

setwindowpos(window, x, y, 0, w, h, swp_nozorder or swp_nomove);
окно вообще пропадает...

В winapi я новичок, поэтому решительно ничего не понимаю

Последний раз редактировалось Stilet; 31.07.2012 в 07:19.
Merano вне форума Ответить с цитированием
Старый 31.07.2012, 07:13   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
окно вообще пропадает...
А должно быть по другому? Ваши слова противоречат действиям.

Подумайте, что вы делаете:
1.
Код:
 x := getsystemmetrics(sm_cxscreen);
 y := getsystemmetrics(sm_cyscreen);
Получили размеры экрана, например, 1920х1080

2.
Код:
 window := createwindow('wndclass', 'main', ws_popup or ws_visible, x, y, 350, 250, 0, 0, hinstance, nil);
Создали окно с начальным положением 1920х1080. Где это ?
p51x вне форума Ответить с цитированием
Старый 31.07.2012, 07:22   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Код:
createwindow('wndclass', 'main', ws_popup or ws_visible, (x div 2)-(350 div 2), (y div 2)-(250 div 2), 350, 250, 0, 0, hinstance, nil);
Если с WinAPI по началу не заладилось программируй в APIx2 - хотя бы посмотришь как правильно делать оконки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2012, 08:02   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Идея, безусловно, правильная (а в данном случае правильная идея только одна), и оптимизировать здесь совершенно бессмысленно, но все-таки, для эстетики:
Код:
createwindow('wndclass', 'main', ws_popup or ws_visible, (getsystemmetrics(sm_cxscreen) - WindowWidth) div 2, (getsystemmetrics(sm_cyscreen) - WindowHeigh) div 2, WindowWidth, WindowHeigh, 0, 0, hinstance, nil);
s-andriano вне форума Ответить с цитированием
Старый 31.07.2012, 09:17   #5
Merano
Пользователь
 
Регистрация: 30.07.2012
Сообщений: 32
По умолчанию

Огромное спасибо всем!
Получилось
На примерах мне легче понимать все, а в интернете почти отсутствуют примеры работы на Delphi, в WinAPI...
Или я плохо ищу...

Stilet, спасибо за совет, буду разбираться

Последний раз редактировалось Merano; 31.07.2012 в 09:59.
Merano вне форума Ответить с цитированием
Старый 31.07.2012, 10:22   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
а в интернете почти отсутствуют примеры работы на Delphi, в WinAPI...
Прочитайте еще аз мой пост. Тут дело совсем не в примерах и вообще программировании.

Вот представьте, что вы хотите нарисовать точку посеридине листа. Берете линейку...
p51x вне форума Ответить с цитированием
Старый 31.07.2012, 13:24   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Merano Посмотреть сообщение
///а в интернете почти отсутствуют примеры работы на Delphi, в WinAPI...
Или я плохо ищу...
Угу.
Искать нужно не по "Delphi WinAPI", а просто по "WinAPI" - названия функций и логика их вызова не зависят от конкретного языка, для С же найти любые примеры не составляет никакого труда.

Хотя, в данном случае p51x прав: дело здесь не в WinAPI, а в банальной арифметике.
s-andriano вне форума Ответить с цитированием
Старый 01.08.2012, 10:17   #8
Exception
Пользователь
 
Регистрация: 31.12.2007
Сообщений: 37
По умолчанию

Код:
function CenterDialogEx(hWnd: HWND; fAncestor: Boolean): Boolean;
var
  hAncestor: THandle;
  hwndRect : TSize;
  dlgRect  : TRect;
  ancRect  : TRect;
  dlgSize  : TSize;
  pntSize  : TSize;
  workArea : TRect;
  workSize : TSize;
begin
  GetWindowRect(hWnd, dlgRect);
  dlgSize.cx := dlgRect.Right - dlgRect.Left;
  dlgSize.cy := dlgRect.Bottom - dlgRect.Top;
  hwndRect.cx := (GetSystemMetrics(SM_CXSCREEN) - dlgSize.cx) div 2;
  hwndRect.cy := (GetSystemMetrics(SM_CYSCREEN) - dlgSize.cy) div 2;
  if fAncestor then
  begin
    hAncestor := GetParent(hWnd);
    if (hAncestor <> 0) then
    begin
      if (IsWindowVisible(hAncestor) and (not IsIconic(hAncestor))) then
      begin
        GetWindowRect(hAncestor, ancRect);
        pntSize.cx := ancRect.Right - ancRect.Left;
        pntSize.cy := ancRect.Bottom - ancRect.Top;
        SystemParametersInfoW(SPI_GETWORKAREA, 0, @workArea, 0);
        workSize.cx := workArea.Right - workArea.Left;
        workSize.cy := workArea.Bottom - workArea.Top;
        hwndRect.cx := ancRect.Left + ((pntSize.cx - dlgSize.cx) div 2);
        if (hwndRect.cx < 0) then
          hwndRect.cx := 0
        else
        if ((hwndRect.cx + dlgSize.cx) > workSize.cx) then
          hwndRect.cx := workSize.cx - dlgSize.cx;
        hwndRect.cy := ancRect.Top + ((pntSize.cy - dlgSize.cy) div 2);
        if (hwndRect.cy < 0) then
          hwndRect.cy := 0
        else
        if ((hwndRect.cy + dlgSize.cy) > workSize.cy) then
          hwndRect.cy := workSize.cy - dlgSize.cy;
      end;
    end;
  end;
  Result := SetWindowPos(hWnd, 0, hwndRect.cx, hwndRect.cy, 0, 0,
    SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOZORDER);
end;
Exception вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Блокировка экрана в Delphi kotaina Общие вопросы Delphi 11 08.10.2011 02:51
Сканирование экрана и поиск заданного цвета. (Delphi) lungeve Помощь студентам 6 03.07.2010 13:19
нарисовать круг по центру экрана rUs_LAN Win Api 2 01.04.2010 21:27
Окно в Delphi Xatr Win Api 2 26.12.2008 16:40