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

Вниз

Подскажите можно ли создать окно произвольной формы?   Найти похожие ветки 

 
Tayfun   (2003-06-17 16:49) [0]

Можно ли с помощью BMP файла создать окно произвольной формы?


 
PaRL.   (2003-06-17 16:55) [1]

Нельзя. Но монжно покопаться в faq и посмотреть.


 
Spawn   (2003-06-17 17:31) [2]

Можно)


 
Spawn   (2003-06-17 17:35) [3]

Как создать непрямоугольную форму

Дело в том, что задать внешний вид формы можно, вызвав всего лишь одну функцию SetWindowsRgn.


--------------------------------------------------------------------------------
SetWindowsRgn(Form1.Handle, True);
--------------------------------------------------------------------------------

Документация утверждает, что регион, это "прямоугольник, многоугольник, эллипс или комбинация двух или более фигур из приведённого списка". Регионы используются для "заливки, отсечения (то, что по английски называется clipping)" и других, не менее полезных операций.

Для создания регионов существуют такие функции (с очевидным назначением), как CreateRectRgn, CreateEllipticRgn, CreatePolygonRgn и несколько других. Объединять регионы между собой можно при помощи функции CombineRgn.


--------------------------------------------------------------------------------
function BitmapToRegion(Bitmap: TBitmap; TransColor: TColor): HRGN;
var
X, Y: Integer;
XStart: Integer;
begin
Result := 0;
with Bitmap do
for Y := 0 to Height - 1 do
begin
X := 0;
while X < Width do
begin
// Пропускаем прозрачные точки
while (X < Width) and (Canvas.Pixels[X, Y] = TransColor) do
Inc(X);
if X >= Width then
Break;
XStart := X;
// Пропускаем непрозрачные точки
while (X < Width) and (Canvas.Pixels[X, Y] <> TransColor) do
Inc(X);
// Создаём новый прямоугольный регион и добавляем его к
// региону всей картинки
if Result = 0 then
Result := CreateRectRgn(XStart, Y, X, Y + 1)
else
CombineRgn(Result, Result,
CreateRectRgn(XStart, Y, X, Y + 1), RGN_OR);
end;
end;
end;
Этот способ работает, конечно, небыстро, но он работает.


--------------------------------------------------------------------------------
type
TFormMain = class(TForm)
private
{ Private declarations }
procedure WMLButtonDown(var Msg: TMessage); message WM_LBUTTONDOWN;
public
{ Public declarations }
end;

procedure TFormMain.WMLButtonDown(var Msg: TMessage);
begin
Perform(WM_NCLBUTTONDOWN, HTCAPTION, Msg.LParam);
end;

--------------------------------------------------------------------------------
Форма посылает самой себе сообщение WM_NCLBUTTONDOWN с wParam равным HTCAPTION, то есть эмулирует ситуацию, когда пользователь нажимает левую кнопку мыши на заголовке формы.


 
Spawn   (2003-06-17 18:30) [4]

Точнее говоря SetWindowRgn вызывается так:
SetWindowRgn(Handle,HRGN,True);



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

Форум: "Основная";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
1-97678
SiJack
2003-06-16 14:15
2003.06.30
Как вызвать справку в MessageBox ?


3-97481
Antoxa1
2003-06-05 03:51
2003.06.30
Подскажите, пожалуйста, как получить имена и типы полей БД Access


3-97472
Silver_
2003-06-04 11:52
2003.06.30
UPDATE ... SELECT...


11-97557
guru
2002-10-13 14:52
2003.06.30
Полный мануал по установке KOL и MCK


9-97469
Michael Makushev
2003-01-08 13:45
2003.06.30
DelphiX - развивается?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский