Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смена рисунка Bitmap, Смена рисунка Bitmap 
:(
    Опции темы
Shiirx
Дата 1.12.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброе время суток.
Такое вот дело у меня к вам, требуется, чтобы по таймеру менялась одна картинка Bitmap, на другую, как это можно сделать? т.е. должна получиться некая анимация... Требуется именно смена одной картинки другой, сделать видио не подходит, заранее огромное спасибо...
PM MAIL WWW   Вверх
zkv
Дата 2.12.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(Shiirx @  1.12.2007,  22:42 Найти цитируемый пост)
Такое вот дело у меня к вам, требуется, чтобы по таймеру менялась одна картинка Bitmap, на другую, как это можно сделать?

по таймеру меняй битмап, что тут еще добавишь.
Что именно не понятно?
PM MAIL   Вверх
Shiirx
Дата 2.12.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(zkv @  2.12.2007,  15:17 Найти цитируемый пост)
по таймеру меняй битмап, что тут еще добавишь.
Что именно не понятно? 


Не понятно, как заставить меняться их, т.е. что писать в обработчик таймера...
Можно даже привести пример, с нажатием на кнопку, а в таймер сам уже как-нибудь засуну... ВЫручайте, очень нужна помощь... 
PM MAIL WWW   Вверх
mantissa
Дата 3.12.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет Все и Shiirx!

посмотрите какой функцией загружаеся одна картинка из ресурса (файла) и каким сообщением она вставляется в кнопку или окно при инициализации окна (диалога)
и используйте те же 2 действия на таймере...

если картинок много, то удобнее загружать сразу составленный список всех изображений одинакового размера и менять их ImageList_Draw(,,,,,) см Калверт Программирование в Windows в 21 день (день 19)

с ув. BSD
PM MAIL   Вверх
Shiirx
Дата 3.12.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mantissa @  3.12.2007,  16:46 Найти цитируемый пост)
посмотрите какой функцией загружаеся одна картинка из ресурса (файла) и каким сообщением она вставляется в кнопку или окно при инициализации окна (диалога)

в файле test.rc, раздел Dialog:
CONTROL         129,IDB_BITMAP1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,0,202,175
Раздел BITMAP:
IDB_BITMAP1             BITMAP                  "res\\bitmap1.bmp"

и как я должен это всё соеденить?  smile  smile

Добавлено через 1 минуту и 56 секунд
Цитата(mantissa @  3.12.2007,  16:46 Найти цитируемый пост)
 см Калверт Программирование в Windows в 21 день (день 19)

К сожалению книги нет, в инете скачать тоже не нашёл где, если есть ссылка поделитесь..  smile 
PM MAIL WWW   Вверх
mantissa
Дата 4.12.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет, Shiirx!

Раздел BITMAP:
IDB_BITMAP1             BITMAP                  "res\\bitmap1.bmp"
++ ...
IDB_BITMAP2             BITMAP                  "res\\bitmap2.bmp"
...
IDB_BITMAPN             BITMAP                  "res\\bitmapN.bmp"

поиском по проекту можно найтить место, которое будет пользовать этот IDB_BITMAP1 
и добавить туда же свои например:
Код

      HINSTANCE hInstTmp = (HINSTANCE)(LONGLONG)GetWindowLong(hdlg, GWL_HINSTANCE);
      HBITMAP Bitmap = LoadBitmap(hInstTmp, (LPCSTR)IDB_BITMAP1);
// ++ Загрузку
      HBITMAP Bitmap2 = LoadBitmap(hInstTmp, (LPCSTR)IDB_BITMAP2);
...
      HBITMAP BitmapN = LoadBitmap(hInstTmp, (LPCSTR)IDB_BITMAPN);


и соответственно в нужном месте (той же процедуры) вставить например для кнопки IDC_btnTray:
Код

switch(nTime)
{
case 0:
SendMessage(GetDlgItem(hdlg, IDC_btnTray), BM_SETIMAGE, IMAGE_BITMAP, LPARAM(Bitmap));
case 1:
SendMessage(GetDlgItem(hdlg, IDC_btnTray), BM_SETIMAGE, IMAGE_BITMAP, LPARAM(Bitmap1));
...
case N:
SendMessage(GetDlgItem(hdlg, IDC_btnTray), BM_SETIMAGE, IMAGE_BITMAP, LPARAM(BitmapN));
}


PM MAIL   Вверх
Shiirx
Дата 4.12.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mantissa @  4.12.2007,  16:55 Найти цитируемый пост)
поиском по проекту можно найтить место, которое будет пользовать этот IDB_BITMAP1 
и добавить туда же свои например:

