Сейчас на форуме: 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




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

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

borov
При минимизации по-моему также срабатывает WM_WINDOWPOSCHANGING, при этом left, top, width и height у окна становятся равными 0



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

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

Блин, люди, смотрите мой исходник! Специально же писал:
При нажатии на окне (в любом месте) идёт отправка сообщения WM_NCLBUTTONDOWN, соответственно, в wParam находятся данные, где юзер нажал:

HTCAPTION - нажали на заголовке
HTSYSMENU - опять же на заголовке, но уже сюда и кнопки входят
HTGROWBOX - по моему, при нажатии на иконку или отключённую кнопку
HTSIZE - изменение размера
HTMENU - область меню
HTHSCROLL - скролл бар
HTVSCROLL - тоже скролл
HTMINBUTTON - кнопка минимизации
HTMAXBUTTON - максимизации
HTREDUCE - О_о хз
HTZOOM - О_о
HTLEFT - О_о
HTSIZEFIRST - начало ресайзинга
HTRIGHT - О_о
HTTOP
HTTOPLEFT
HTTOPRIGHT
HTBOTTOM
HTBOTTOMLEFT
HTBOTTOMRIGHT
HTSIZELAST
HTBORDER
HTOBJECT
HTCLOSE - кнопка закрытия
HTHELP

Короче, чё я апи переписываю, найдёте)
так вот, для перехвата этих данных нужно сделать:
в WndProc (или как там у вас, функция обработки мессаг окна) пишем:
Code:
  1.     case WM_NCLBUTTONDOWN:
  2.       if(wparam==HTCAPTION){return HTCLIENT;} // если юзер нажал на заголовке, отвечаем, что форточки ошиблись при вычеслениях и там якобы клиентская часть)
  3.       else if(wparam==HTMINBUTTON){return HTCLOSE;} // Просто ради прикола, нажмите на конпку минимизации и у вас загорится кнопка закрытия))
  4.       return DefWindowProc(hwnd, msg, wparam, lparam); // просто передаём дальше, пусть форточки сами разбираются)
  5.       break;





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

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

to tihiy_grom:
А ты поробуй нормально перерисовать окно при WM_WINDOWPOSCHANGING без глюков!
Или это я не выспался, или я прав)



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

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

Так... узнал интересную весч)))
Если удалить пункт переместить из системного меню:
Code:
  1. HMENU SysMenu;
  2. SysMenu=GetSystemMenu(hwnd, false);
  3. DeleteMenu(SysMenu, SC_MOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

то окно тоже двигаццо не будет
Мда, форточки - восьмое чудо света)))



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

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

to borov:
Code:
  1.     case WM_NCLBUTTONDOWN:
  2.       return HTERROR;
  3.       break;
  4. <i class=x>Добавлено:</i>
  5.     case WM_NCRBUTTONDOWN:
  6.       return HTERROR;
  7.       break;

Я ответил на твой вопрос? Окно будет окном, но реагиравать не будет ни на что.

Добавлено:
Вот так будет лучше) не реагирует вообще)




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

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

zombiee пишет:
HTREDUCE - О_о хз

между прочем тоже кнопка минимизации

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

zombiee пишет:
if(wparam==HTMINBUTTON){return HTCLOSE;} // Просто ради прикола, нажмите на конпку минимизации и у вас загорится кнопка закрытия))

у меня ничего не произошло

но дело в том что я б хотел чтобы кнопка нажималась, но ничего не происходило

а вот вариант тихого_грома я щас попробую

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




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

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

to borov:
borov пишет:
между прочем тоже кнопка минимизации

я уже пропарсил и всё понял) щас я выложу кое-что)



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

Создано: 13 января 2009 21:29
· Личное сообщение · #9

Блин, чёт никак... Перехватываю WM_NCLBUTTONUP, но почему-то оно не перехватывается О_о.
Кроч, в ок. функции добовляю кейс с WM_NCLBUTTONUP, но он пропускается, а WM_NCLBUTTONDOWN нормально отлавливает. У кого какие догадки?




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

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

tihiy_grom пишет:
При минимизации по-моему также срабатывает WM_WINDOWPOSCHANGING

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

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




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

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

WM_NCLBUTTONUP срабатывает только если окно максимилизированно О_о



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

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

Code:
  1.     case SW_MINIMIZE:
  2.       ShowWindow(hwnd, SW_RESTORE);
  3.       return 0;
  4.       break;

В принципе, пашет, но это сообщение передаётся только после того, как окно свернулось на таск бар...



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

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

НАШЁЛ!!!!!!!!!!!!
Code:
  1.     case WM_SYSCOMMAND:
  2.       return 0;
  3.       break;

Клацай, не клацай - ничего не произойдёт, но кнопки будут "нажиматься"!!!!!
Я крут



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

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

to borov:
Думаю, тема себя исчерпала) клосед?)



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

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

Code:
  1.     case WM_SYSCOMMAND:
  2.       if(wparam==61587){
  3.         POINT pt;
  4.         GetCursorPos(&pt);
  5.         TrackPopupMenu(GetSystemMenu(hwnd, false), TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0, hwnd, NULL);
  6.       }
  7.       return 0;
  8.       break;

Вот полный код для того, что тебе нужно) А вывод системного меню приходится брать на себя, что я и сделал)




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

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

zombiee пишет:
вывод системного меню приходится брать на себя

ненужно

Code:
  1. case WM_SYSCOMMAND:
  2.   if (wParam == SC_CLOSE || 
  3.       wParam == SC_MINIMIZE || 
  4.       wParam == SC_MAXIMIZE || 
  5.       wParam == SC_ZOOM || 
  6.       wParam == SC_ICON)
  7.       return 0;
  8.   else
  9.       return DefWindowProc (hwnd, message, wParam, lParam);
  10.   break;


и все нормально будет

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




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

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

to borov:
Можно и так)




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 14 января 2009 16:23
· Личное сообщение · #18

Не ляпайте вы по 4 поста подряд, есть же волшебная кнопка Правка. Стоит отлучиться ненадолго и уже...


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


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