Сейчас на форуме: zds, tyns777, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› Как заставить форму не двигатся? (API)
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 28 декабря 2008 17:59
· Личное сообщение · #1

В програме есть окно которое не должно двигатся, т.е. при попытке перетащить его мышкой(или каким нибудь другим способом) оно не реагировало на это сообщение.

-----
Лучше быть одиноким, но свободным © $me





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 28 декабря 2008 18:07 · Поправил: coderess
· Личное сообщение · #2

Создай окно как Popup, например в Visual C++, я просто у диалога меняю свойство Style
и окно не двигается. Сейчас в Delphi посмотрел если убрать все галочки с BorderIcons и
выставить в свойстве BorderStyle=bsNone, то окно не двигается.

EnableWindow( hWnd, FALSE );


P.S: Опередили


Также можно создать с помощью CreateWindow(Ex) с флагом WS_DISABLED или же послать его

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 28 декабря 2008 18:12
· Личное сообщение · #3

EnableWindow




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 28 декабря 2008 18:29
· Личное сообщение · #4

мне нужно чтобы окно могло получать фокус

-----
Лучше быть одиноким, но свободным © $me





Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 28 декабря 2008 19:45
· Личное сообщение · #5

borov пишет:
В програме есть окно которое не должно двигатся, т.е. при попытке перетащить его мышкой

Попробуй захватить мышь через SetCapture

-----
Программист SkyNet





Ранг: 271.6 (наставник), 2thx
Активность: 0.30
Статус: Участник

Создано: 28 декабря 2008 21:07
· Личное сообщение · #6

borov
А если так:
WM_MOUSEHOVER:
If Form.Top<>xxx and Form.Left<>yyy...

-----
iNTERNATiONAL CoDE CReW




Ранг: 51.5 (постоянный), 16thx
Активность: 0.040.01
Статус: Участник

Создано: 28 декабря 2008 21:47
· Личное сообщение · #7

в ВБ у формы есть свойство Moveable, ставим в фолс и окно нормально получает фокус но не перемещается.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 28 декабря 2008 21:50 · Поправил: progopis
· Личное сообщение · #8

mushr00m
Молодец. Только у топикстартера Delphi. И тема называется "...(API)".

borov пишет:
мне нужно чтобы окно могло получать фокус

По-моему никак. Только если суперкласс сделать, и то не факт. Тут ещё двигать динамически предлагают - жесть, но тоже вариант. Вообще можно ещё заголовок у окна вынести - такую форму двигать не получится...

Добавлено:

mushr00m
Ты издеваешься? Ещё раз прошу обратить твое внимание на название темы - API!!!!!

Spirit пишет:
как это?

не делать его




Ранг: 271.6 (наставник), 2thx
Активность: 0.30
Статус: Участник

Создано: 28 декабря 2008 21:54
· Личное сообщение · #9

progopis пишет:
Только у топикстартера Delphi

Возможно и асм...
progopis пишет:
Вообще можно ещё заголовок у окна вынести - такую форму двигать не получится

Как это?

-----
iNTERNATiONAL CoDE CReW




Ранг: 51.5 (постоянный), 16thx
Активность: 0.040.01
Статус: Участник

Создано: 28 декабря 2008 22:00
· Личное сообщение · #10

progopis пишет:
Только у топикстартера Delphi.

ну я не вижу где у него это написано!
но раз уж так и есть то можно попробовать это:
www.google.ru/search?hl=ru&q=non+Moveable+form+delphi+API&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&aq=f&oq=




Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 28 декабря 2008 22:08
· Личное сообщение · #11

Spirit пишет:
Как это?

Видимо, без стиля окна WS_CAPTION. Тогда если не включить его придительное перетаскивание (например, через обработчик события WM_LBUTTONDOWN), то окно будет "висеть".

-----
Программист SkyNet




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 28 декабря 2008 22:12 · Поправил: progopis
· Личное сообщение · #12

FrenFolio
+1
А если всё-таки надо дать возможность его перетаскивания, то сделать этот самый обработчик. В нём уже решать - двигать или не двигать. Реализация такого на масме у меня есть.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 28 декабря 2008 22:53
· Личное сообщение · #13

progopis, давай посмотрю
А вобще на Delphi, но можно и на другом, главное чтобы реализация была на API

-----
Лучше быть одиноким, но свободным © $me




Ранг: 38.2 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 28 декабря 2008 23:02
· Личное сообщение · #14

Функция окна должна перехватывать сообщения WM_SIZE, WM_MOVE, WM_SIZING, WM_MOVING, а может и другие, и не посылать их далее на DefWindowProc. Если это диалог без DefWindowProc (стандартный), то придется ставить хук и перехватывать эти сообщения или запоминать свое положение и при изменении его вызывать MoveWindow. Так мне кажется. Только это не все. Делать это надо когда окно определилось со своим положением, приняла его за приемлемое для удержания, т.е. - делать это черз некоторое время после создания окна.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 28 декабря 2008 23:43 · Поправил: borov
· Личное сообщение · #15

mushr00m, спасибо за ссылку в гугл, нашел то что нужно.

Вот моя реализация на API(кому интересно):
Code:
  1. WM_WINDOWPOSCHANGING:
  2.   begin
  3.     PWindowPos(lParam)^.:= RectMain.Left + 207;
  4.     PWindowPos(lParam)^.:= RectMain.Top + 83;
  5.   end;


-----
Лучше быть одиноким, но свободным © $me





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 06 января 2009 17:00
· Личное сообщение · #16

Кто знает как при нажатии на кнопку сворачивания окна(либо посылки окну сообщения свернутся) окно ни как не реагировало на это сообщение(кнопка свернуть активна и видна)

-----
Лучше быть одиноким, но свободным © $me




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 06 января 2009 17:08 · Поправил: HandMill
· Личное сообщение · #17

