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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> загрузка Bitmap-a 
:(
    Опции темы
belphegor
Дата 17.3.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.12.2006
Где: Молдова, Кишинев

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



Здравствуйте. У меня возникла проблемма и решил попросить помощи у мудрецов.
Я только начинаю изучать ВинАпи и мне не очень легко в этом разобраться.

Мне нужно выводить в окне картинки, в зависимости от нажатия кнопки.
допустим  у меня есть 3 картинки и кнопка next, сделать так чтоб при нажатии на кнопку картинки чередовались.
  единственное что у меня получилось пока это просто загрузить онду картинку в окно.

case WM_PAINT:
            hDC=BeginPaint(hwnd,&PaintStruct);
            LoadImage(NULL,"4.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
                    
            GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
            hCompatileDC=CreateCompatibleDC(hDC);
            hOldBitmap=SelectObject(hCompatileDC,hBitmap);
            
            GetClientRect(hwnd,&Rect);
            StretchBlt(hDC,0,0,Rect.right,Rect.bottom,hCompatileDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,SRCCOPY);
            SelectObject(hCompatileDC,hOldBitmap);
            DeleteObject(hBitmap);
            DeleteDC(hCompatileDC);
            EndPaint(hwnd,&PaintStruct);
        return 0;
        break;

а как делать дальше не представляю пока,думаю может ктото сможет мне помочь.
В принципе в уме я представляю как это реализовать, но кодом нет.
Буду очень благодарен за помощь. Заранее спасибо.


PM MAIL   Вверх
GremlinProg
Дата 18.3.2007, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Создай массив из 3-х битмапов, и индекс текущего битмапа, загрузи, каждый битмап, в пайнте рисуй текущий. Обработай нажатие кнопки, например так:
Код

case WM_COMMAND:
    switch (LOWORD(wParam)){
        case ID_SWITCH_PIC:{
            if(++PicId > 2){
                PicId = 0;
            }
            ::InvalidateRect(hwnd,0,FALSE);
            break;
        }
}

ID_SWITCH_PIC - идентификатор кнопки Next, установи свое значение. PicId -  индекс текущего битмапа. Вот и все.


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


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.12.2006
Где: Молдова, Кишинев

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



я сделал так

char* str;
s="1.bmp";
........................
case WM_PAINT:
            hDC=BeginPaint(hwnd,&PaintStruct);
            

            LoadImage(NULL,    str     ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
                    
            GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
            hCompatileDC=CreateCompatibleDC(hDC);
            hOldBitmap=SelectObject(hCompatileDC,hBitmap);
            
            GetClientRect(hwnd,&Rect);
            StretchBlt(hDC,0,0,Rect.right,Rect.bottom,hCompatileDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,SRCCOPY);
            SelectObject(hCompatileDC,hOldBitmap);
            DeleteObject(hBitmap);
            DeleteDC(hCompatileDC);
            EndPaint(hwnd,&PaintStruct);
        return 0;
        break;

case WM_COMMAND:
        
        if((HWND) lparam==b1hwnd)  {
                                 
                                   str="2.bmp";           
            
        InvalidateRect(hwnd,0,FALSE);}
        
        break; 
---------------------------------
по идее второй битмап должен заменить первый,но картинка не меняется а остается прежней
то что в команде в иф заходит это точно и str="2.bmp" тоже, я проверял
только вот не перерисовывается в PAINT



PM MAIL   Вверх
GremlinProg
Дата 18.3.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(belphegor @  18.3.2007,  03:37 Найти цитируемый пост)
            LoadImage(NULL,    str     ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
                    
            GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
            hCompatileDC=CreateCompatibleDC(hDC);
            hOldBitmap=SelectObject(hCompatileDC,hBitmap);

LoadImage куда возвращает результат-то?
наверное все таки присваивание нужно сделать:
Код

hBitmap = LoadImage(NULL,    str     ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);



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


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.12.2006
Где: Молдова, Кишинев

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



я так сделал, странно но при вызове invalidate перерисовывается этот же битмап 
Код

#include <windows.h>

#define ID_Edit 101
HINSTANCE hInst;

LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);
HWND b1hwnd,b2hwnd;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{
   
    
    
    


    HWND hwnd;
    MSG msg;
    WNDCLASS w;
    
    memset(&w,0,sizeof(WNDCLASS));
    
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.hCursor=LoadCursor(NULL,IDC_ARROW);
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    w.lpszClassName = "My Class";
    
    RegisterClass(&w);
    
    
    hwnd = CreateWindow("My Class", "First window", WS_OVERLAPPEDWINDOW,0, 0, 600, 350, NULL, NULL, hInstance, NULL);
    
    
    b1hwnd=CreateWindow("button", "Press me", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 10, 80, 30, hwnd, (HMENU)10000, hInstance, NULL);

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


LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{


static HWND hEditWnd;
RECT Rect1;

HDC hDC,hCompatileDC;
PAINTSTRUCT PaintStruct;
HANDLE hBitmap,hOldBitmap,hBitmap1;
RECT Rect;
BITMAP Bitmap;
  

char* str;

     str="3.bmp";
switch (Message){
   
 
    
    
    
    case WM_DESTROY: 
        PostQuitMessage(0);
        break;

       
      case WM_PAINT:
          
            hDC=BeginPaint(hwnd,&PaintStruct);
                             
            hBitmap=LoadImage(NULL,str,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
            GetObject(hBitmap,sizeof(BITMAP),&Bitmap);            
    
            hCompatileDC=CreateCompatibleDC(hDC);
            hOldBitmap=SelectObject(hCompatileDC,hBitmap);
    
            GetClientRect(hwnd,&Rect);
                
            StretchBlt(hDC,0,0,Rect.right,Rect.bottom,hCompatileDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,SRCCOPY);
                            
            SelectObject(hCompatileDC,hOldBitmap);
            DeleteObject(hBitmap);
            DeleteDC(hCompatileDC);
            EndPaint(hwnd,&PaintStruct);
        return 0;
        break;

    
    case WM_COMMAND:
        
        if((HWND) lparam==b1hwnd)  {
            
          str="4.bmp";        
        InvalidateRect(hwnd,NULL,TRUE); 
        
      
        }
        
        break; 
    
    default:
        return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}



Это сообщение отредактировал(а) belphegor - 18.3.2007, 11:23
PM MAIL   Вверх
GremlinProg
Дата 18.3.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



str, объявленная в WndProc инициируется на каждое сообщение, вынеси её из процедуры, тогда все будет нормально, только первый раз не забудь её присвоить "3.bmp".


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


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.12.2006
Где: Молдова, Кишинев

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



Ок , спасибо я как раз сам допер.
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.0719 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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