Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как отследить нажим и отпуск кнопки закрытия окна.

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я пытаюсь самостоятельно отрисовать кнопку закрытия. Но есть проблема. Я никак не могу найти какое событие посылается, когда я нажимаю кнопку и какое когда отпускаю. WM_NCHITTEST не дает такой инфы. Что делать ?

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 06:27 16-09-2003
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Перекрываешь PreTranslateMessage:
virtual BOOL PreTranslateMessage( MSG* pMsg );
 
Что-то типа этого:
bool CChildFrame::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message == WM_SYSCOMMAND && pMsg->wParam == SC_CLOSE)
    {
         //делаёшь своё тёмное дело...  
         return true;
    }
    return CFrameWnd::PreTranslateMessage(pMsg);
}

Но это спорт жестокий  
 
Или как советуют в MSDN:
// CChildFrame is a CMDIChildWnd-derived class.
void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
    if(nID == SC_CLOSE)
        return;
    CMDIChildWnd::OnSysCommand(nID, lParam);
}

 
Добавлено
А если главное окно - то CMainFrame вместо CChildFrame

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 07:24 16-09-2003 | Исправлено: BugFixer, 07:33 16-09-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Или как советуют в MSDN:  
// CChildFrame is a CMDIChildWnd-derived class.  
void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam)  
{  
    if(nID == SC_CLOSE)  
        return;  
    CMDIChildWnd::OnSysCommand(nID, lParam);  
}  

 
Что то у меня это событие не проходит. Я нажимаю на кнопку Х и ничего.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 06:31 17-09-2003
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam)  
{  
    if(nID == SC_CLOSE)  
    {
        //Вот тут и делаешь то, что тебе надо!
        return;  
    }
    CMDIChildWnd::OnSysCommand(nID, lParam);  
}

 
А если просто return, то вывалится, ничего не сделав (в т.ч. и не закрыв окно)
 
Опять же, return можно и не делать.  
 

Цитата:
void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam)  
{  
    if(nID == SC_CLOSE)  
    {
        //Нарисовали нечто на экране, изобразили взрыв окна и т.д.
    }
    //А теперь отдали управление системе, она делает что считает нужным
    CMDIChildWnd::OnSysCommand(nID, lParam);  
}


Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 12:32 17-09-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BugFixer

Цитата:
 //Нарисовали нечто на экране, изобразили взрыв окна и т.д.  

То ли я не так объясняю то ли ты не понял . Мне не надо ничего рисовать на экране. Мне надо, отследить когда пользователь нажимает на кнопку закрытия, чтобы самому ее отрисовать и когда он ее отпускает, чтобы так же отрисовать свою кнопку закрытия. А твой пример это нечто другое. Я в принципе нашел нечто нужное мне это WM_NCLBUTTONDOWN там в качестве параметра (вроде бы lParam) выдает где она нажата, но вот там есть HTSIZE и другие нужные вещи, а вот что типа HTCLOSE нет. Может кто знает а то пришлось самому в контексте заголовка отрисовывать и обрабатыть все события. Не очень трудно, но хочется чтобы как у мелкософта. чтобы я только отлавливал это событие и по своему его переопределял.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:00 18-09-2003
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Мне надо, отследить когда пользователь нажимает на кнопку закрытия, чтобы самому ее отрисовать и когда он ее отпускает, чтобы так же отрисовать свою кнопку закрытия.  

Хорошо.
Есть в MFC (с другими давно не общался, извини) такая пара:
CWnd::OnNcLButtonDown  и CWnd::OnNcLButtonUp
 
Как видно из названия, первая случается при нажатии LButton, вторая - при отжатии.
CWnd::OnNcLButtonDown  
afx_msg void OnNcLButtonDown( UINT nHitTest, CPoint point );
 
Parameters
 
nHitTest
 
Specifies the hit-test code. A hit test is a test that determines the location of the cursor.
 
point
Specifies a CPoint object that contains the x and y screen coordinates of the cursor position. These coordinates are always relative to the upper-left corner of the screen.
 
Remarks
 
The framework calls this member function when the user presses the left mouse button while the cursor is within a nonclient area of the CWnd object.

 
Нам во всей этой песне интересен UINT nHitTest, а именно значение  
HTSYSMENU   In a Control menu or in a Close button in a child window.
 
С OnNcLButtonUp аналогично.

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 15:20 18-09-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
HTSYSMENU   In a Control menu or in a Close button in a child window.  

Я пробовал это но что то ничего не получилось. Ладно потом как нибудь разберусь. Если у кого то это получилось покажите как. У меня какие то грабли были.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 07:15 19-09-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все получилось. Я смог отрисовать стандартную кнопку закрытия самостоятельно. Там просто немного по другому сравнивать надо wParam c hittestvalue. Если кому надо кусок кода могу выложить.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 06:08 22-09-2003
miki1975



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt
Если код на С++ или MFC то положи - сейчас смотрю схожую проблему.

Всего записей: 37 | Зарегистр. 14-08-2003 | Отправлено: 23:58 23-09-2003 | Исправлено: miki1975, 00:04 24-09-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
miki1975
Держи только это Дельфи но читое АПИ
там часть моих переменных.
    WM_NCLBUTTONDOWN, WM_NCLBUTTONDBLCLK:
      begin
      if (wParam and HTSYSMENU)=0 then begin
          ClosePressed:=True;
          NeedDraw:=False;
          SendMessage(hWnd,WM_NCPAINT,0,-1);
        end else begin
          if NOT NeedDraw then SendMessage(hWnd,WM_NCPAINT,0,-2);
          ClosePressed:=False;
          Result:=False;
         end;
      end;
    WM_NCMOUSEMOVE:
      begin
      if (wParam and HTSYSMENU)<>0 then begin
          if NOT NeedDraw then SendMessage(hWnd,WM_NCPAINT,0,-2);
          Result:=False;
         end
      else if ClosePressed and NeedDraw then begin
          SendMessage(hWnd,WM_NCPAINT,0,-1);
          Result:=False;
       end;
      end;
    WM_NCLBUTTONUP:
      begin
      if (wParam and HTSYSMENU)=0 then begin
          SendMessage(hWnd,WM_NCPAINT,0,-2);
          if ClosePressed then PostMessage(hWnd,WM_CLOSE,0,0);
        end else begin
          SendMessage(hWnd,WM_NCPAINT,0,-2);
          ClosePressed:=False;
          Result:=False;
         end;
      end;
 
при посылке WM_NCPAINT я в качестве lParam передаю номер состояния кнопки для отрисовки. -1 отпущена -2 нажата. Если что не понятно пиши. Но учти это не отрисовка новых кнопок о просто переотрисовка стандртных. Свои кнопки я рисовал еще года два назад. Это не интересно.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:06 24-09-2003
Nilivaiko

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Большое спасибо, очень помогло для написания своей лабы

Всего записей: 5 | Зарегистр. 21-11-2007 | Отправлено: 00:50 21-11-2007
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как отследить нажим и отпуск кнопки закрытия окна.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru