Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.016 c
4-1117215084
sofs
2005-05-27 21:31
2005.07.25
Порты


4-1117287880
zeroo
2005-05-28 17:44
2005.07.25
Как отловить нажатие клавиши TAB


14-1120140519
_dimka
2005-06-30 18:08
2005.07.25
Вопрос по транзакциям в IB


4-1117126030
ancara
2005-05-26 20:47
2005.07.25
USB HID


1-1120560658
Apachi
2005-07-05 14:50
2005.07.25
Как программно раскрыть LookupComboBox???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский