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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка новых сообщений через PeekMessage() 
V
    Опции темы
serega3
Дата 18.8.2012, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.8.2012

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



Всем привет. Начинаю изучать WinAPI и столкнулся с такой проблемой: в книге сказано, что в бесконечном цикле, например при создании прогресс бара на чтение файла, чтобы программа не зависала в ожидании конца файла, нужно добавлять команду на проверку новых сообщений PeekMessage(параметры). Я передаю в нее ссылку на структуру MSG и дескриптор данного окна, прогресс бар создаю как новое окно, но при запуске, программа подвисает и прогресс бар не обновляется. Что делаю не так, очень нужна помощь. Часть кода цикла, остальная стандартная для окна и работоспобна.
Код

  HDC               hDC;
  PAINTSTRUCT ps;
  RECT              rect;
  HWND            hwndProgressBar;
  MSG               msg;
  HINSTANCE    hInstance;
  GetFile           getFile;
  ifstream         file("C:\\231.rar", ios::in | ios::binary);
  char               buf[100000];
  char               mess[100];
  int                  width;
  long               len = 0;

  switch (uMsg) {
    case WM_CREATE:
         hwndProgressBar = CreateWindow(PROGRESS_CLASS,
                                      NULL,
                                      PBS_SMOOTH | WS_CHILD | WS_VISIBLE,
                                      20,
                                      20,
                                      500,
                                      10,
                                      hWnd,
                                      NULL,
                                      NULL,
                                      NULL);

         SendMessage(hwndProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0, 500));
         SendMessage(hwndProgressBar, PBM_SETSTEP, 1, 0);
    case WM_COMMAND:
       //Запуск чтения по нажатию кнопки button
       if (LOWORD(wParam) == 10000) {
         InvalidateRect(hWnd, NULL, FALSE);

         while (!file.eof()) {
           file.read(buf, 100000);
           len += 100000;
           width = 500 * (len / 2200000000);
           //Прогресс бар не обновляется
           if (width >= 1) {
             SendMessage(hwndProgressBar, PBM_STEPIT, 0, 0);
             width = 0;
           }
           //Искусственная задержка для маленького файла
           Sleep(50);
           //Это как раз блок проверки новых сообщений, чтобы программа не подвисала в ожидании окончания файла
           if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
               TranslateMessage(&msg);
               DispatchMessage(&msg);
             }
         }
       }
       break;
    case WM_PAINT:
       hDC = BeginPaint(hWnd, &ps);

       GetClientRect(hWnd, &rect);
       CreateWindow("button", "Начать загрузку", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                    400, 200, 140, 30, hWnd, (HMENU)10000, hInstance, NULL);
       EndPaint(hWnd, &ps);
       break;
    case WM_CLOSE:
       DestroyWindow(hWnd);
       break;
    case WM_DESTROY:
       PostQuitMessage(0);
       break;
    default:
       return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
 
И еще вопрос. Данные компоненты отображаются в стиле Windows XP, а что нужно для отображения в стиле Windows7 (имею ввиду кнопки, прогресс бар и т.д.), может библиотека. Компилятор я использую Borland C++ Builder 6, пробовал данный код в Visual Studio, но он ругается: передача в функции типа char, а должен быть LPCSTR, пробовал разные методы из интернета типа _T(), не помогало.
Спасибо всем кто чем-либо сможет помочь
PM MAIL   Вверх
korian
Дата 19.8.2012, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



где-то так: (не проверял)
Код

   HDC               hDC;
   PAINTSTRUCT ps;
   RECT              rect;
   HWND            hwndProgressBar;
   MSG               msg;
   HINSTANCE    hInstance;
   GetFile           getFile;
   ifstream         file("C:\\231.rar", ios::in | ios::binary);
   char               buf[100000];
   char               mess[100];
   int                  width;
   long               len = 0;

   switch (uMsg) {
    case WM_CREATE:
       hwndProgressBar = CreateWindow(PROGRESS_CLASS,
          NULL,
          PBS_SMOOTH | WS_CHILD | WS_VISIBLE,
          20,
          20,
          500,
          10,
          hWnd,
          NULL,
          NULL,
          NULL);
       SendMessage(hwndProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0, 500));
       SendMessage(hwndProgressBar, PBM_SETSTEP, 1, 0);
       CreateWindow("button", "Начать загрузку", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
          400, 200, 140, 30, hWnd, (HMENU)10000, hInstance, NULL);
       break;
    case WM_COMMAND:
       //Запуск чтения по нажатию кнопки button
       if (LOWORD(wParam) == 10000) {
          InvalidateRect(hWnd, NULL, FALSE);
          while (!file.eof()) {
             file.read(buf, 100000);
             len += 100000;
             width = 500 * (len / 2200000000);
             //Прогресс бар не обновляется
             if (width >= 1) {
                SendMessage(hwndProgressBar, PBM_STEPIT, 0, 0);
                width = 0;
             }
             //Искусственная задержка для маленького файла
             for (int i = 0; i != 50; ++i)
             {
                Sleep(1);
                //Это как раз блок проверки новых сообщений, чтобы программа не подвисала в ожидании окончания файла
                if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
                   TranslateMessage(&msg);
                   DispatchMessage(&msg);
                }
             }
          }
       }
       break;
    case WM_PAINT:
       hDC = BeginPaint(hWnd, &ps);
       GetClientRect(hWnd, &rect);
       EndPaint(hWnd, &ps);
       break;
    case WM_CLOSE:
       DestroyWindow(hWnd);
       break;
    case WM_DESTROY:
       PostQuitMessage(0);
       break;
    default:
       return DefWindowProc(hWnd, uMsg, wParam, lParam);
   }



Цитата(serega3 @  18.8.2012,  19:05 Найти цитируемый пост)
в книге сказано, что в бесконечном цикле, например при создании прогресс бара на чтение файла, чтобы программа не зависала в ожидании конца файла, нужно добавлять команду на проверку новых сообщений PeekMessage(параметры)

я б сказал, что это плохой вариант, для решения подобной проблемы


Цитата(serega3 @  18.8.2012,  19:05 Найти цитируемый пост)
но при запуске, программа подвисает

break нету в WM_CREATE

Цитата(serega3 @  18.8.2012,  19:05 Найти цитируемый пост)
программа подвисает и прогресс бар не обновляется.

из-за Sleep(50);
так же возможно из-за CreateWindow в WM_PAINT, не знаю как оно там на это реагирует, но это неправильно


Цитата(serega3 @  18.8.2012,  19:05 Найти цитируемый пост)
Данные компоненты отображаются в стиле Windows XP, а что нужно для отображения в стиле Windows7

ключевые слова для поиска - windows manifest


Цитата(serega3 @  18.8.2012,  19:05 Найти цитируемый пост)
робовал данный код в Visual Studio, но он ругается

надо знать строку на которую ругается


Это сообщение отредактировал(а) korian - 19.8.2012, 11:26
PM   Вверх
serega3
Дата 19.8.2012, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.8.2012

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



Бессонная ночь и кофе сделали свое дело. Отдельное спасибо korian, действительно все дело было в манифесте, скачал, скомпилил, теперь интерфейс windows7. Если вдруг есть еще такие же как я, то манифест для windows7 взял отсюдаСсылка на манифест windows7 (второй пост), там нужны два файла: win7.rc и win7.xml, а способ установки в проект отлично описан здесь: установка манифеста windwows7 в проект. По поводу подвисаний и не рабочего прогресс бара: я поставил обработку при нажатии на кнопку, но кнопка нажималась один раз, поэтому все работало, но окно не перерисовывалось. Добавив свое сообщение и в цикле посылать его, окно стало обновляться и вместе с ним прогресс бар и текстовые строки. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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