Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2009, 14:45   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию WinAPI - системное время+аудио файл (wav)

Добрый день товарищи.
Пишу с вопросиком и с просьбой о подсказке вам.
Хочу зделать программу, которая будет выводить врем (системное разумеется) и воспроизовдить при этом музычку. Вот на счет выводить время - я догнал и зделал это,а вот на счет воспроизводить музычку? как это зделать? Я попробывал (заранее знал что не прокатит, ну т.е. как надо не будет работать) засунуть фун-ию воспроизведения музыки (wav) в конце махинаций со временем, ну и как ожидалось - песенка только секунду воспроизводится и потом опять заного. Решил в отдельное место засунуть, там почти то что я хотел, НО когда воспроизводится музыка - время стоит (у меня в программе), окошечко не передвинешь, не свернешь, а при закрытии - пишет что очень сильно занят и завершить или нет. Почему это все, я понимаю, так сказать окошко заблокировано (грубо говоря) и пока не довоспроизведет аудио файл - программа не начнет опять показывать время и окошко нельзя будет перетаскивать, Помогите пожалуйста, вот кусочек кода:
Код:
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")

LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS WndClass;
    memset(&WndClass,0,sizeof(WNDCLASS));
    
    WndClass.style			= CS_HREDRAW | CS_VREDRAW;
    WndClass.lpfnWndProc	= WndProc;
    WndClass.hInstance		= hInstance;
    WndClass.hbrBackground	= (HBRUSH)GetStockObject(LTGRAY_BRUSH);
	//WndClass.hbrBackground	= (HBRUSH)GetStockObject(DEFAULT_PALETTE);
    WndClass.lpszClassName	= "Lab";
	WndClass.hCursor		= LoadCursor (NULL, IDC_ARROW) ;
	WndClass.cbClsExtra		= 0 ;
	WndClass.cbWndExtra		= 0 ;

    RegisterClass(&WndClass);
    
    hwnd = CreateWindow("Lab","Lab",
		WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,// | WS_OVERLAPPEDWINDOW,
                        300,300,300,200, NULL, NULL, hInstance, NULL);
						//CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
	SetTimer (hwnd, 1, 500, NULL);
    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
	char time1[7];
	char buf[3];
	static int h,m,s;
	int hs,ms,ss;
	int i = 0;
	static HWND systemTime;
	static HWND hours;
	static HWND minutes;
	static HWND seconds;
	static HWND start;
	switch (Message)
           {
		case WM_CREATE:
			//создаю окошечки;
			return 0;

		case WM_TIME:
			hs = WndPaint (hs,NULL,NULL);
			itoa(hs,buf,10);
			strcpy(time1,buf);
			strcat(time1,":");
			ms = WndPaint(NULL,ms,NULL);
			itoa(ms,buf,10);
			strcat(time1,buf);
			strcat(time1,":");
			ss = WndPaint(NULL,NULL,ss);
			itoa(ss,buf,10);
			strcat(time1,buf);
			SetWindowText(systemTime,time1);
			return 0;

		case WM_DESTROY:
			KillTimer (hwnd, 1);
		    PostQuitMessage(0);
			return 0;

		default:
		    return DefWindowProc(hwnd, Message, wparam, lparam);
           }
}
функцию воспроизведения я знаю только 1:
Код:
PlaySound("1.wav",NULL,SND_FILENAME | SND_ASYNC);
а чтобы она немнога поиграла, я делал
Код:
Sleep();
Помогите пожалуйста, куда, что, откуда, я вот думал и мог только вот додуматься, что надо или переделывать проект (чую что вот не очень хорошо он построен для этого) или писать еще одну программу и чтобы она уже воспроизводила аудио файл.
Спасибо за внимание.
Проект я создавал - Win32 Console

Последний раз редактировалось Olejik; 29.10.2009 в 14:50.
Olejik вне форума Ответить с цитированием
Старый 29.10.2009, 14:56   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

mcisendstring вам в помощь
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 29.10.2009, 14:59   #3
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
mcisendstring вам в помощь
а это что такое? В msdn'e я не нашол