Код
HINSTANCE hInstTmp = (HINSTANCE)(LONGLONG)GetWindowLong(hdlg, GWL_HINSTANCE);
HBITMAP Bitmap = LoadBitmap(hInstTmp, (LPCSTR)IDB_BITMAP1);
// ++ Загрузку
HBITMAP Bitmap2 = LoadBitmap(hInstTmp, (LPCSTR)IDB_BITMAP2);
...
HBITMAP BitmapN = LoadBitmap(hInstTmp, (LPCSTR)IDB_BITMAPN);



<b>Что-то я не нашёл такое место, что это за код? Что он делает и откуда он взялся?</b>

Цитата(mantissa @  4.12.2007,  16:55 Найти цитируемый пост)
и соответственно в нужном месте (той же процедуры) вставить например для кнопки IDC_btnTray:

Код
switch(nTime)
{
case 0:
SendMessage(GetDlgItem(hdlg, IDC_btnTray), BM_SETIMAGE, IMAGE_BITMAP, LPARAM(Bitmap));
case 1:
SendMessage(GetDlgItem(hdlg, IDC_btnTray), BM_SETIMAGE, IMAGE_BITMAP, LPARAM(Bitmap1));
...
case N:
SendMessage(GetDlgItem(hdlg, IDC_btnTray), BM_SETIMAGE, IMAGE_BITMAP, LPARAM(BitmapN));
}



<b>Как определить, нужное место и что это за кнопка такая?</b>

PM MAIL WWW   Вверх
Shiirx
Дата 4.12.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

void CMy3465Dlg::OnBnClickedButton1()
{
// что я сюда должен вписать, чтобы загрузилась картинка? :sample 
}

PM MAIL WWW   Вверх
mantissa
Дата 6.12.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хм... не сразу распознал MFC и предлагал функции API.
в MFC вроде все еще проще д.б., но поскольку с MFC работал мало и методов изучил тоже мало, то могу предложить только следующее:


1) копируем и подредактируем файлик "res\bitmap1.bmp", получаем "res\bitmap2.bmp"
добавляем его в ресурсы любым способом и получаем
Раздел BITMAP:
IDB_BITMAP1             BITMAP                  "res\\bitmap1.bmp"
IDB_BITMAP2             BITMAP                  "res\\bitmap2.bmp"

2) открываем диалог в редакторе ресурсов (тот который содержит выше указанное)
размножаем окно или другим способом (не забывать присвоить ID  IDB_BITMAP2=12009 в h-файле, если обычным копированием)
получаем
CONTROL         129,IDB_BITMAP1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,0,202,175
CONTROL         12009,IDB_BITMAP2,"Static",SS_BITMAP | SS_CENTERIMAGE | NOT WS_VISIBLE,0,0,202,175
(ВНИМАНИЕ! все остальные там же, но невидимые)

3) в указанном обработчике кнопки или НА ТАЙМЕРЕ переключаем видимость этих окон методом:
  if (myOk)
  {
    GetDlgItem(IDB_BM2)->ShowWindow(SW_SHOW);
    GetDlgItem(IDB_BM3)->ShowWindow(SW_HIDE);
  }
  else
  {
    GetDlgItem(IDB_BM3)->ShowWindow(SW_SHOW);
    GetDlgItem(IDB_BM2)->ShowWindow(SW_HIDE);
  }
  myOk = !myOk;

BOOL myOk; или счетчик времени тож  придется добавить в класс окна

