STOP! NO MOVE
От: Similex  
Дата: 30.05.03 11:02
Оценка: -1
Как сделать MDI приложение не перетаскиваемым????????
Нет ничего не возможного
Re: STOP! NO MOVE
От: Similex  
Дата: 30.05.03 11:05
Оценка:
Здравствуйте, Similex, Вы писали:

S>Как сделать MDI приложение не перетаскиваемым????????

И еще чтобы не развертывалось и не свертывалось при нажатии при двойном клике, WS_MAXIMIZEBOX — это стиль я уже поставил.
Нет ничего не возможного
Re[2]: STOP! NO MOVE
От: Tolanay Россия  
Дата: 30.05.03 12:21
Оценка:
Здравствуйте, Similex, Вы писали:

S>Здравствуйте, Similex, Вы писали:


S>>Как сделать MDI приложение не перетаскиваемым????????

S>И еще чтобы не развертывалось и не свертывалось при нажатии при двойном клике, WS_MAXIMIZEBOX — это стиль я уже поставил.

Переопределить обработчики родителского класса.
Re: STOP! NO MOVE
От: Serguei666 Беларусь  
Дата: 30.05.03 12:52
Оценка:
Здравствуйте, Similex, Вы писали:

S>Как сделать MDI приложение не перетаскиваемым????????

А зачем?
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[3]: STOP! NO MOVE
От: Similex  
Дата: 30.05.03 12:53
Оценка:
Здравствуйте, Tolanay, Вы писали:

T>Здравствуйте, Similex, Вы писали:


S>>Здравствуйте, Similex, Вы писали:


S>>>Как сделать MDI приложение не перетаскиваемым????????

S>>И еще чтобы не развертывалось и не свертывалось при нажатии при двойном клике, WS_MAXIMIZEBOX — это стиль я уже поставил.

T>Переопределить обработчики родителского класса.


О да, это круто!!! Только вот как его определить — не знаю И Это тоже круто...

Я нашел как это сделать:

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) 
{
    if(nID!=61730 && nID!=61458 && nID!=61456)
        CFrameWnd::OnSysCommand(nID, lParam);
}



и делов то...
Нет ничего не возможного
Re[2]: STOP! NO MOVE
От: Similex  
Дата: 30.05.03 12:56
Оценка:
Здравствуйте, Serguei666, Вы писали:

S>Здравствуйте, Similex, Вы писали:


S>>Как сделать MDI приложение не перетаскиваемым????????

S>А зачем?

Секрет — военная тайна!!!
Ну серьезно глупый вопрос, если знаешь на него ответ — я прогу пишу такую
Нет ничего не возможного
Re[4]: STOP! NO MOVE
От: Willi  
Дата: 30.05.03 13:06
Оценка:
Здравствуйте, Similex, Вы писали:

T>>Переопределить обработчики родителского класса.


S>О да, это круто!!!


Полегче на поворотах, человек ведь помочь хочет.

S>Я нашел как это сделать:


Кул!
Только вот Minimize, Maximize по прежнему работают.
\/\/i||i
Re: STOP! NO MOVE
От: SeriousSam Россия null
Дата: 30.05.03 13:09
Оценка:
Здравствуйте, Similex, Вы писали:

S>Как сделать MDI приложение не перетаскиваемым????????




Pereopredelyaew' obrabot4iki soobweniy WM_MOVE i WM_SIZE
Re[2]: STOP! NO MOVE
От: Similex  
Дата: 30.05.03 14:12
Оценка: -5
Здравствуйте, SeriousSam, Вы писали:

SS>Здравствуйте, Similex, Вы писали:


S>>Как сделать MDI приложение не перетаскиваемым????????




SS>Pereopredelyaew' obrabot4iki soobweniy WM_MOVE i WM_SIZE


Ауу... проснулся... ну молодец. Только ты сам нифига толком не написал как это сделать — "Иди туда незная куда". Да и ответ я уже написал. Для тебя отвечу еще раз — это нужно делать так, вернее можно сделать так:


