Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неработает WM_TIMER 
V
    Опции темы
yngwie19
Дата 13.5.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Здравствуйте вот код:
Код

#include "stdafx.h"

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

#define ID_TIMER 1

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR,int)
{
    char *szClassName = "MainWindow";
    char *szTite = "Программа 4";
    MSG msg;
    WNDCLASSEX wc;

    wc.cbClsExtra = 0;
    wc.cbSize = sizeof(wc);
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = szClassName;
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClassEx(&wc);

    HWND hwnd = CreateWindow(szClassName,szTite,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_NORMAL);

    UpdateWindow(hwnd);

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
        
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{    
    static BOOL fFlipFlop = FALSE;
    HBRUSH hBrush;
    RECT rc;
    switch(msg)
    {
        case WM_CREATE:
            SetTimer(hwnd,ID_TIMER,1000,NULL);
            return 0;
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                    
                EndPaint(hwnd,&ps);
            }
        return 0;
        case WM_TIMER:
            MessageBeep(0);
            MessageBox(NULL,"","",MB_OK);
            return 0;
        case WM_DESTROY:
            KillTimer(hwnd,ID_TIMER);
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd,msg,wParam,lParam);
}


Почему-то не получаю сообщения WM_TIMER. Посмотрите в чем дело?
PM MAIL   Вверх
Andrey44
Дата 13.5.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Код

case WM_CREATE:
            SetTimer(hwnd,ID_TIMER,1000,NULL);
            return 0;

Сюда заходит?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 13.5.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Andrey44, Она почему-то в цикле висит
PM MAIL   Вверх
GremlinProg
Дата 13.5.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(yngwie19 @  13.5.2009,  13:41 Найти цитируемый пост)

        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                EndPaint(hwnd,&ps);
            }

что это?

WM_PAINT приходит когда в очереди только этот WM_PAINT и находится, один одинешенек
если его не обрабатывать, то WM_PAINT будет приходить ВСЕГДА, не давая работать корректно остальным сообщениям

WM_TIMER напрямую зависит от трафика в очереди,
если в ней бесконечно крутится WM_PAINT, он и не придет никогда

EndPaint - это закрывающая скобка для BeginPaint,
они дополняют друг друга, раздельно их использовать бессмысленно

yngwie19, уже в который раз делаешь одну и ту же ошибку
минимум работы, которую требует WM_PAINT:
Код

BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);


Добавлено через 8 минут и 59 секунд
либо, если так не нравится BeginPaint:
Код

hrgn = ::CreateRectRgn(0,0,0,0);
::GetUpdateRgn(hwnd,hrgn,FALSE);
::ValidateRgn(hwnd,hrgn);
::DeleteObject(hrgn);

это отпустит очередь

Добавлено через 10 минут и 45 секунд
или так:
Код

GetUpdateRect(hwnd,&rc,FALSE);
ValidateRect(hwnd,&rc);



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 13.5.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



GremlinProg, Спасибо большое, прошу простить за то что ввел Вас в заблуждение. Я когда редактировал код, то случайно удалил строчку BeginPaint(hwnd,&ps);
PM MAIL   Вверх
GremlinProg
Дата 13.5.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



yngwie19, c BeginPaint не получать WM_TIMER просто невозможно
без него, да, а почему, думаю, объяснил


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.