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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание нескольких растровых изображений 
V
    Опции темы
Mikron
Дата 28.10.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



добрый день, помогите решить вопрос
пусть нужно создать два растровых образа
почему в этом случае они создаются оба
Код

void risov_simv1(HWND hwnd)
{
    BYTE knop1 []    = {    0xFD, 0xF0,
                0xF9, 0xF0,
                0xF5, 0xF0,
                0xED, 0xF0,
                0xDD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0};

    BYTE knop2 []    = {    0xFD, 0xF0,
                0xF9, 0xF0,
                0xF5, 0xF0,
                0xED, 0xF0,
                0xDD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0};

                
    BITMAP bitmap1    = {    0, 12,12, 2 , 1, 1      };
    BITMAP bitmap2    = {    0, 12,12, 2 , 1, 1      };

    HBITMAP    hBitmap1, hBitmap2;
    HDC        hdcMem1,hdcMem2,hdc;
    PAINTSTRUCT    ps;
    POINT        ptSize, ptOrg;
    hdc = BeginPaint(hwnd, &ps);
    bitmap1.bmBits = (LPVOID) knop1;
    bitmap2.bmBits = (LPVOID) knop2;
    hBitmap1    = CreateBitmapIndirect (&bitmap1);            //создаем битовый образ        
    hBitmap2    = CreateBitmapIndirect (&bitmap2);     
    hdcMem1    = CreateCompatibleDC(hdc);                 //создаем контекст памяти
    hdcMem2    = CreateCompatibleDC(hdc);                               
    (HBITMAP)SelectObject(hdcMem1, hBitmap1);                    //выбираем к контекст памяти битовый образ
    (HBITMAP)SelectObject(hdcMem2, hBitmap2);                   
    SetMapMode(hdcMem1, GetMapMode(hdc)); 
    SetMapMode(hdcMem2, GetMapMode(hdc));                          
    GetObject(hBitmap1, sizeof(BITMAP),(LPVOID) &bitmap1); 
    GetObject(hBitmap2, sizeof(BITMAP),(LPVOID) &bitmap2);            
    ptSize.x = bitmap1.bmWidth;                                     
    ptSize.y = bitmap2.bmHeight;                                    
    DPtoLP(hdc, &ptSize, 1);                                       
    ptOrg.x = 0;                                                     
    ptOrg.y = 0;                                                   
    DPtoLP(hdcMem1, &ptOrg, 1);
    DPtoLP(hdcMem2, &ptOrg, 1);                                      
    BitBlt( hdc, 10, 10, ptSize.x, ptSize.y,
                hdcMem1, ptOrg.x, ptOrg.y, SRCCOPY); 
    BitBlt( hdc, 100, 100, ptSize.x, ptSize.y,
                hdcMem2, ptOrg.x, ptOrg.y, SRCCOPY);                                                                            
    EndPaint(hwnd, &ps);
    DeleteDC(hdcMem1); 
    DeleteObject(hBitmap1); 
    DeleteDC(hdcMem2); 
    DeleteObject(hBitmap2); 
}

...
case WM_PAINT:
    risov_simv1(hwnd);


а в этом создается только вызываемое функцией risov_simv1
Код

void risov_simv1(HWND hwnd)
{
    BYTE byBits []    = {    0xFD, 0xF0,
                0xF9, 0xF0,
                0xF5, 0xF0,
                0xED, 0xF0,
                0xDD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0};
                
    BITMAP bitmap    = {    0, 12,12, 2 , 1, 1      };

    HBITMAP    hBitmap, hBitmap1;
    HDC        hdcMem, hdc;
    PAINTSTRUCT ps;
    POINT        ptSize, ptOrg;
    hdc = BeginPaint(hwnd, &ps);
    bitmap.bmBits = (LPVOID) byBits;
    hBitmap    = CreateBitmapIndirect (&bitmap);    
    hdcMem    = CreateCompatibleDC(hdc);                                
    hBitmap1 = (HBITMAP)SelectObject(hdcMem, hBitmap);                 
    if(hBitmap1)
    {
        SetMapMode(hdcMem, GetMapMode(hdc));                          
        GetObject(hBitmap, sizeof(BITMAP),(LPVOID) &bitmap);            
        ptSize.x = bitmap.bmWidth;                                     
        ptSize.y = bitmap.bmHeight;                                    
        DPtoLP(hdc, &ptSize, 1);                                       
        ptOrg.x = 0;                                                     
        ptOrg.y = 0;                                                   
        DPtoLP(hdcMem, &ptOrg, 1);                                      
        BitBlt( hdc, 10, 10, ptSize.x, ptSize.y,
                hdcMem, ptOrg.x, ptOrg.y, SRCCOPY);                        
        SelectObject(hdcMem,hBitmap1);
    }
    EndPaint(hwnd, &ps);
    DeleteDC(hdcMem); 
    DeleteObject(hBitmap);
    DeleteObject(hBitmap1);                                                
}

void risov_simv2(HWND hwnd)
{
    BYTE byBits []    = {    0xFD, 0xF0,
                0xF9, 0xF0,
                0xF5, 0xF0,
                0xED, 0xF0,
                0xDD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0,
                0xFD, 0xF0};
                
    BITMAP bitmap    = {    0, 12,12, 2 , 1, 1      };

    HBITMAP    hBitmap, hBitmap1;
    HDC        hdcMem, hdc;
    PAINTSTRUCT ps;
    POINT        ptSize, ptOrg;
    hdc = BeginPaint(hwnd, &ps);
    bitmap.bmBits = (LPVOID) byBits;
    hBitmap    = CreateBitmapIndirect (&bitmap);    
    hdcMem    = CreateCompatibleDC(hdc);                                
    hBitmap1 = (HBITMAP)SelectObject(hdcMem, hBitmap);                 
    if(hBitmap1)
    {
        SetMapMode(hdcMem, GetMapMode(hdc));                          
        GetObject(hBitmap, sizeof(BITMAP),(LPVOID) &bitmap);            
        ptSize.x = bitmap.bmWidth;                                     
        ptSize.y = bitmap.bmHeight;                                    
        DPtoLP(hdc, &ptSize, 1);                                       
        ptOrg.x = 0;                                                     
        ptOrg.y = 0;                                                   
        DPtoLP(hdcMem, &ptOrg, 1);                                      
        BitBlt( hdc, 100, 100, ptSize.x, ptSize.y,
                hdcMem, ptOrg.x, ptOrg.y, SRCCOPY);                        
        SelectObject(hdcMem,hBitmap1);
    }
    EndPaint(hwnd, &ps);
    DeleteDC(hdcMem); 
    DeleteObject(hBitmap);
    DeleteObject(hBitmap1);
}
...
case WM_PAINT:
    risov_simv1(hwnd);
    risov_simv2(hwnd);


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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Почему бы тебе не написать функцию для создания растра и просто вызываеть ее дважды с разными параметрами? Глядишь, и найдешь свою ошибку...


--------------------
...
PM   Вверх
mekhanikus
Дата 29.10.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


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

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



Попробуй брать hdc окна в обработчике WM_PAINT (BeginPaint) и передавать его в функции risov_simv1 и risov_simv2.
После выхода из функций делай EndPaint.

А по-хорошем, надо подготовить hdcMem с BitMap в процедуре WM_CREATE, а затем в WM_PAINT делать только BitBlt.
PM MAIL   Вверх
Mikron
Дата 31.10.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



огромное спасибо за помощь, сделал так 
Код

void risov_simv(HDC hdc, BYTE byBits [], int xStart, int yStart)
{
    BITMAP bitmap    = {    0, 12,12, 2 , 1, 1      };
    HDC        hdcMem;
    HBITMAP    hBitmap;
    POINT        ptSize, ptOrg;
    bitmap.bmBits = (LPVOID) byBits;
    hBitmap    = CreateBitmapIndirect (&bitmap);    
    hdcMem    = CreateCompatibleDC(hdc);                                
    (HBITMAP)SelectObject(hdcMem, hBitmap);                 
    SetMapMode(hdcMem, GetMapMode(hdc));                          
    GetObject(hBitmap, sizeof(BITMAP),(LPVOID) &bitmap);            
    ptSize.x = bitmap.bmWidth;                                     
    ptSize.y = bitmap.bmHeight;                                    
    DPtoLP(hdc, &ptSize, 1);                                       
    ptOrg.x = 0;                                                     
    ptOrg.y = 0;                                                   
    DPtoLP(hdcMem, &ptOrg, 1);                                      
    BitBlt( hdc, xStart, yStart, ptSize.x, ptSize.y,
            hdcMem, ptOrg.x, ptOrg.y, SRCCOPY);                        
    DeleteDC(hdcMem); 
    DeleteObject(hBitmap);                                               
}
...
case WM_CREATE:    
    return 0;
case WM_PAINT:
    HDC hdc;
    PAINTSTRUCT ps;
    hdc = BeginPaint(hwnd, &ps);
    risov_simv(hdc, kn1, 10, 10);   
    risov_simv(hdc, kn1, 100, 100);  
    EndPaint(hwnd, &ps);
    return 0;


но как разделить по сообщениям WM_CREATE и WM_PAINT не разобрался. 
ведь для hdcMem нужен hdc, а его мы можем получить при обработке сообщения WM_PAINT 
hdc = BeginPaint(hwnd, &ps);

PM MAIL   Вверх
mekhanikus
Дата 1.11.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


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

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



Цитата(Mikron @  31.10.2009,  19:45 Найти цитируемый пост)
ведь для hdcMem нужен hdc

Например так:
Код

HDC hdc = GetDC(hwnd);
HDC hdcMem = CreateCompatibleDC(hdc);
ReleaseDC(hwnd,hdc);

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


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

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