void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) 
{
    if(nID!=61730 && nID!=61458 && nID!=61456)
        CFrameWnd::OnSysCommand(nID, lParam);
}
Нет ничего не возможного
Re[4]: STOP! NO MOVE
От: Vadim B  
Дата: 31.05.03 00:06
Оценка:
Здравствуйте, Similex, Вы писали:

S>Я нашел как это сделать:


S>
S>void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) 
S>{
S>    if(nID!=61730 && nID!=61458 && nID!=61456)
S>        CFrameWnd::OnSysCommand(nID, lParam);
S>}
S>


S>и делов то...


Вот только есть несколько проблем:

1) Соответствующие пункты меню остались активными, что дезинформирует пользователя — нехорошо. Нужно сделать что-нибудь типа
void CMyWindow::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
{
    parent_class::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
    pPopupMenu->EnableMenuItem(SC_MOVE, MF_GRAYED|MF_BYCOMMAND);
}



2) Окно все равно можно перетащить на новое место, если сначала потянуть за левый верхний край, поместить угол окна, куда надо, а потом потянуть за правый нижний и восстановить размер. Если уж хочешь сделать NO MOVE, то придется сделать и NO SIZE, иначе смысл теряется.

3) Полностью это проблему все равно не решает — у пользователя остается способ подвинуть твое окно. Пойди в task bar (там, где системная кнопка Start находится), щелкни правой кнопкой мыши, выбери в меню Cascade Windows (или Tile Windows...) и любуйся результатом
Re[3]: STOP! NO MOVE
От: Serguei666 Беларусь  
Дата: 31.05.03 10:51
Оценка: 2 (1)
Здравствуйте, Similex, Вы писали:

S>>>Как сделать MDI приложение не перетаскиваемым????????

S>>А зачем?

S>Секрет — военная тайна!!!

S>Ну серьезно глупый вопрос, если знаешь на него ответ — я прогу пишу такую
Не вижу ничего глупого. Если у главного окна вашей программы есть caption, то вы не должны запрещать перетаскивание. А хотите запретить — уберите caption.
А иметь caption, за который нельзя перетасвкивать — вот это и есть глупость. Что, вы думаете, пользователь подумает, если вашe окно не перетаскивается за caption?
Я бы думал примерно так:
1. "Кнопка у мышки, что ли, сломалась? От, блин, еще на хватало. Мышка же 60 баксов стоит"
2. "Нет, мышка в порядке, другие программы отлично перетаскиваются"
3. "Так че, программа зависла, что ли? От, блин, пИсатели. Ну ее на хер"
4. Ctrl-Alt-Del -> "End task".
И заняло бы все это у меня не более 3х секунд. Вы именно для этого прогу свою пишете? Чтобы ее быстренько по Ctrl-Alt-Del снимали и больше никогда ее не запускали?
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[5]: STOP! NO MOVE
От: Similex  
Дата: 31.05.03 11:35
Оценка:
Здравствуйте, Vadim B, Вы писали:

VB>Здравствуйте, Similex, Вы писали:


S>>Я нашел как это сделать:


S>>
S>>void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) 
S>>{
S>>    if(nID!=61730 && nID!=61458 && nID!=61456)
S>>        CFrameWnd::OnSysCommand(nID, lParam);
S>>}
S>>


S>>и делов то...


VB>Вот только есть несколько проблем:


VB>1) Соответствующие пункты меню остались активными, что дезинформирует пользователя — нехорошо. Нужно сделать что-нибудь типа

VB>
VB>void CMyWindow::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
VB>{
VB>    parent_class::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
VB>    pPopupMenu->EnableMenuItem(SC_MOVE, MF_GRAYED|MF_BYCOMMAND);
VB>}
VB>


а что и нужно было если хочешь отключить вообще одиночный клик просто допиши пару цифр помимо 61458 .... проблема решена.