ой-ой-ой, простите, нашол, сейчас буду юзать.
и еще вопросик, я сейчас просматривал работу своей API программы и заметил что она через каждые 30 секунд потребляет все больше и больше оперативной памяти? Это как так возможно? Динамические массивы я вроде бы не использую...

Последний раз редактировалось Stilet; 29.10.2009 в 15:18.
Olejik вне форума Ответить с цитированием
Старый 29.10.2009, 15:06   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
MCISendString(PChar('play ' + 'музыка.mp3 или wav или т.д'),nil,0,0)
по таймеру
WndPaint(NULL,ms,NULL);
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось Stilet; 29.10.2009 в 15:18.
raxp вне форума Ответить с цитированием
Старый 29.10.2009, 15:26   #5
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
Код:
MCISendString(PChar('play ' + 'музыка.mp3 или wav или т.д'),nil,0,0)
по таймеру
WndPaint(NULL,ms,NULL);
заработало!!!! Спасибо !!!
а можно как нибуть сделать чтобы не кушала программа дополнительной памяти через 30 секунд? А то меня этот вопрос уже гложит просто
Olejik вне форума Ответить с цитированием
Старый 29.10.2009, 15:31   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
а можно как нибуть сделать чтобы не кушала программа дополнительной памяти через 30 секунд?
Цитата:
по таймеру
WndPaint();
? а где освобождение ресурсов?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 29.10.2009, 16:20   #7
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

покопавшись немнога в интернете, я увидел, что с окнами мутят вот такими функциями: BeginPaint(); и EndPaint();
не знаю, толи вообще я нашол или нет, но это очень похоже то что мне нужно, подумав немнога, я решил попробывать и вот что получилось:

Код:
PAINTSTRUCT ps ;
		case WM_PAINT:
			//тут я вычисления делаю и вывожу
			//в systemTime
			EndPaint(systemTime,&ps);
			return 0;
если так делать, она работает, но значения меняются только 1 раз и все, встает, пробовал еще присоединить перед выводом сообщения BeginPaint(systemTime,&ps); но окошечко вообще блокируется и ни чего там не происходит.
Olejik вне форума Ответить с цитированием
Старый 29.10.2009, 16:25   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

нужно посылать окну- invalidaterect чтоб перерисовалось
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 29.10.2009, 16:31   #9
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

спасибо огромное, Вы мне очень помогли!!!!
Olejik вне форума Ответить с цитированием
Старый 07.11.2009, 02:33   #10
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

еще раз всем привет... вот тут еще одна проблемка появилась по этому поводу...
система у нас такая, мы берем, считываем из txt файла адрес к wav файлу, записываем в массив, там узнаем его длинуу, делаем динамический массив к длине... ну что уж там, по коду сейчас увидите, а потом проблему напишу:
Код:
FILE *in
static char *startwav;
static char wav[255];
in = fopen("wav.txt","r");
fgets(wav,255,in);
int r = strlen(wav);
r += 6;
startwav = (char*)calloc(r,sizeof(char));
strcpy(startwav,"play ");
strcat(startwav,wav);
if(!mciSendString(startwav,NULL,0,0))
{
 ...
}
...
в файле написан полный путь к аудио файлу: C:\Documents and Settings\1.wav
я просмтаривал, программа нормально берет эту строку и она нормально живет потом в массиве startwav, но аудио файл не запускается.
А вот если в файле написано просто: 1.wav
то программа запускает его... помогите пожалуйста.
P.S. программа и аудио файл лежат в одной дирректории... ну это на всякий случай...
Olejik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
текущее время (системное время ) Sirk0 Общие вопросы Delphi 27 07.03.2015 17:52
Системное время guffer Общие вопросы Delphi 4 19.08.2009 10:44
Системное Время Д'якон Win Api 1 25.10.2008 14:48
Системное время TyoshA Общие вопросы Delphi 2 05.02.2008 23:41
Системное время Terran Общие вопросы Delphi 5 02.01.2008 20:12