Проблема посылки сообщения окну

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
engine
Сообщения: 13
Зарегистрирован: 10 фев 2008, 17:50

Мне нужно чтоб процедура ReDraw вызывалась в любое свободное время работы программы. Делаю я это так:

Код: Выделить всё

INT_PTR WINAPI DlgProcShow(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{
	switch (uMsg) 
	{
	case WM_INITDIALOG:
		{
                      ...
                      SendMessage(hwnd,WM_COMMAND,NULL,NULL);
		}
		break;
        case WM_COMMAND:
         	ReDraw(hwnd);                
                break;
        ...
	}
	return 0;
}


void ReDraw(HWND hwnd)
{
                ...
		SendMessage(hwnd,WM_COMMAND,NULL,NULL);
}
При этом коде ReDraw не вызывается ни разу.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Бред какой-то...
engine
Сообщения: 13
Зарегистрирован: 10 фев 2008, 17:50

Программа выводит в диалоговое окно надписи каждые 2 секунды и при этом следит за нажатием на кнопку F1. Вот процедура ReDraw как раз выводит эти надписи. Я бы мог реализовать это с помощью цикла, но тогда следить за нажатием клавиш не получилось бы.
ssDev
Сообщения: 50
Зарегистрирован: 20 янв 2005, 14:41

Вобщето это делается на сообщение WM_TIME или с помощью таймера.
Но если делать как ты то уж лудьше ты бы посадил эту функцию в цикл обработки сообщений GetMeaasge
engine
Сообщения: 13
Зарегистрирован: 10 фев 2008, 17:50

Но если делать как ты то уж лудьше ты бы посадил эту функцию в цикл обработки сообщений GetMeaasge
Да спасибо, я уже так сделал
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Я обычно по-другому делаю:

Код: Выделить всё

case WM_PAINT :
{
  PAINTSTRUCT ps;
  HDC hdc = ::BeginPaint(hWnd, &ps);
  // Выполняется отрисовка клиентской области окна...
  // TODO: . . . . . . . . . . . . . . . . . . . . . .
  ::EndPaint(hWnd, &ps);
  // Перерисовка окна...
  ::InvalidateRect(hWnd, NULL, FALSE);
}
break;
Ответить