VB>2) Окно все равно можно перетащить на новое место, если сначала потянуть за левый верхний край, поместить угол окна, куда надо, а потом потянуть за правый нижний и восстановить размер. Если уж хочешь сделать NO MOVE, то придется сделать и NO SIZE, иначе смысл теряется.


да-да-да на счет этого вы уважаемый правы просто как то не заметил, NO_MOVE я сделал в PreCreateWindow — флаг WS_THICKFRAME. проблема тоже решена.

VB>3) Полностью это проблему все равно не решает — у пользователя остается способ подвинуть твое окно. Пойди в task bar (там, где системная кнопка Start находится), щелкни правой кнопкой мыши, выбери в меню Cascade Windows (или Tile Windows...) и любуйся результатом


а вот сдесь.... Да эта проблема остается. Только как ее решить кто-нить знает?????
Нет ничего не возможного
Re[4]: STOP! NO MOVE
От: Similex  
Дата: 31.05.03 11:43
Оценка: -3
Здравствуйте, Serguei666, Вы писали:

S>Здравствуйте, Similex, Вы писали:


S>>>>Как сделать MDI приложение не перетаскиваемым????????

S>>>А зачем?

S>>Секрет — военная тайна!!!

S>>Ну серьезно глупый вопрос, если знаешь на него ответ — я прогу пишу такую
S>Не вижу ничего глупого. Если у главного окна вашей программы есть caption, то вы не должны запрещать перетаскивание. А хотите запретить — уберите caption.
S>А иметь caption, за который нельзя перетасвкивать — вот это и есть глупость. Что, вы думаете, пользователь подумает, если вашe окно не перетаскивается за caption?
S>Я бы думал примерно так:
S>1. "Кнопка у мышки, что ли, сломалась? От, блин, еще на хватало. Мышка же 60 баксов стоит"
S>2. "Нет, мышка в порядке, другие программы отлично перетаскиваются"
S>3. "Так че, программа зависла, что ли? От, блин, пИсатели. Ну ее на хер"
S>4. Ctrl-Alt-Del -> "End task".
S>И заняло бы все это у меня не более 3х секунд. Вы именно для этого прогу свою пишете? Чтобы ее быстренько по Ctrl-Alt-Del снимали и больше никогда ее не запускали?

нет-нет и нет. Вы как всегда не правы. есть и такой вариант что мне нужно только отключить "развертывание" и все а остальный все функции пашут, а ну да и еще у меня прога на весь экран так вот чтобы она и дальше была на весь то мне нужно еще реализовать и неподвижность окна и размер окна.
А пользователь не дурак его любимая кнопка "х" а она у меня работает так что я ничего не говорил о caption'e, да и зепретить перетаскивание можно сделать не только убрав caption и вообще "сори" за "глупый вопрос" — нервы.
Нет ничего не возможного
Re[5]: STOP! NO MOVE
От: Serguei666 Беларусь  
Дата: 31.05.03 12:59
Оценка:
Здравствуйте, Similex, Вы писали:

S>нет-нет и нет. Вы как всегда не правы.

Неужели всегда неправ?

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

"На весь экран" — это как "FullScreen" в Visual 6? Так там caption и не виден будет, пользователь не сможет за него тягать, и рамка не видна будет — пользователь не сможет менять размер. И режим можно заканчиваеть при любой попытке пользователя менять размер/двигать. Visual, например, по нажатию на Esc из FullScreen режима выходит.
Кстати — в Visual 6 есть небольшая ошибка — в режиме FullScreen они забыли обработать событие "пользователь поменял разрешение экрана". Если будете делать FullScreen — не забудьте это событие обработать.

S>А пользователь не дурак его любимая кнопка "х" а она у меня работает так что я ничего не говорил о caption'e, да и зепретить перетаскивание можно сделать не только убрав caption и вообще "сори" за "глупый вопрос" — нервы.


