|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Объеденение программ
Здравствуйте! Недавно возник вопрос, поэтому прошу вашей помощи. Есть у меня моя программа для обработки звука и недавно я откопал у себя еще одну небольшую программу: Music Spectrum Analyser. Она в формате dpr вся, без формы, но скомпилированный exe имеет нормальную красивую форму. Я бы хотел интегрировать ее в мою программу, основанную на формах и т.д. Но не знаю как. Единое, что я смог сделать - это запускать ее кнопкой вот так:
Код:
procedure TForm1.sButton1Click(Sender: TObject); begin windows.WinExec('histogram.exe',windows.SW_NORMAL); end; А хотелось бы, чтобы она была в форме. Есть ли такая возможность и как это осуществить? |
#2
|
||||
|
||||
Решение "в лоб" - вручную поменять стиль окна этой проги на "окно без границ", поставить парентом своё и растянуть на все свое окно. Как - см. WinAPI, SetWindowLong, ...
Решение не в лоб - разобраться в коде этой проги и внедрить в свой код. jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо 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; jmp $ ; Happy End! The Cake Is A Lie. |
#6
|
||||
|
||||
Ничего у меня там сложного нет. Рисуется на трёх битмапах, затем они копируются на канвас окна.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#13
|
|||
|
|||
Цитата:
|
#14
|
||||
|
||||
Этот при клике на кнопку. Далее вызываются последовательно: FreeBuffer, OpenFileName, AllocateWaveData.
Может сделать проще. Накидай проект, как ты его представляешь и скажи, что и куда прикрутить. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 25.11.2012 в 03:06. |
#15
|
|||
|
|||
Цитата:
Последний раз редактировалось Dmitry_DM, 25.11.2012 в 15:13. |