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

Поиск:

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


Новичок



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

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



В общем проблема. Вот код обработчика сообщений. Работаю в Visual Studio 2005
Цитата

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    int userReply;
    HBITMAP mouse=LoadBitmap(hins,"MOUSE"),start=LoadBitmap(hins,"start"),startP=LoadBitmap(hins,"startP"),exitN=LoadBitmap(hins,"exitN"),exitP=LoadBitmap(hins,"exitP");
    switch (uMsg)
    {
  case WM_PAINT:
    hdc=BeginPaint(hWnd,&ps);
    if(Cartoon)
    {
    GetClientRect(hWnd,&rect);
    DrawBitmap(hdc,xM,yM,mouse);
    }
    if(Menu)
    {
    if(START)
    {
     DrawBitmap(hdc,415,150,startP);
     DrawBitmap(hdc,415,215,exitN);
    }
    if(EXIT)
    {
     DrawBitmap(hdc,415,150,start);
     DrawBitmap(hdc,415,215,exitP);
    }
    }
    EndPaint(hWnd,&ps);
    break;

  case WM_LBUTTONDOWN:

    if (LOWORD(lParam)>=xM && LOWORD(lParam)<=xM+273 && HIWORD(lParam)>=yM && HIWORD(lParam)<=yM+164) 
    {
    Push=true;
    dx=LOWORD(lParam)-xM;
    dy=HIWORD(lParam)-yM;
    }
    break;
  case WM_LBUTTONUP:
    Push=false;
    break;
  case WM_KEYDOWN:
    if(Menu)
    {
    hdc=GetDC(hWnd);
    switch (wParam)
    {
     case VK_UP:
      DrawBitmap(hdc,415,150,startP);
      DrawBitmap(hdc,415,215,exitN);
      START=true;
      EXIT=false;
      break;
     case VK_DOWN:
      DrawBitmap(hdc,415,150,start);
      DrawBitmap(hdc,415,215,exitP);
      START=false;
      EXIT=true;
      break;
     case VK_SPACE:
      if(START)
      {
       Menu=false;
       Cartoon=true;
       InvalidateRect(hWnd,NULL,TRUE);
       break;
      }
      else if(EXIT)
      {
       userReply=MessageBox(hWnd, "A you sure?", "EXIT", MB_YESNO | MB_ICONQUESTION);
       if (IDYES==userReply) 
        DestroyWindow(hWnd); 
       break;
      }
    }
    ReleaseDC(hWnd,hdc);
    break;
    }
  case WM_MOUSEMOVE:
    if (MK_LBUTTON && Push) 
    {
    GetClientRect(hWnd,&rect);
    xM=LOWORD(lParam)-dx;
    yM=HIWORD(lParam)-dy;
    InvalidateRect(hWnd,NULL,TRUE);
    }
    break;
  case WM_CLOSE:
    userReply=MessageBox(hWnd, "A you sure?", "EXIT", MB_YESNO | MB_ICONQUESTION);
    if (IDYES==userReply) 
    { 
     DestroyWindow(hWnd); 
     delete_instruments();
    }
    break;

  case WM_DESTROY:
    PostQuitMessage(0);
    break;

  default:
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}


После нажатия в нужную область и возни мышью несколько секунд, битмап перестает отрисовываться и исчезает уже отрисованный.
Ниже основные файлы проекта. Очень прошу, помогите! Не могу продолжить работать над заданием из-за этого.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  _______.rar 10,43 Kb
PM MAIL   Вверх
GremlinProg
Дата 12.4.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1. очень не советую рисовать за пределами сообщения WM_PAINT, в большинстве случаев достаточно InvalidateRect
2. если есть утечка ресурсов, то от нее нужно избавиться: http://forum.vingrad.ru/act-Search/CODE/sh...2587/index.html


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


Новичок



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

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



АГА! По идее мои проблемы в том, что я подгружая битмапы в обработчике сообщений, тобишоь каждый раз при его срабатывании битмапы подгружаются вновь? Если так, то как мне этого избежать. Пробовал загружать битмапы в переменный в WinMain не получилось.

Посмотрел в диспетчере задач - >6000 объектов GDI съедает моя прога! Надо как-то либо удалять битмапы (как?) либо подгрузить их всего 1 раз.

Это сообщение отредактировал(а) Sonet - 12.4.2010, 12:36
PM MAIL   Вверх
GremlinProg
Дата 12.4.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sonet @  12.4.2010,  14:34 Найти цитируемый пост)
По идее мои проблемы в том, что я подгружая битмапы в обработчике сообщений, тобишоь каждый раз при его срабатывании битмапы подгружаются вновь? Если так, то как мне этого избежать.

Цитата

The application must call the DeleteObject function to delete each bitmap handle returned by the LoadBitmap function. 




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


Новичок



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

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



Вставил в WM_Paint после отрисовки, не помогло. Можно ли как-то 1 раз загрузить битмапы?
PM MAIL   Вверх
GremlinProg
Дата 12.4.2010, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sonet @  12.4.2010,  14:57 Найти цитируемый пост)
Можно ли как-то 1 раз загрузить битмапы?

ну конечно можно:
Код

HBITMAP mouse, start, startP, exitN, exitP;
...
int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ){
    mouse=LoadBitmap(hins,"MOUSE");
    start=LoadBitmap(hins,"start");
    ...
    while( ::GetMessage( ... ) ){
        ...
    }
    ...
    ::DeleteObject( start );
    ::DeleteObject( mouse );
}
...
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
    ...
    switch (uMsg){
        case WM_PAINT:
            hdc=BeginPaint(hWnd,&ps);
            if(Cartoon){
                GetClientRect(hWnd,&rect);
                DrawBitmap(hdc,xM,yM,mouse);
            }
    ...
}



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


Новичок



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

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



Спасибо огромное! репу пока не могу добавлять) Я пытался объявить переменные и загрузить битмапы вместе, либо перед прогой, либо в ВинМэйн, что-то не догадался, что надо по-оидельности.
PM MAIL   Вверх
xvr
Дата 13.4.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Sonet @  12.4.2010,  13:17 Найти цитируемый пост)
Спасибо огромное! репу пока не могу добавлять)

Добавил

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.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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