Так у вас так написано "Как сделать MDI приложение НЕ ПЕРЕТАСКИВАЕМЫМ". Отсюда непонимание с моей стороны.
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[6]: STOP! NO MOVE
От: Vadim B  
Дата: 01.06.03 00:03
Оценка: 16 (2)
Здравствуйте, Similex, Вы писали:


VB>>Вот только есть несколько проблем:


VB>>1) Соответствующие пункты меню остались активными, что дезинформирует пользователя — нехорошо. Нужно сделать что-нибудь типа

VB>>
VB>>void CMyWindow::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
VB>>{
VB>>    parent_class::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
VB>>    pPopupMenu->EnableMenuItem(SC_MOVE, MF_GRAYED|MF_BYCOMMAND);
VB>>}
VB>>


S>а что и нужно было если хочешь отключить вообще одиночный клик просто допиши пару цифр помимо 61458 .... проблема решена.


Дело не в отключении режима. Дело в том, что пользователю надо показать, что режим неактивен (disable), для чего стандартно необходимо сделать соответствующий пункт меню серым.


VB>>3) Полностью это проблему все равно не решает — у пользователя остается способ подвинуть твое окно. Пойди в task bar (там, где системная кнопка Start находится), щелкни правой кнопкой мыши, выбери в меню Cascade Windows (или Tile Windows...) и любуйся результатом


S>а вот сдесь.... Да эта проблема остается. Только как ее решить кто-нить знает?????


Ну, если уж очень хочется, то правильным образом твою проблему нужно решать так:

void CMainFrame::OnMoving(UINT fwSide, LPRECT pRect) 
{
    CFrameWnd::OnMoving(fwSide, pRect);
    
    pRect->top = 20;
    pRect->bottom = 220;
    pRect->left = 50;
    pRect->right = 550;

}

void CMainFrame::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
{
    CFrameWnd::OnWindowPosChanging(lpwndpos);
    
    lpwndpos->x = 50;
    lpwndpos->y = 20;
    lpwndpos->cx = 500;
    lpwndpos->cy = 200;
}

void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) 
{
    CFrameWnd::OnSizing(fwSide, pRect);
    
    pRect->top = 20;
    pRect->bottom = 220;
    pRect->left = 50;
    pRect->right = 550;
    
}

Этот способ лучше твоего
1) тем, что работает всегда, в том числе в случае Cascade из task bar или если кто-то напишет программку, которая будет твоему окну SetWindowPos делать,
2) тем, что при попытке потянуть за окно рисуется стандартная рамочка
3) большей гибкостью (например, если завтра захочется разрешить менять размер, но не положение левого верхнего угла, то этим способом оно делается элементарно).
Re[3]: STOP! NO MOVE
От: IT Россия linq2db.com
Дата: 01.06.03 00:27
Оценка: 2 (2)
Здравствуйте, Similex, Вы писали:

S>Ауу... проснулся... ну молодец.


Similex, будет на много лучше, если ты сменишь свой тон с ламерского гона на профессиональное общение. То что ты сам додумался до тривиальных вещей — это ты конечно молодец, но никто тут тебе ничего разжёвывать не обязан. Если после полученных ответов у тебя всё равно остались вопросы, то потрудись их задавать в вежливой форме. Если есть что самому сказать другим, то делай это так, чтобы тебе ставил положительные оценки, а не минусы.
Если нам не помогут, то мы тоже никого не пощадим.
Re: STOP! NO MOVE
От: Vitaton Россия  
Дата: 02.06.03 07:28
Оценка: 3 (1)
Здравствуйте, Similex, Вы писали:

S>Как сделать MDI приложение не перетаскиваемым????????


Это очень не красиво изменять поведение таким образом для окон в MDI приложении.
С точки зрения пользовательского интерфейса это выглядит ошибкой проектирования.

Рекомендую подумать еще раз прежде, чем реализовывать подобное решение. Может стоит использовать другие типы окон (модальные, моделлес и т.д.).

Ну если уж совсем-совсем задача требует (детали мне не известны), но все равно...выглядит это решение крайне не приглядно...
Useless lamer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.