borov SW_MINIMIZE ?

простейшее:
case SW_MINIMIZE:
{
ShowWindow(hwnd,SW_SHOWNORMAL);
}break;
дальше - в глубь копни насчёт обработки этого сообщения и пропатчи процедуру (ух какое сука зверство xD).

-----
все багрепорты - в личные сообщения





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 06 января 2009 17:17 · Поправил: borov
· Личное сообщение · #18

то что в ShowWindow используется это я знаю, но как его отловить, какой это параметр и какого сообщения?

-----
Лучше быть одиноким, но свободным © $me




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 января 2009 18:05
· Личное сообщение · #19

borov

if(msg == WM_SHOWWINDOW && !lParam)

?



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 07 января 2009 00:43
· Личное сообщение · #20

Если на чистом WinAPI, то правильно подсказали насчет DefWindowProc.
Ещё там есть разница, по выходу из сообственной оконной процедуры возвращать системе 0 или нет: Result := 0;
Таким образом можно сделать, что окно будет висеть на идном месте и перестанет реагировать на сообщения минимизации, закрытия (по крестику), передвигания и т.п.
Оконную процедуру надо копать.

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 07 января 2009 00:50
· Личное сообщение · #21

borov
А при перемещении основного окна, это окно должно двигаться с ним или тоже на месте оставаться???
Я просто идею никак не уловлю, зачем это?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 07 января 2009 01:17
· Личное сообщение · #22

Isaev пишет:
А при перемещении основного окна, это окно должно двигаться с ним

Как бы да:borov пишет:
WM_WINDOWPOSCHANGING:
begin
PWindowPos(lParam)^.x := RectMain.Left + 207;
PWindowPos(lParam)^.y := RectMain.Top + 83;
end;


Isaev пишет:
Я просто идею никак не уловлю, зачем это?

это для проги которая напоминает редактор/конструкор диалогов, и мне нужно чтобы окошко которое какбы создается выглядело как полнофункциональное окно но не реагировало ни начто, я сделал чтобы не реагировало на закрытие окна, но на минимизацию не знаю как.

-----
Лучше быть одиноким, но свободным © $me




Ранг: 63.8 (постоянный), 2thx
Активность: 0.030
Статус: Участник

Создано: 07 января 2009 12:07 · Поправил: drin
· Личное сообщение · #23

перехватывать WM_NCHITTEST и возвращать всегда HTCLIENT


Code:
  1.   TForm1 = class(TForm)
  2.   private
  3.     { Private declarations }
  4.   public
  5.     procedure WMNCHITTEST(var Message : TMessage); message WM_NCHITTEST;
  6.   end;
  7. var
  8.   Form1: TForm1;
  9. implementation
  10. procedure TForm1.WMNCHITTEST(var Message: TMessage);
  11. begin
  12.   Message.Result := HTCLIENT;
  13. end;



единственный минус - кнопки на caption будут не нажимаемыми



Ранг: 17.7 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 января 2009 16:22
· Личное сообщение · #24

Ха, я это помню! Да, жестоко мне тогда пришлось) Щас я тебе исходник выложу)



Ранг: 17.7 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 января 2009 16:58 · Поправил: zombiee
· Личное сообщение · #25

Держи) Я там пару комментов поставил, посмотришь)))
Если что-то не так пойдёт, отпишись)
Компилятор: Dev-C++ [mingv (он же gcc)]
Написано на чистом апи)))

f018_13.01.2009_CRACKLAB.rU.tgz - ArtPass.rar




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 13 января 2009 17:40
· Личное сообщение · #26

zombiee, у меня при компиляции выдает такую ошибку: D:\...\ArtPass\Makefile.win [Build Error] ["Art] Error 1

-----
Лучше быть одиноким, но свободным © $me




Ранг: 17.7 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 января 2009 17:55
· Личное сообщение · #27

to borov:
Стукани в асю, осудим точнее, тут флудить не стоит)



Ранг: 17.7 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 января 2009 18:01
· Личное сообщение · #28

Хм... Даж не заю, чё это) по ходу, он библиотеки найти не может) кинь папку ArtPass в C:\Dev-Cpp\proj\ (Путь до файла проекта должен быть C:\Dev-Cpp\proj\ArtPass\Art Pass.dev)
и попробуй скомпилить)



Ранг: 17.7 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 января 2009 18:07 · Поправил: zombiee
· Личное сообщение · #29

Всё, нашёл голюк) Это из-за относительных путей. Клацай Ctrl+P, вкладка Параметры (4-ая) и в компонировщик впиши это:
Code:
  1. ПУТЬ_ДО_ПАПКИ_ДЕВА\lib\libcomctl32.a

Только сотри сперва
Code:
  1. ../../lib/libcomctl32.a

и будет тебе счастье)
З.Ы: ПУТЬ_ДО_ПАПКИ_ДЕВА - путь до папки компиля) например, C:\Dev-C++\ (у меня)
А у тебя он по ходу D:\Dev-C++\




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 13 января 2009 19:04
· Личное сообщение · #30

все исправил, и вправду все проблемы были из-за того что нужно было путя поменять с относительного на прямой, но это я уже сделал, вот так это будет выглядеть на сях:
Code:
  1. case WM_WINDOWPOSCHANGING:
  2.   PWINDOWPOS(lParam)->= Rect->left;
  3.   PWINDOWPOS(lParam)->= Rect->top;
  4.   break;


в даный момент меня интересует другое: borov пишет:
мне нужно чтобы окошко выглядело как полнофункциональное окно, но не реагировало на минимизацию


-----
Лучше быть одиноким, но свободным © $me



. 1 . 2 . >>
 eXeL@B —› Программирование —› Как заставить форму не двигатся? (API)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати