С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848

Preview для screensaver`a

11.10.2012, 22:24. Показов 3641. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.

При открытии в Windows окна настроек заставки, система запускает программу-заставку, передавая ей два параметра:
/P - указывает, что программа вызывается в режиме предварительного просмотра,
и шестизначное число - хендл (HWND) окна, куда нужно передать изображение превью.

Помогите, пожалуйста, отправить превью своей программы (пусть для примера это будет простая форма) в окно предварительного просмотра. Примера, в котором смог бы разобраться, в интернете не нашёл.

И так, я имею:
C++
1
2
3
HWND PreviewWindow = HWND (StrToInt(ParamStr(2)));  //хендл окна предварительного просмотра
LPRECT R;
GetWindowRect(PreviewWindow, R);  //область этого окна
ну и класс формы, экземпляр которой хочу отправить в превью - TF_Main

Что делать дальше - не знаю...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.10.2012, 22:24
Ответы с готовыми решениями:

Плагин preview для Joomla 3.0
Доброго времени суток! Ищу плагин для preview изображений. Нашел только информацию по Mavik Thumbnails и Peter van Westen , я так понял...

Windows 10 Technical Preview доступна для скачивания
Как и было обещано на прошедшем мероприятии с предварительным анонсом Windows 10, публичная ранняя сборка (Technical Preview) новой версии...

Доступна для загрузки Microsoft Windows 8 Developer Preview
В Центре разработчика Windows стала доступна для загрузки Windows 8 Developer Preview. Загрузка доступна в трех вариантах - Windows 8 x32,...

20
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
14.10.2012, 12:22  [ТС]
Господа форумчане, помогите, пожалуйста. Без вас не справлюсь.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
14.10.2012, 13:07
Посмотрел примеры написания сэйверов... По хэндлу окна там берется DC и идет уже просто отрисовка на нем. Почему бы не копировать канву формы таким же макаром, просто перерисовывая ее в новое место?
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
14.10.2012, 13:59  [ТС]
Друг пытался мне помочь, набросал такой код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
if (ParamStr(1).UpperCase() == "/P")
{    
    HWND PreviewWindow = HWND (StrToInt(ParamStr(2)));  //хендл окна, где нужно отрисовать превью
    LPRECT R;
    GetWindowRect(PreviewWindow, R);  //область этого окна 
    HDC dc = GetDC(PreviewWindow);  //девайс контекст
    TF_Main *F_Main = new TF_Main(NULL);  //форма, изображение которой хочу отправить на превью
    F_Main->Visible = false;
    TCanvas* cv = new TCanvas();
    cv->Handle = dc;
    cv->StretchDraw(*R, F_Main->Canvas->Brush->Bitmap);
}
Но к сожалению это не работает...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
14.10.2012, 14:58
А чего, F_Main->PaintTo(dc, 0, 0) совсем никак нельзя обойтись?
2
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
14.10.2012, 17:14  [ТС]
UI, если бы знал эту функцию, то обязательно обошёлся бы
Спасибо, получилось

Добавлено через 1 час 40 минут
Теперь новая проблема
C++
1
2
3
4
5
//ShowMessage(ParamStr(2));
HWND PreviewWindow = HWND (StrToInt(ParamStr(2)));  
HDC dc = GetDC(PreviewWindow);
TF_screen *F_screen = new TF_screen(NULL);
F_screen->PaintTo(dc, 0, 0);
Если запускаю программу из билдера, передавая параметры /p и HWND окна превью, то изображение отрисовывается.

Если мою заставку с теми же параметрами вызывает система, то ничего не происходит. Но стоит убрать комментарий с первой строчки (вызвать ShowMessage) - и всё работает.
Не понимаю, почему так... Видимо мне нужно вручную вызвать какую-то функцию инициализации графики, только не знаю какую
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
14.10.2012, 17:47
Ты можешь, наконец, полный код своей WinMain выложить? Потому что совершенно непонятно, создаешь ли ты очередь сообщений, или у тебя она создается только тогда, когда вызывается ShowMessage?
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
14.10.2012, 18:35  [ТС]
UI, WinMain я не изменял, всё как билдер делает по умолчанию
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TF_Main), &F_Main);
                 Application->CreateForm(__classid(TF_Settings), &F_Settings);
                 Application->CreateForm(__classid(TF_screen), &F_screen);
                 Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        return 0;
}


код у меня выполняется на OnShow главной формы (раньше было на OnCreate, потом перенёс)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void __fastcall TF_Main::FormShow(TObject *Sender)
{
    //если нет параметров - вызваны настройки из контекстного меню файла. Если параметр /C:xxxxxx (тоже хендл какой-то), то вызваны настройки из диалогового окна, где выбирают заставку
    if (!ParamCount() || ParamStr(1).SubString(1,2).UpperCase() == "/C")
    {
        TF_Settings *F_Settings = new TF_Settings(this);
        F_Settings->ShowModal();
        Application->Terminate();
    }
    //обычный режим - запуск заставки на весь экран
    else if (ParamStr(1).UpperCase() == "/S")
    {
        ShowCursor(false);
        TF_screen *F_screen = new TF_screen(this);
        F_screen->Setting(Screen->Monitors[0]->BoundsRect);
        F_screen->Show();
        if (Screen->MonitorCount > 1)
        {
            TF_screen *F_screen2 = new TF_screen(this);
            F_screen2->Setting(Screen->Monitors[1]->BoundsRect);
            F_screen2->Show();
        }
    }
    //превью
    else if (ParamStr(1).UpperCase() == "/P")
    {
        //ShowMessage(ParamStr(2));
        HWND PreviewWindow = HWND (StrToInt(ParamStr(2)));  //хендл окна предварительного просмотра
        HDC dc = GetDC(PreviewWindow);
        TF_screen *F_screen = new TF_screen(NULL);
        F_screen->PaintTo(dc, 0, 0);
        //Application->Terminate();
    }
}
Добавлено через 24 минуты
F_Settings и F_screen я убрал из Auto-create forms
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
14.10.2012, 20:07
Lelik-pahan, вот сюда посмотри:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
__fastcall TForm1::DoPreview()
{
    TRect R;
    HWND PreviewWindow = (HWND)StrToIntDef(ParamStr(2), 0);
    GetWindowRect(PreviewWindow, &R);
 
    int prvWidth = R.Right - R.Left;
    int prvHeight = R.Bottom - R.Top;
 
    TForm2 *F_Screen = new TForm2(0);
    if(F_Screen->Width / (double)prvWidth > F_Screen->Height / (double)prvHeight)
        F_Screen->ScaleBy(prvWidth, F_Screen->Width);
    else
        F_Screen->ScaleBy(prvHeight, F_Screen->Height);
    F_Screen->SetBounds(0, 0, prvWidth, prvHeight);
    F_Screen->BorderStyle = bsNone;
    F_Screen->ParentWindow = PreviewWindow;
    F_Screen->Visible = true;
}
 
void __fastcall TForm1::FormShow(TObject *Sender)
{
    //
    if(ParamCount() >= 1 && ParamStr(1).UpperCase() == "/P")
    {
        DoPreview();
    }
}
, а теперь - вот сюда:
Миниатюры
Preview для screensaver`a  
3
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
14.10.2012, 20:23  [ТС]
UI, огромнейшее спасибо
0
0 / 0 / 0
Регистрация: 24.02.2014
Сообщений: 14
24.02.2014, 19:25
UI, Привет) Извините, но не могли вы помочь с (ParamStr). В меню выбора заставки когда выбираю она сразу запускает ее, я не могу разобраться если можете помочь, помогите пожалуйста!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Unit2.h"
#include <gl/gl.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormActivate(TObject *Sender)
{
 Left=0;
 Top=0;        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
 Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
 BGBitmap->Free();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
 if(Timer1->Enabled==true) Canvas->Draw(0,0,BGBitmap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 BGBitmap->Canvas->Pen->Color=RGB(random(256),random(256),random(256));
 BGBitmap->Canvas->MoveTo(random(Screen->Width),random(Screen->Height));
 BGBitmap->Canvas->LineTo(random(Screen->Width),random(Screen->Height));
 Canvas->Draw(0,0,BGBitmap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
 TRegIniFile *reg= new TRegIniFile("Software");
 reg->OpenKey("BuilderBook",true);
 Form2->Edit1->Text=reg->ReadString("ScreenSaver","Password","");
 Form2->TrackBar1->Position=reg->ReadInteger("ScreenSaver","TimerInterval", 1000);
 reg->Free();
 
 if(ParamCount>0)
 {
  if(ParamStr(1).UpperCase() == "/p")
  {
   Form1->Close();
   exit;
  }
  if(ParamStr(2).SubString(1,2).UpperCase()=="/c")
  {
   Form2->ShowModal();
   if(Form2->ModalResult << mrOk)
   {
    TRegIniFile *reg= new TRegIniFile("Software");
    reg->OpenKey("BuilderBook",true);
    reg->WriteString("ScreenSaver","Password",Form2->Edit1->Text);
    reg->WriteInteger("ScreenSaver","TimerInterval",Form2->TrackBar1->Position);
    reg->Free();
   }
   Close();
   exit;
  }
 }
 Timer1->Enabled=true;
 Timer1->Interval=Form2->TrackBar1->Position;
 Width=Screen->Width;
 Height=Screen->Height;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Width=0;
 Height=0;
 BGBitmap=new Graphics::TBitmap();
 BGBitmap->Width=Screen->Width;
 BGBitmap->Height=Screen->Height;
 
 DC=GetDC(0);
 BackgroundCanvas=new TCanvas();
 BackgroundCanvas->Handle=DC;
 
 BGBitmap->Canvas->CopyRect(Rect(0,0,Screen->Width,Screen->Height), BackgroundCanvas,
                                Rect(0,0,Screen->Width,Screen->Height));
 BackgroundCanvas->Free();
 randomize();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
 AnsiString pass;
 if(ParamStr(1).UpperCase()!="/s")
 {
  CanClose=true;
  exit;
 }
 if(Form2->Edit1->Text=="")
 {
  CanClose=true;
  exit;
 }
 CanClose=false;
 pass="";
 if(InputQuery("Введите пароль",pass))
 if(pass==Form2->Edit1->Text) CanClose=true;
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
24.02.2014, 20:48
Внимательно предыдущий ответ нельзя было почитать?
C++
1
if(ParamStr(1).UpperCase() == "/p")
, и когда это условие выполнится, интересно? Сам же переводишь строку в верхний регистр, и сам же сравниваешь с символами нижнего регистра. И потом. /P первым параметром - это предпросмотр, а не закрытие формы.
1
0 / 0 / 0
Регистрация: 24.02.2014
Сообщений: 14
24.02.2014, 21:16
UI, можете мне описать кодом пожалуйста, я честно много чего не понимаю!
0
0 / 0 / 0
Регистрация: 24.02.2014
Сообщений: 14
12.04.2014, 19:02
А если у меня на форме ничего нет? Все рисуется на TBitmap что делать, помогите!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
12.04.2014, 19:06
Если на форме ничего нет - значит и в окне предпросмотра ничего не будет. Вопрос был:
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
отправить превью своей программы (пусть для примера это будет простая форма) в окно предварительного просмотра
Если у тебя вопрос другой, значит, его надо сначала сформулировать правильно, и только потом пытаться брать и модифицировать коды, которые отвечают на другие вопросы.
1
0 / 0 / 0
Регистрация: 24.02.2014
Сообщений: 14
12.04.2014, 19:24
Да знаю, извините у меня немного по другому вопросу, но тема одинаковая. У меня все рисует на TBitmap, форма пустая, нужно как нибудь мой Bitmap загрузить в экран предварительного просмотра, пробовал модифицировать ваш код, но не получеться. Только эта одна проблема осталась. В интернете не нашел, помогите пожалуйста
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
12.04.2014, 21:00
Цитата Сообщение от MrSq Посмотреть сообщение
В интернете не нашел
Плохо искал. На оф. сайте Эмбаркадеро лежит описание, как делать скринсэйвер с превьюшками. Причем в превью отображаются именно Bitmap-ы. Код - на Дельфи, сейчас не особенно мне хочется переводить все на Билдер, смотри и делай по образу и подобию: Random Images Screen Saver in Delphiвот тут лежит архив с исходниками)
2
0 / 0 / 0
Регистрация: 24.02.2014
Сообщений: 14
12.04.2014, 21:22
СПАСИБО!!!
0
0 / 0 / 0
Регистрация: 24.02.2014
Сообщений: 14
11.05.2014, 17:15
UI,
здравствуйте еще раз. Знаю очень задолбал уже, но спросить некого.

хотел спросить у вас не выбивала такая ошибка?


после ошибки все рисует нормально


я в OnShow не изменяю Visible

этот код на делфи http://edn.embarcadero.com/article/26652 у меня не работает, ну я немного переделал программу и этот ваш код DoPreview работает но выбивает эта ошибка. В Интернете смотрел про нее, но так толком ничего в моем случае не было.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
11.05.2014, 18:57
Цитата Сообщение от MrSq Посмотреть сообщение
ну я немного переделал программу и этот ваш код DoPreview работает но выбивает эта ошибка.
Наверно, в этом проблема?
Как ты хочешь, чтоб тебе помогли, не видя модифицированного кода? Ну, и картинки на форум грузить надо, а не ссылками, да еще и криво вставленными...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.05.2014, 18:57
Помогаю со студенческими работами здесь

Создать список preview'шек для картинок из заданной папки
Есть задача - сделать некий список, состоящий из превьюшек всех картинок, расположенных в выбираемой папке. Нужно нечто, как в окне...

Screensaver
Нужен Screensaver написаный на Assembler (TASM). В котором бы ездил текст по екрану и отбивался от краев ну как на Windows! Помогите...

Устранить screensaver
На предприятии до фига ретивая служба безопасности придумала идиотское правило. На всех компьютерах ставят блокировку экрана. В смысле что...

Batch Screensaver
Возникла идея написать скринсэйвер на бат. Допустим просто поставить картинку на весь экран как заставку. А при нажатии любой клавиши,...

Delphi + TAdvSmoothSlideShow = ScreenSaver?
Вопрос наверное всё же больше подходит к теме ОС, но т.к. ковыряю я это в Дельфе то тут и обсудим Итак, задача - сделать свой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru