как скрыть заголовок дочернего окна

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем muaddib1981, 10 янв 2008.

  1. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    требуется скрыть заголовок дочернего окна, просто Child->BorderStyle=bsNone; не помогает.
    нашел как делается под Делфи:
    Код (Text):
    type
    TForm2 = class(TForm)
    { другой код выше }
    procedure CreateParams(var Params: TCreateParams); override;
    { другой код ниже }
    end;

    procedure TForm2.CreateParams(var Params: TCreateParams);
    begin
    inherited CreateParams(Params);
    Params.Style := Params.Style and (not WS_CAPTION);
    end;

    попробовал переписать под Си так:

    class TMDIChild : public TForm
    {
    // другой код выше
    private:
    void CreateParams(TCreateParams *Params);
    // другой код ниже
    };

    void TMDIChild::CreateParams(TCreateParams *Params)
    {
    inherited CreateParams(Params);
    Params->Style = Params->Style& (!WS_CAPTION);
    };
    ругается на слово inherited, если его убрать то ничего не работает, чем его заменить в С++ не знаю.
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Рискну предположить, что так:
    Код (Text):
    void TMDIChild::CreateParams(TCreateParams *Params)
    {
    TForm::CreateParams(Params);
    Params->Style ^= WS_CAPTION;
    };
    Для: muaddib
    Вот еще для тебя ссылочку нашел
     
  3. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    проверил, не работает
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Не работает или не компилируется?
     
  5. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    компилируется но эффекта никакого
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    А так?
    Код (Text):
    Params->Style &= ~WS_CAPTION;
     
  7. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    тоже, может быть дело не только в этом в чем-то еще?
     
  8. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-muaddib+10:01:2008, 13:41 -->
    <span class="vbquote">(muaddib @ 10:01:2008, 13:41 )</span><!--QuoteEBegin-->тоже, может быть дело не только в этом в чем-то еще?
    [snapback]92890" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Я слишком давно использовал Билдер, чтобы ответить на этот вопрос.
     
  9. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    появляются ошибки:

    Build
    [C++ Error] ChildWin.cpp(37): E2356 Type mismatch in redeclaration of '_fastcall TMDIChild::CreateParams(TCreateParams &)'
    [C++ Error] ChildWin.h(26): E2344 Earlier declaration of '_fastcall TMDIChild::CreateParams(TCreateParams &)'

    если без __fastcall, то ошибка одна и другая:

    Build
    [C++ Error] ChildWin.h(26): E2113 Virtual function 'TMDIChild::CreateParams(TCreateParams &)' conflicts with base class 'TCustomForm'
     
  10. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: sax_ol
    А разница?
    Для: muaddib
    Попробуй вместо WS_CAPTION поставить WS_VISIBLE. В этом случае окно должно стать не видимым.
    Насколько я помню, в TCreateParams есть HWND окна, тогда стиль можно изменить при помощи АПИ-шной функции SetWindowLong
     
  11. gamecreator

    gamecreator Гость

    попробуй флаг WS_POPUP
     
  12. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    использую Borland Builder C++ 6.0

    ни WS_VISIBLE, ни WS_POPUP никак себя не проявили, ничего не изменилось, значит дело не в флагах
     
  13. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    помучившись, получилось итак код должен быть следующий:

    Код (Text):
    class TMDIChild : public TForm
    {
    __published:
    //другой код выше
    void __fastcall FormCreate(TObject *Sender);
    private:

    public:
    virtual void __fastcall CreateParams(TCreateParams &Params);       
    //другой код ниже
    };

    void __fastcall TMDIChild::CreateParams(TCreateParams &Params)
    {
    TForm::CreateParams(Params);
    Params.Style ^= WS_CAPTION;
    };

    void __fastcall TMDIChild::FormCreate(TObject *Sender)
    {
    ClientHeight=100;
    ClientWidth=100;
    BorderStyle=bsNone;
    }
    дочернее окно создается без заголовка, но его можно растягивать, я думал bsNone уже включает себя запрет на растягивание окна? Как это можно запретить?
     
  14. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    Код (Text):
    void __fastcall TMDIChild::CreateParams(TCreateParams &Params)
    {
    TForm::CreateParams(Params);
    Params.Style ^= WS_CAPTION;
    Params.Style ^= WS_BORDER;
    Params.Style ^= WS_POPUP;
    };
    Этот код не работает. При заходе в функцию вылетает с ошибкой:

    Project mdiapp.exe raised exception class EOSError with message 'System Error. Code: 1411. Класс не существует'. Proccess stopped. Use Step or Run to continue.

    Если убрать WS_POPUP то работает, но окно все равно растягивается. Может не те флажки, а вообще какие существуют флажки, где можно о них почитать, может ссылку дадите.

    по поводу предыдущих ошибок, не там ставил __fastcall и в аргументе ставил указатель, с указателем без __fastcall была одна ошибка.
     
  15. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    Этот код тоже не работает:

    Код (Text):
    void __fastcall TMDIChild::CreateParams(TCreateParams &Params)
    {
    TForm::CreateParams(Params);
    Params.Style ^= WS_CAPTION;
    Params.Style ^= WS_BORDER;
    Params.Style |= WS_POPUP;
    };
    нашел в справке следующее

    WS_CHILD - Создает дочернее окно. Этот стиль не может использоваться со стилем WS_POPUP.

    WS_POPUP - Создает выскакивающее окно. Этот стиль не может использоваться со стилем WS_CHILD.

    Добавил следующее

    Код (Text):
    void __fastcall TMDIChild::CreateParams(TCreateParams &Params)
    {
    TForm::CreateParams(Params);
    Params.Style ^= WS_CAPTION;
    Params.Style ^= WS_BORDER;
    Params.Style ^= WS_THICKFRAME;
    };

    все заработало, всем спасибо, кто старался мне помочь.
     
  16. muaddib1981

    muaddib1981 Member

    Регистрация:
    10 янв 2008
    Сообщения:
    8
    Симпатии:
    0
    странно, очень странно
     
Загрузка...

Поделиться этой страницей