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

Preview для screensaver`a

11.10.2012, 22:24. Показов 3661. Ответов 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
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
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
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
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
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 12
14.10.2012, 14:58
А чего, F_Main->PaintTo(dc, 0, 0) совсем никак нельзя обойтись?
2
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
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
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 12
14.10.2012, 17:47
Ты можешь, наконец, полный код своей WinMain выложить? Потому что совершенно непонятно, создаешь ли ты очередь сообщений, или у тебя она создается только тогда, когда вызывается ShowMessage?
0
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
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
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 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
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
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
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 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
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 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
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru