Форум: "Основная";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
ВнизПрозрачно-серый фон Найти похожие ветки
← →
L.eXX (2002-03-24 21:26) [0]Привет, Мастера! Очень интересует такой вопрос: как сделать чтобы весь экран за моей формой стал позрачно-серым и чтобы можно было работать только с моей формой, которая всегда должна быть активна (и плюс чтобы никаких заставок, Alt+Tab и Ctrl+Alt+Del).
То есть как сделать такую штуку, как в win98, когда нажимаешь "Пуск -> Завершение работы" ?
← →
Song (2002-03-24 21:35) [1]Такая штука делается рисованием на канвасе десктопа путём or"а с числом (каким не помню) каждой точки.
← →
L.eXX (2002-03-25 00:48) [2]хм... я посмотрел - в этой "сетке" точки идут через одну, со сдвигом влево на каждых второй строке и втором столбце:
# # # # # #
# # # # # #
# # # # # # #
# # # # # #
написал такую штуку:
procedure TForm1.Button1Click(Sender: TObject);
var
hdcDesk: THandle;
Brush: TBrush;
i,j: Word;
x,y: Word;
begin
hdcDesk:=GetWindowDC(GetDesktopWindow);
Brush:=TBrush.Create;
Brush.Color:=clBlack;
SelectObject(hdcDesk,Brush.Handle);
y:=0;
for i:=0 to 768 do begin // 768
if Odd(i) then x:=0 else x:=1;
for j:=0 to (1024 div 2) do begin // а почему, кстати, достаточно 512 ?
Rectangle(hdcDesk,x,y,x+1,y+1);
x:=x+1+1;
end;
y:=y+1;
end;
ReleaseDC(hdcDesk,GetDesktopWindow);
Brush.Free;
end;
только вот... наверно Rectangl"ы рисовать не очень хорошо :) а как точечку-то одну нарисовать? а то ведь наверняка из-за них и медленно заливается (1024х768 за 4 секунды)
и что за метод рисования or"а с числом?
← →
Nikolay M. (2002-03-25 14:20) [3]Ну ты и почесался с этими Brush-ами... Тем более под НТ 4 не прокатило.
Вот так не пробовал?
hdcDesk := GetWindowDC (GetDesktopWindow);
for i := 0 to 768 do
for j := 0 to (1024 div 2) do
begin
MoveToEx (hdcDesk, j * 2 + (i mod 2), i, nil);
LineTo (hdcDesk, j * 2 + 1, i);
end;
ReleaseDC (hdcDesk, GetDesktopWindow);
Конечно, быстрее будет создавать скрытый DC, рисовать в нем и копировать в GetDesktopWindow... Если опять будет проблема с быстродействием - пиши, заморочусь.
← →
L.eXX (2002-03-25 19:32) [4]Хм, это вроде даже почти на секунду быстрей получается :)
Однако этот код рисует простую сетку. Я пытался в предыдущем сообщении показать что мне нужно, однако пробелы почему-то поисчезали ;)
Пиксели в сетке расположены как на шахматной доске чёрные клетки! Вот. И чего-то я не очень соображу, чего тут надо поменять...
Да, проблема с быстродействием осталась :( Нужен скрытый DC... И наверно нужно также будет в ещё один скрытый DC копировать изображение desktop"а до сетки. Ну чтобы потом, когда сетку уже убирать надо...
← →
Shaman_Naydak (2002-03-25 20:30) [5]Могу порекомендовать следующее (очень быстро):
сделать монохромный bitmap 8x8, в котором нарисовать точечки как треба.
Этот Bitmap -> brush,
ну и залить все rectangle(0,0,Width,Height)
Когда надо восстановить будет экран
InvalidateRect(0, nil, True);
И все + никаких гвоздей,
Ну а нажатия клавиш - тему поднимали неоднократно
← →
L.eXX (2002-03-26 02:30) [6]Shaman_Naydak:
м... суперская скорость!!! :)
Я сделал так:
procedure TForm1.FormCreate(Sender: TObject);
var
hdcDesk: THandle;
Brush: TBrush;
begin
hdcDesk:=GetWindowDC(GetDesktopWindow);
Brush:=TBrush.Create;
Brush.Bitmap:=TBitmap.Create;
Brush.Bitmap.LoadfromFile("8x8.bmp"); // "шахматная доска" 8x8, 2 бита цветов
Brush.Bitmap.TransparentColor:=clWhite;
Brush.Bitmap.TransparentMode:=tmFixed;
Brush.Bitmap.Transparent:=True;
SelectObject(hdcDesk,Brush.Handle);
Rectangle(hdcDesk,0,0,Screen.Width,Screen.Height);
ReleaseDC(hdcDesk,GetDesktopWindow);
Brush.Bitmap.Free;
Brush.Free;
end;
Всё рисуется, всё быстро, всё здорово. Только опять проблема: сетка какая-то непрозрачная получилась!! :( В чём же дело? Я вроде в свойствах указал...
← →
L.eXX (2002-03-30 01:04) [7]И всё-таки: как же сделать сетку прозрачной (чтоб сковзь неё был виден десктоп)? Почему она по хорошему не хочет? (
Brush.Bitmap.Transparent:=True
)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c