Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.25;
Скачать: CL | DM;

Вниз

Плоское окно & меню   Найти похожие ветки 

 
toaster ©   (2005-05-30 14:51) [0]

Как сделать форму плоской? Т.е. нужно убрать 3d-рамку.
Такой код не работает:

procedure TMainForm.CreateParams (var Params : TCreatePatams);
begin
inherited;
Params.Style := WS_CAPTION + WS_POPUP + WS_VISIBLE;
Params.ExStyle := 0;
end;

У окна всё равно есть 3Д-рамка.
Заголовок обязательно должен остаться, поэтому bsNone не подходит.
И еще: как полностью перерисовывать popup- и main-меню? Там та же проблема с 3Д-рамкой, которую не нужно рисовать.
Заранее благодарен.


 
DVM ©   (2005-05-30 15:10) [1]


> Заголовок обязательно должен остаться, поэтому bsNone не
> подходит.

Рамка и заголовок рисуются вместе. Точнее заголовок расположен на рамке. Бывает окно с рамкой без заголовка, но заголовок без рамки - вряд ли.
Вывод - делать свою иммитацию заголовка.


 
toaster ©   (2005-05-30 15:21) [2]

Имитация загловка не подходит, т.к mainmenu в таком случае будет выше заголовка.


 
DVM ©   (2005-05-30 15:22) [3]


> т.к mainmenu в таком случае будет выше заголовка.

Да ну? Смотря как иммитировать.:)


 
DVM ©   (2005-05-30 15:41) [4]


> toaster ©   (30.05.05 15:21) [2]

Когда окну приходит WM_NCCALCSIZE можно задать любой размер неклиентской области окна - меню останется внутри клиентской, а на неклиентской рисуй заголовок.


 
toaster ©   (2005-05-30 15:49) [5]

А можно про это поподробнее?
В MSDN как-то непонятно написано, не могли бы вы небольшой примерчик подкинуть?


 
Игорь Шевченко ©   (2005-05-30 15:55) [6]

DVM ©   (30.05.05 15:41) [4]

Вроде как меню (которое menubar) тоже относится к неклиентской области.


 
alpet ©   (2005-05-30 16:01) [7]

Перехвати WM_NCPAINT сообщение, не трогая стили и рисуй рамку как тебе нужно.


 
DVM ©   (2005-05-30 16:18) [8]


> Игорь Шевченко ©   (30.05.05 15:55) [6]
> DVM ©   (30.05.05 15:41) [4]
>
> Вроде как меню (которое menubar) тоже относится к неклиентской
> области.

Может быть и так, проверить надо.

> toaster ©   (30.05.05 15:49) [5]
> А можно про это поподробнее?

http://www.firststeps.ru/mfc/winapi/win/r.php?141


 
toaster ©   (2005-05-30 16:18) [9]

> alpet
Мне рамка не нужна совсем. Я так полагаю, в настройках системы сей параметр можно выставить любым, также как и размер заголовка. Мне надо, чтобы окно программы при любых настройках системы выглядело так, как я задумал. Конечно, можно самому все контролы, рамку, меню рисовать, но писать всё это слишком долго.
Кроме того, хотелось бы узнать, как это делать правильно с точки зрения корректности поведения окна (хочется, чтобы вело себя стандартным образом, но рисовалось так, как мне надо).

А насчёт меню может подскажет кто? Как НЕ рисовать его 3Д-рамку?
Через MeasureItem/OwnerDraw можно самому нарисовать всё, кроме рамки.
В JEDI-VCL есть компоненты TJvMainMenu & TJvPopupMenu, но они рисуют только определённый набор стилей (Standard, XP, etc). Более того, со стилем XP все менюшки плоские => это можно сделать  без полного написания замены менюшек. Хотя кто знает, как это в jvcl сделано... Хотя похоже на то, что это стандартное меню с собственной перерисовкой.


 
DVM ©   (2005-05-30 16:20) [10]


