Конференция "WinAPI" » Проблема с WM_NCLBUTTONDBLCLK
 
  • dubdaze (23.04.12 11:53) [0]
    Всем привет. Помогите решить проблему. Имеется MDI-приложение. MDI формы оформлены так, что нету системных кнопок в меню и заголовке (не спрашивать зачем, так надо). При этом я хочу сохранить возможность сворачивать и разворачивать их. Для этого я отлавливаю двойной щелчок по заголовку MDI-формы через WndProc.

    procedure WndProc(var Msg: TMessage);
    var
     i: Integer;
    begin
     inherited;
     if (Msg.Msg=WM_NCLBUTTONDBLCLK) and (Msg.WParam=htCaption) then
     begin
       case Self.WindowState of
         wsNormal: ShowWindow(Self.WindowHandle, SW_MINIMIZE);
         wsMinimized: ShowWindow(Self.WindowHandle, SW_MINIMIZE);
       end;
     end;
    end;

    Проблема в том, что форма сворачивается в значок, но в ответ на повторный двойной щелчок по заголовку свёрнутой формы  она не разворачивается, а прога намертво виснет. Почему? Я взломал сервер пентагона?
  • CRLF (23.04.12 12:02) [1]

    > wsMinimized: ShowWindow(Self.WindowHandle, SW_MINIMIZE);
    Выглядит как минимум странно
  • dubdaze (23.04.12 12:06) [2]
    case Self.WindowState of
         wsNormal: Self.WindowState:=wsMinimized;
         wsMinimized: Self.WindowState:=wsNormal;
       end;

    Так менее странно? Можешь предложить что-то другое?
  • Юрий Зотов © (23.04.12 13:55) [3]
    При двойном щелчке по заголовку свернутой формы:

    - если отладчик в эту процедуру заходит, то протрассировать
    - если нет, то значит, идет не то сообщение.
  • dubdaze (23.04.12 15:31) [4]

    > - если нет, то значит, идет не то сообщение


    Но сворачивается-то форма нормально. Проблема с разворачиванием
  • Cobalt © (23.04.12 15:56) [5]
    а с исправленным
    wsMinimized: Self.WindowState:=wsNormal;


    тоже виснет?
  • dubdaze (23.04.12 18:28) [6]
    Да, без разницы. Был ещё и другой вариант. Думал, что после внесения изменения окно отсылало сообщение, которое перехватывалось моим и, соответственно, меняло состояние на обратное. Для того, чтобы "развести" эти события пробовал делать так:

    var
     i:integer;
    begin
    case Self.WindowState of
      wsNormal: i:=0;
      wsMinimized: i:=1;
    end;
    case i of
      0: Self.WindowState:=wsMinimized;
      1: Self.WindowState:=wsNormal;
    end;
    end;

    Без разницы, любыми способами окно вешается при попытке его развернуть. Но если использовать ShowWindow, но отсылать сообщения из другой программы, то всё ок, и сворачивается, и разворачивается.
  • Cobalt © (23.04.12 21:14) [7]
    добавь отладку - пиши OutputDebugString с состоянием переменных, и увидишь где входишь в цикл, и на что неправильно реагируешь.
 
Конференция "WinAPI" » Проблема с WM_NCLBUTTONDBLCLK
Есть новые Нет новых   [134463   +60][b:0][p:0.001]