Конференция "KOL" » Как создать окно с нужными стилями [Delphi, Windows]
 
  • CBR919RR © (14.02.12 19:08) [0]
    Делаю так

     MainForm := NewForm(Applet, 'To');
     MainForm.ClsStyle := WS_CAPTION and WS_VISIBLE and WS_SYSMENU and WS_CLIPSIBLINGS and WS_CLIPCHILDREN and WS_THICKFRAME and WS_OVERLAPPED;
    //  MainForm.Style := WS_CAPTION and WS_VISIBLE and WS_SYSMENU and WS_CLIPSIBLINGS and WS_CLIPCHILDREN and WS_THICKFRAME and WS_OVERLAPPED;
     MainForm.CreateWindow;

    Получаются не те стили которые задал
  • RusSun © (14.02.12 20:09) [1]
    MainForm.ClsStyle

    ???
    MainForm.Style

    и форма? нет заголовка, не видима, нет меню, и тд и что долно быть?
  • RusSun © (14.02.12 20:09) [2]
    MainForm.ClsStyle

    ???
    MainForm.Style

    и форма? нет заголовка, не видима, нет меню, и тд и что долно быть?
  • CBR919RR © (14.02.12 20:30) [3]
    Applet := NewApplet('ПФР ля ля ля ');
     MainForm := NewForm(Applet, 'Заголовок');
     MainForm.ClsStyle := WS_CAPTION and WS_VISIBLE and WS_SYSMENU and WS_CLIPSIBLINGS and WS_CLIPCHILDREN and WS_THICKFRAME and WS_OVERLAPPED;
    //  MainForm.Style := WS_CAPTION and WS_VISIBLE and WS_SYSMENU and WS_CLIPSIBLINGS and WS_CLIPCHILDREN and WS_THICKFRAME and WS_OVERLAPPED;
     MainForm.CreateWindow;

     MainForm.Show;

     Run(Applet);

     Applet.Free;

    А что еще какой заголовок надо Заголовок есть    MainForm := NewForm(Applet, 'Заголовок');

    Мне нужен стиль как в VCL Form1.BorderStyle := bsToolWindow;
    Ну а вообще как самому стилями управлять.
  • Vladimir Kladov © (14.02.12 21:38) [4]
    ClsStyle присваивается в момент создания хэндла, если что. Т.е. если хэндл уже успел создаться, то его уже менять нет смысла.

    Кажется, AND делает нечто другое, и нужен все-таки OR.

    Не все сочетания Style и ExStyle осмысленны. Надо смотреть их хекс-значения, и какие биты устанавливаются в каких случаях.
  • Grademax (15.02.12 06:07) [5]
    Константы основных стилей:
    WS_BORDER - окно будет иметь тонкую рамку;
    WS_CAPTION - окно будет иметь заголовок;
    WS_CHILD или WS_CHILDWINDOW - окно будет дочерним, то есть целиком располагаться внутри некоторого другого окна;
    WS_CLIPCHILDREN - площадь занимаемая дочерними окнами не будет перерисовываться;
    WS_CLIPSIBLINGS - перерисовка одного дочернего окна не влияет на другие;
    WS_DISABLED - окно создается недоступным, его можно разблокировать при помощи функции EnableWindow;
    WS_DLGFRAME - создается окно с рамкой как у диалоговых окон;
    WS_GROUP - для дочернего окна (со стилем WS_CHILD) определяет первый элемент в группе, при нажатии на Tab именно он получит фокус, группа простирается до следующего дочернего окна с тем же стилем, внутри группы можно перемещаться при помощи клавиш управления курсором;
    WS_HSCROLL - создается окно с горизонтальной полосой прокрутки;
    WS_ICONIC или WS_MINIMIZE - создаваемое окно изначально минимизировано;
    WS_MAXIMIZE - создаваемое окно изначально максимизировано;
    WS_MAXIMIZEBOX - создаваемое окно имеет кнопку максимизации;
    WS_MINIMIZEBOX - создаваемое окно имеет кнопку минимизации;
    WS_OVERLAPPED - создается перекрывающееся окно, имеет заголовок и рамку;
    WS_OVERLAPPEDWINDOW - комбинация флагов WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX;
    WS_POPUP - создается окно не имеющее изначально рамки и заголовка, не может использоваться со стилем WS_CHILD;
    WS_SIZEBOX или WS_THICKFRAME - создается окно, размер которого можно изменять;
    WS_SYSMENU - создается окно со значком системного меню, должен употребляться с флагом WS_CAPTION;
    WS_TABSTOP - создается дочернее окно, которое может получать фокус ввода при нажатии на Tab;
    WS_TILEDWINDOW - комбинация флагов WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX;
    WS_VISIBLE - создается окно, которое изначально видимо. Если вы не укажете это флаг для окна, то вы его никогда не увидите (если только не воспользуетесь функцией ShowWindow);
    WS_VSCROLL - создаваемое окно будет иметь вертикальную полосу прокрутки;
    X - горизонтальная координата верхнего левого угла окна; если вы хотите предоставить windows возможность расположить окно по умолчанию, укажите здесь CW_USEDEFAULT, в этом случае следующий параметр игнорируется;
    Y - вертикальная координата верхнего левого угла окна.

    Константы расширенных стилей:

    WS_EX_ACCEPTFILES - определяет, что окно, созданное с этим стилем принимает файлы информационной технологии "перетащи и вставь" (drag-and-drop), посылается сообщение WM_DROPFILES;
    WS_EX_APPWINDOW - на панели задач для окна с таким стилем появляется кнопка;
    WS_EX_CLIENTEDGE - вокруг клиентской части будет рамка, причем клиентская часть будет вдавлена внутрь;
    WS_EX_CONTEXTHELP - в заголовке окна появится кнопка контекстной помощи, это флаг не может использоваться одновременно с WS_MAXIMIZEBOX и WS_MINIMIZEBOX;
    WS_EX_TOOLWINDOW - создается окно с маленьким заголовком, как у панели инструментов;
    WS_EX_TOPMOST - создаваемое окно будет находиться поверх остальных;
    WS_EX_CONTROLPARENT - позволяет пользователю перемещаться по дочерним окнам родительского окна, используя клавишу табуляции TAB;
    WS_EX_DLGMODALFRAME - cоздает окно с двойной рамкой. В отличие от стиля WS_DLGFRAME, прикладная программа может также определять стиль WS_CAPTION, чтобы создать область заголовка для окна;
    WS_EX_LEFT - окно будет имеет общеупотребительные свойства "выравнивания по левой границе";
    WS_EX_LEFTSCROLLBAR - если язык оболочки Еврейский, Арабский или другой язык, который придерживается иного порядка чтения, вертикальная линейка прокрутки (если появляется) - слева от рабочей области. Для других языков, этот стиль игнорируется и не обрабатывается как ошибка;
    WS_EX_LTRREADING - текст в окне отображается используя свойство порядка чтения Слева - Направо. Это - по умолчанию;
    WS_EX_MDICHILD - cоздает MDI дочернее окно;
    WS_EX_NOPARENTNOTIFY - определяет, что дочернее окно, созданное с этим стилем не посылает сообщение WM_PARENTNOTIFY родительскому окну, когда оно создается или разрушается;
    WS_EX_OVERLAPPEDWINDOW - объединяет стили WS_EX_CLIENTEDGE и WS_EX_WINDOWEDGE;
    WS_EX_PALETTEWINDOW - объединяет стили WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW и WS_EX_TOPMOST;
    WS_EX_RIGHT - окно имеет общеупотребительные свойства "выравнивание по правому краю". Оно зависит от класса окна. Этот стиль имеет эффект только тогда, если язык оболочек Еврейский, Арабский или другой язык, который поддерживает иной порядок выравнивания для чтения; иначе, стиль игнорируется и не обрабатывается как ошибка;
    WS_EX_RIGHTSCROLLBAR - вертикальная линейка прокрутки (если появляется) - справа от рабочей области. Это - по умолчанию;
    WS_EX_RTLREADING - если язык оболочки Еврейский, Арабский или другой язык, который придерживается иного порядка выравнивания для чтения, текст в окне отображается, используя свойства порядка чтения, Справа - Налево. Для других языков, стиль игнорируется и не обрабатывается как ошибка;
    WS_EX_STATICEDGE - создает окно с трехмерным стилем рамки, предполагается использовать для элементов, которые не принимают вводимую информацию от пользователя;
    WS_EX_TRANSPARENT - определяет, что окно, созданное с этим стилем должно быть прозрачным. То есть любые окна, которые появляются из-под окна, не затеняются им. Окно, созданное с этим стилем принимает WM_PAINT сообщения только после того, как все сестринские окна под ним модифицировались;
    WS_EX_WINDOWEDGE - Определяет, что окно имеет рамку с выпуклым краем
    WS_EX_NOINHERITLAYOUT - окно, созданное с этим стилем не передает свою компоновку своим дочерним окнам.

    Примеры использования стилей:

    W.Style := W.Style and not (WS_MAXIMIZEBOX);
    У окна присутствует заголовок и кнопки [Свернуть], [Развернуть на весь экран] - кнопка неактивна, [Закрыть];

    W.Style := W.Style and not (WS_MAXIMIZEBOX) and not (WS_MINIMIZEBOX);
    У окна присутствует заголовок и кнопка [Закрыть]. Это окно отображается на панели задач;

    W.Style := W.Style and not WS_TILEDWINDOW;
    Окно без заголовка иконки и упровляющих кнопок. Закрыть его можно комбинацией Alt+F4;

    W.ExStyle := WS_EX_TOOLWINDOW;
    У окна зауженный заголовок и кнопка [Закрыть]. В заголовке окна отсутствует иконка. Это окно не отображается на панели задач и в трее.

    W.ExStyle := WS_EX_LAYERED;
    Применение этого стиля создает полностью невидимое окно. О его присутствии можно судить только по отображению на панели задач. Закрыть окно можно из панели задач (правый клик по иконке, затем выбрать - Закрыть окно).


    uses windows, KOL;
    var W:PControl;
    {----------------------------------------------------------------------}
    begin
        W := NewForm( Applet, 'MiniForm' ).SetClientSize( 400, 300 );
        W.CenterOnParent;
         
        W.Style :=   // ..... Сюда можно вставить константы основных стилей
        W.ExStyle := // ..... Сюда можно вставить константы расширенных стилей
         
        Run( W );
    end.

  • CBR919RR © (15.02.12 12:24) [6]
    Написал на С++ WinApi приложение для тестирования. Действительно виндовс назначает стили окну черт пойми как, из списка выбирает то, что ей нравится.
    Проблема оказалась не в KOL.
    Если заводить стили в  MainForm.ClsStyle то они вообще не действуют
    если в MainForm.Style действуют
    стили заданные MainForm.ExStyle действуют и отменяют стили заданные в MainForm.Style.
    Спасибо Grademax за примеры использования стилей. Хотя есть книга саймона Windows200api что-то копал не в ту сторону.
    А то задаю стиль, смотрю через Spy++ стили созданного окна, они совсем не те которые задал.


    > W.ExStyle := WS_EX_TOOLWINDOW;
    > У окна зауженный заголовок и кнопка [Закрыть]. В заголовке
    > окна отсутствует иконка. Это окно не отображается на панели
    > задач и в трее.


    Оказался похож на тот который был нужен. И он игорирует то что указано в Style.
  • G-Host © (22.02.12 01:05) [7]
    Вообще-то ExStyle не отменяет, а дополняет свойство Style.
    Они потом передаются при создании окна функцией CreateWindowEx.
    Почитать про нее подробнее можно на MSDN.
  • QAZ (22.02.12 11:00) [8]

    > Написал на С++ WinApi приложение для тестирования. Действительно
    > виндовс назначает стили окну черт пойми как, из списка выбирает
    > то, что ей нравится.

    а может проблемма не в с++,делфи и винде,а в тебе?
  • rdnks (22.02.12 11:39) [9]
    по всей видимости товарищ QAZ хотел поддержать Владимира в том, что все свойства в win api (и не только) комбинируются логическим ИЛИ (or) а не И (and). И при использовании второго нет ничего удивительного в том что свойства задаются абы как. А в общем RTFM про биты (или флаги).
 
Конференция "KOL" » Как создать окно с нужными стилями [Delphi, Windows]
Есть новые Нет новых   [134427   +35][b:0][p:0.001]