> alpet ©   (30.05.05 16:01) [7]
> Перехвати WM_NCPAINT сообщение, не трогая стили и рисуй
> рамку как тебе нужно.

Если он не будет трогать стили рамка у окна все равно будет.


 
DVM ©   (2005-05-30 16:22) [11]


> А насчёт меню может подскажет кто? Как НЕ рисовать его 3Д-рамку?

Забей, я пытался долго сделать - невозможно это. Особенно во всяких XP.
TJvMainMenu & TJvPopupMenu тоже подглючивают при перерисовке рамки так же как и у меня.


 
alpet ©   (2005-05-30 16:24) [12]

DVM ©   (30.05.05 16:20) [10]
Вообще то не будет, хотя для этого возможно придется стиль класса окна регулировать. Только вот перерисовка неклиенской области окна дело очень и очень туманное, и в MSDN отображено не совсем верно, так что лучше за нее и не браться, а  на самом деле поискать более легкие пути.


 
DVM ©   (2005-05-30 16:26) [13]


> Только вот перерисовка неклиенской области окна дело очень
> и очень туманное

это точно


 
Игорь Шевченко ©   (2005-05-30 16:26) [14]


> А насчёт меню может подскажет кто? Как НЕ рисовать его 3Д-рамку?


Использовать свои оконные классы, как, например, в MS Office или в Developer Express (Express Bars), та самая имитация меню.


 
toaster ©   (2005-05-30 16:27) [15]

> DVM
За ссылку спасибо, но дословно перевести статью из MSDN я и сам мог.
Для меня остался неясным смысл этой статьи. Мне не понятно, к примеру, как указать системе, что рамка у моего окна должна быть шириной 0 пикселей, заголовок - 10 пикселей.
Насчёт примера: я его просил, надеясь на то, что по счастливому стечению обстоятельств вам приходилось решать похожую задачу, вам не будет жалко поделиться рабочим кодом и вам не будет жалко потратить немного своего свободного времени, чтобы менее опытный прграммист быстрее с этим разобрался. Если же нет - буду сам разбираться, MSDN читать обучен.


 
Игорь Шевченко ©   (2005-05-30 16:30) [16]

DVM ©   (30.05.05 16:18) [8]

А что там проверять, создаешь окно с меню, обводишь рамкой клиентскую область окна.

unit main;

interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Menus;

type
 TForm1 = class(TForm)
   MainMenu1: TMainMenu;
   File1: TMenuItem;
   Exit1: TMenuItem;
   procedure FormPaint(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormPaint(Sender: TObject);
begin
 Canvas.Brush.Color := RGB(255,0, 0);
 Canvas.FrameRect (ClientRect);
end;

end.


 
toaster ©   (2005-05-30 16:34) [17]

У меня голова уже кругом идёт. В одном месте говорят, что это сделать можно и надо, здесь мне говроят, что это слишком сложно, и лучше за это не браться..
Хотя я видел несколько программ, где менюшки были в XP-cтиле, вроде нигде не глючили (Iintranet Chat, там даже тень от меню сделана).
В Trillian"e весь интерфейс похож на стандартный по поведению, но выглядит интереснее. Хотя, как я понял, он весь самодельный.
Всем спасибо, у меня вопросов больше нет..
Буду эксперементировать c WM_NC***...


 
Игорь Шевченко ©   (2005-05-30 16:39) [18]

toaster ©   (30.05.05 16:34) [17]

Сделать можно, но сложно.



Страницы: 1 вся ветка

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.051 c
1-1120577831
Alex77777
2005-07-05 19:37
2005.07.25
Как читать файлы xml


14-1119592535
Игорь Шевченко
2005-06-24 09:55
2005.07.25
Юрий Зотов, с днем рождения!


14-1120124105
stone
2005-06-30 13:35
2005.07.25
Hello, World. На разных языках


14-1119856274
Holy
2005-06-27 11:11
2005.07.25
Athlon 64


1-1120549448
Бу
2005-07-05 11:44
2005.07.25
проблема С Drawgrid