![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! Недавно возник вопрос, поэтому прошу вашей помощи. Есть у меня моя программа для обработки звука и недавно я откопал у себя еще одну небольшую программу: Music Spectrum Analyser. Она в формате dpr вся, без формы, но скомпилированный exe имеет нормальную красивую форму. Я бы хотел интегрировать ее в мою программу, основанную на формах и т.д. Но не знаю как. Единое, что я смог сделать - это запускать ее кнопкой вот так:
Код:
procedure TForm1.sButton1Click(Sender: TObject);
begin
windows.WinExec('histogram.exe',windows.SW_NORMAL);
end;А хотелось бы, чтобы она была в форме. Есть ли такая возможность и как это осуществить? |
|
#2
|
||||
|
||||
|
Решение "в лоб" - вручную поменять стиль окна этой проги на "окно без границ", поставить парентом своё и растянуть на все свое окно. Как - см. WinAPI, SetWindowLong, ...
Решение не в лоб - разобраться в коде этой проги и внедрить в свой код. |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Dmitry_DM (25.11.2012)
| ||
|
#3
|
||||
|
||||
|
Цитата:
|
|
#4
|
|||
|
|||
|
Цитата:
|
|
#5
|
||||
|
||||
|
Код:
procedure UpdateSpectrum(uTimerID, uMsg, dwUser, dw1, dw2 : Integer); stdcall;
begin
if isPlayed then
begin
OnDrawData;
OnDrawBar;
OnDrawWave;
end;
end;UPD: Код:
MoveToEx(BarBitmap.DC, I * (ColWidth + 2) + Offset, BarBitmap.aHeight - fftPeaks[i], NIL);
LineTo(BarBitmap.DC, I * (ColWidth + 2) + ColWidth + Offset, BarBitmap.aHeight - fftPeaks[i]);
SetRect(aRect, I * (ColWidth + 2) + Offset, BarBitmap.aHeight - FFTFallOff[i], I * (ColWidth + 2) + ColWidth + Offset, BarBitmap.aHeight);
SetRect(bRect, aRect.Left, BarBitmap.aHeight, aRect.Right, BarBitmap.aHeight - 1);
J := aRect.Bottom - aRect.Top;
repeat
B := 0;
R := 255 div BarBitmap.aHeight * (aRect.Bottom - aRect.Top - J);
G := 256 - R;
FillRect(BarBitmap.DC, bRect, RGB(R, G, B));
OffsetRect(bRect, 0, -1);
dec(J);
until J < 0; |
|
#6
|
||||
|
||||
|
Ничего у меня там сложного нет. Рисуется на трёх битмапах, затем они копируются на канвас окна.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Dmitry_DM (25.11.2012)
| ||
|
#7
|
|||
|
|||
|
Цитата:
![]() |
|
#8
|
||||
|
||||
|
OnDrawBar - рисует "столбики", OnDrawWave - "волну". Создать битмапы в которые будет происходить отрисовка. Последние строки
Код:
// update the display BitBlt(MainDC, 3, 132, BarBitmap.aWidth, BarBitmap.aHeight, BarBitmap.DC, 0, 0, SRCCOPY); ... // update the display BitBlt(MainDC, 379, 132, WaveBitmap.aWidth, WaveBitmap.aHeight, WaveBitmap.DC, 0, 0, SRCCOPY); |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Dmitry_DM (25.11.2012)
| ||
|
#9
|
|||
|
|||
|
Цитата:
|
|
#10
|
||||
|
||||
|
Эти процедуры рисуют на битмапах, а их потом можешь использвать как угодно и основное окно тебе не требуется. Как я понял ты делаешь не на API, на VCL. Координаты, это первые 2 числа после MainDC.
Предположим вывод на TPainBox: Код:
BitBlt(PaintBox1.Canvas.Handle, 0, 0, BarBitmap.aWidth, BarBitmap.aHeight, BarBitmap.Canvas.Handle, 0, 0, SRCCOPY); PaintBox1.Refresh; Код:
Image1.Assign(BarBitmap); |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Dmitry_DM (25.11.2012)
| ||
|
#11
|
|||
|
|||
|
Цитата:
|
|
#12
|
||||
|
||||
|
При выполнении OpenDialog1.Execute следует код
Код:
function OpenFileName : Boolean;
begin
Result := False;
// create a stream from the file
isMod := mdBassStream;
ChanDecoder := BASS_StreamCreateFile(False, PAnsiChar(szFileName), 0, 0, BASS_SAMPLE_FLOAT or BASS_STREAM_DECODE or BASS_STREAM_PRESCAN);
if ChanDecoder = 0 then
begin
isMod := mdBassMusic;
ChanDecoder := BASS_MusicLoad(False, PAnsiChar(szFileName), 0, 0, BASS_SAMPLE_FLOAT or BASS_MUSIC_DECODE or BASS_MUSIC_PRESCAN, 0);
if ChanDecoder = 0 then
begin
// Can't load the file
isMod := mdBassEmpty;
MessageBox(0, PAnsiChar(Format('%s "%s"', [szNotOpenFile, szFileName])), 'Error', MB_OK or MB_ICONERROR);
Exit;
end;
end;
case isMod of
mdBassStream : ChanPlay := BASS_StreamCreateFile(False, PAnsiChar(szFileName), 0, 0, BASS_SAMPLE_FLOAT);
mdBassMusic : ChanPlay := BASS_MusicLoad(False, PAnsiChar(szFileName), 0, 0, BASS_SAMPLE_FLOAT, 0);
end;
// get byte length
ChanLen := BASS_ChannelGetLength(ChanDecoder, BASS_POS_BYTE);
// allocate a buffer for the Channel data
SetLength(ChanData, ChanLen);
// decode the stream into the buffer
ChanLen := BASS_ChannelGetData(ChanDecoder, ChanData, ChanLen);
if ChanPlay <> 0 then
BASS_ChannelPlay(ChanPlay, False);
Result := True;
end;на кнопку будет так Код:
if OpenDialog1.Execute then
begin
isPlayed := False;
BASS_ChannelStop(ChanPlay);
FreeBuffer;
OpenFileName;
AllocateWaveData;
isPlayed := True;
end; |
|
#13
|
|||
|
|||
|
Цитата:
|
|
#14
|
||||
|
||||
|
Этот при клике на кнопку. Далее вызываются последовательно: FreeBuffer, OpenFileName, AllocateWaveData.
Может сделать проще. Накидай проект, как ты его представляешь и скажи, что и куда прикрутить. Последний раз редактировалось angvelem, 25.11.2012 в 03:06. |
|
#15
|
|||
|
|||
|
Цитата:
Последний раз редактировалось Dmitry_DM, 25.11.2012 в 15:13. |