Добавлено через 1 минуту и 34 секунды
вау... сорри тама 1 и 2 а не 2 и 3 (копировал с теста, проверял не обману ли smile )
PM MAIL   Вверх
Shiirx
Дата 6.12.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Опять что-то не так :(
Делаю так: File-New->Project->MFC Application
Удаляю, всё что есть на форме (две кнопки и надпись), добавляю BITMAP1 и BITMAP2, на форму бросаю: две штуки Picture Control (для BITMAP1 и BITMAP2). Добавляю кнопку: Button1 

В первой указываю:

- Center Image        True
- Type                      Bitmap
- Image                    IDB_BITMAP1 (IDB_BITMAP2 - для 2-й картинки)
- ID                           IDB_BITMAP1 (IDB_BITMAP2 - для 2-й картинки)
- Visible                     True (False - для 2-й картинки)


Во второй указываю:

- Center Image        True
- Type                      Bitmap
- Image                    IDB_BITMAP2
- ID                          IDB_BITMAP2
- Visible                    False
Получаем Test.rc:

Код

//////////////////////////////////////////////////
//
// Dialog
//

CONTROL         130,IDB_BITMAP1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,0,319,199
CONTROL         132,IDB_BITMAP2,"Static",SS_BITMAP | SS_CENTERIMAGE | NOT WS_VISIBLE,0,0,320,200
PUSHBUTTON      "Button1",IDC_BUTTON1,251,10,50,14

//////////////////////////////////////////////////
//
// Bitmap
//

IDB_BITMAP1             BITMAP                  "res\\Bit_1.bmp"
IDB_BITMAP2             BITMAP                  "res\\Bit_2.bmp"



В обработку кнопки вписываю:

Код

void CTestDlg::OnBnClickedButton1()
{
 if (myOk)
  {
    GetDlgItem(IDB_BM1)->ShowWindow(SW_SHOW);
    GetDlgItem(IDB_BM2)->ShowWindow(SW_HIDE);
  }
  else
  {
    GetDlgItem(IDB_BM2)->ShowWindow(SW_SHOW);
    GetDlgItem(IDB_BM1)->ShowWindow(SW_HIDE);
  }
  myOk = !myOk;
}



В итоге: Не работает! 
И ещё, чёт я не понял, куда я должен вписать:
Цитата(mantissa @  6.12.2007,  18:30 Найти цитируемый пост)
BOOL myOk; или счетчик времени тож  придется добавить в класс окна

???
Где, что не так сделал?

Добавлено через 2 минуты и 53 секунды
P.S.
Что такое:
- myOk
- IDB_BM2 и IDB_BM1
Откуда они взялись???
PM MAIL WWW   Вверх
zkv
Дата 6.12.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(Shiirx @  6.12.2007,  20:28 Найти цитируемый пост)
- myOk

просто флаг чтобы контролировать последнее положение, определить нужно примерно так в классе диалога:
Код

bool myOk;

это будет правильнее идеологически.
или можно сделать статиком, до определенного момента это тоже будет верно работать:
Код

void CTestDlg::OnBnClickedButton1()
{
static bool myOk = true;
 if (myOk)
  {
    GetDlgItem(IDB_BM1)->ShowWindow(SW_SHOW);
    GetDlgItem(IDB_BM2)->ShowWindow(SW_HIDE);
  }
  else
  {
    GetDlgItem(IDB_BM2)->ShowWindow(SW_SHOW);
    GetDlgItem(IDB_BM1)->ShowWindow(SW_HIDE);
  }
  myOk = !myOk;
}


Цитата(Shiirx @  6.12.2007,  20:28 Найти цитируемый пост)
- IDB_BM2 и IDB_BM1

это ID статик-контролов на диалоге.

Это сообщение отредактировал(а) zkv - 6.12.2007, 20:37
PM MAIL   Вверх
Shiirx
Дата 7.12.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мой вариант (исправленный mantissa):

Код

void CTestDlg::OnBnClickedButton1()
{
    if (GetDlgItem(IDB_BITMAP2)->ShowWindow(SW_SHOW))
    {
    GetDlgItem(IDB_BITMAP2)->ShowWindow(SW_HIDE);
         GetDlgItem(IDB_BITMAP1)->ShowWindow(SW_SHOW);
    }
    else
    {
         GetDlgItem(IDB_BITMAP1)->ShowWindow(SW_HIDE);
          GetDlgItem(IDB_BITMAP2)->ShowWindow(SW_SHOW);
    }
}


Откуда вы взяли: IDB_BM1??? Там же: IDB_BITMAP1

P.S. Всем огромное спасибо smile Но это ещё не всё  smile 
PM MAIL WWW   Вверх
Shiirx
Дата 7.12.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Теперь надо из этого сделать анимацию, т.е. картинки должны меняться по таймеру:
Код

void CTestDlg::OnTimer(UINT nIDEvent)
{
    if (GetDlgItem(IDB_BITMAP1)->ShowWindow(SW_SHOW))
    {
    GetDlgItem(IDB_BITMAP1)->ShowWindow(SW_HIDE);
         GetDlgItem(IDB_BITMAP2)->ShowWindow(SW_SHOW);
    }
    else
    {
    GetDlgItem(IDB_BITMAP1)->ShowWindow(SW_SHOW);
         GetDlgItem(IDB_BITMAP2)->ShowWindow(SW_HIDE);
    }
}


Получается что-то вроде анимации из 2-х картинок, но мне надо сделать из Большего количества...

Код

void CTestDlg::OnTimer(UINT nIDEvent)
{
    if (GetDlgItem(IDB_BITMAP1)->ShowWindow(SW_SHOW))
    {
    GetDlgItem(IDB_BITMAP1)->ShowWindow(SW_HIDE);
    GetDlgItem(IDB_BITMAP3)->ShowWindow(SW_HIDE);
         GetDlgItem(IDB_BITMAP2)->ShowWindow(SW_SHOW);
    }
    if (GetDlgItem(IDB_BITMAP2)->ShowWindow(SW_SHOW))
    {
    GetDlgItem(IDB_BITMAP1)->ShowWindow(SW_SHOW);
         GetDlgItem(IDB_BITMAP2)->ShowWindow(SW_HIDE);
    GetDlgItem(IDB_BITMAP3)->ShowWindow(SW_SHOW);
    }
    if (GetDlgItem(IDB_BITMAP3)->ShowWindow(SW_SHOW))
    {
         GetDlgItem(IDB_BITMAP3)->ShowWindow(SW_HIDE);
    GetDlgItem(IDB_BITMAP2)->ShowWindow(SW_HIDE);
         GetDlgItem(IDB_BITMAP1)->ShowWindow(SW_SHOW);
    }
}


Код не работает, вернее вроде работает (мигает что-то) но картинка не меняется..
Может кто-нибудь, что-нибудь предложит?

P.S.
У меня они должны меняться каждую секнду
PM MAIL WWW   Вверх
mantissa
Дата 7.12.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да конечно... виноват... у себя сократил BitMap до BM - это идентификаторы рисунков, их можно сделать любое (пока ресурсов хватит) кол-во
пущай их будет 8
нарисуем в любом редакторе 8 bmp-шек
например на первой стрелки часов показывают 12 часов
на второй половину второго
на третьей - 3 часа 
и т.д
...
в ресурсах заводим 10 картинок-control-ов, занимающих одно и то же место
и с возрастающими по порядку номерами например: IDB_BM1=5001,  IDB_BM2=5002,... 5008 т.е.:
в файле resource.h (по умолчанию вроде так называется) будет
Код

...
#define IDB_BM1   5001
#define IDB_BM2   5002
...
#define IDB_BM8   5008
#define ID_PIC1     501
...
#define ID_PIC8     508
...

в файле имя.rc  :
Код

//////////////////////////////////////////////////
// Dialog
CONTROL         ID_PIC1, IDB_BM1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,0,320,200
CONTROL         ID_PIC2, IDB_BM2,"Static",SS_BITMAP | SS_CENTERIMAGE | NOT WS_VISIBLE,0,0,320,200
...
CONTROL         ID_PIC8, IDB_BM8,"Static",SS_BITMAP | SS_CENTERIMAGE | NOT WS_VISIBLE,0,0,320,200
PUSHBUTTON      "Button1",IDC_BUTTON1,251,10,50,14
//////////////////////////////////////////////////
// Bitmap
ID_PIC1             BITMAP                  "res\\pic_1.bmp"
ID_PIC2             BITMAP                  "res\\pic_2.bmp"
...
ID_PIC8             BITMAP                  "res\\pic_8.bmp"


в классе диалога (или вообще приложения) заводим счетчик времени - например 
INT nTime = 0; (или обнуляем его в конструкторе диалога) 

в методе void CTestDlg::OnTimer(UINT nIDEvent) гасим одно окно с картинкой и показываем другое:
Код

...
    GetDlgItem(IDB_BM1+nTime )->ShowWindow(SW_HIDE);
    nTime ++;
    if (nTime > 7) nTime = 0;
    GetDlgItem(IDB_BM1+nTime )->ShowWindow(SW_SHOW);
...

GetDlgItem(INT) - возвращает указатель на дочернее окно указанное идентификатором 'IDB_BMnnn', а мы пользуем метод любого окна ShowWindow
а эти окна уже содержат загруженные из ресурсов картинки. Их при создании диалога загрузит метод OnCreate


PM MAIL   Вверх
Shiirx
Дата 7.12.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И так...
Немного исправил код, и вот что получаем:

Код

void CTestDlg::OnTimer(UINT nIDEvent)
{
static    int nTime = 0;
GetDlgItem(IDB_BITMAP1+nTime )->ShowWindow(SW_SHOW);
nTime++;
if (nTime > 3) nTime = 0;
GetDlgItem(IDB_BITMAP1+nTime )->ShowWindow(SW_HIDE);
}


при нажатии на кнопку появляется сообщение:

Unhandled exception at 0x0051c4ea in Test.exe: 0xC0000005: Access violation reading location 0x00000020.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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