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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с риосванием в памяти 
:(
    Опции темы
BSOD
Дата 21.7.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вобщем хочу нарисовать сначала в памяти, а потом на экран вывести

Код

// DC - HDC одного из оконо
// tmpDC = CreateCompatibleDC(DC)
    HPEN OldPen = (HPEN)SelectObject(tmpDC,Brush->Brush);
    ::LineTo(tmpDC,x,y);
    SelectObject(tmpDC,OldPen);
    BitBlt(DC,0,0,Height,Width,tmpDC,0,0,SRCCOPY);


так не работает.... 
если рисовать сразу на DC то все ok

еще пробывал, так для общего развития:
Код

    int H = GetDeviceCaps(DC,HORZSIZE);
    int W = GetDeviceCaps(DC,VERTSIZE);
    HDC dDC = GetDC(0);
    HDC tDC = CreateCompatibleDC(dDC);
    BitBlt(tDC,0,0,H,W,dDC,0,0,SRCCOPY);
    BitBlt(DC,0,0,Height,Width,tDC,0,0,SRCCOPY);


то ж не работает... если копировать из dDC в DC сразу то все OK... 

Это сообщение отредактировал(а) BSOD - 21.7.2006, 17:30


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
MoZy
Дата 21.7.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Мндаа. Сам только вот позавчера парился... Тоже все вроде бы ок, но...

Код


    HDC hdc=BeginPaint(hwnd,&ps); 

    HDC hMemDC = CreateCompatibleDC (hdc);
    HBITMAP bitmap = CreateCompatibleBitmap(hdc,100,20);//вся фишка в этом
    SelectObject(hMemDC,bitmap);
    /*
       если прочитать про CreateCompatibleDC, то там написано, что сначала нужно битмап выбрать.
       впринципе, это логично, ведь надо размеры знать
    */
    
    SetBkMode(hMemDC, TRANSPARENT);
    SetTextColor(hMemDC,RGB(255,0,200));
        
    TextOut(hMemDC,5,5,st,strlen(st));
    
    BitBlt (hdc, 5, 5, 100, 20, hMemDC, 0, 0,SRCCOPY);
    
    DeleteObject(bitmap);
    DeleteDC(hMemDC);

    DeleteDC(hdc);
    EndPaint(hwnd,&ps);


Вот. Код не проверял, так как из функции выдрал и переделал, но точно нужно битмап выбирать, и только потом на нем рисовать  smile 
   

Это сообщение отредактировал(а) MoZy - 21.7.2006, 18:53
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 21.7.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



да, хороший примерчик.
В общем случае после создания HDC и перед любой прорисовкой на нем, нужно выбрать в него BITMAP, который так же можно создать отдельно, например с помощью ::CreateCompatibleBitmap(hdc,width,height), или загрузить из ресурсов, как это сделал MoZy. Нужно только не забывать его удалять.
Перед использованием такого графического устройства, если вы используете смещение координат (например ::SetViewportOrgEx) желательно еще всегда выставлять смещение и на кисть, так как это сделал MoZy в процедуре DrawStrip: SetBrushOrgEx(hdc,x,y,NULL), в остальных случаях будет происходить смещение рисунка, если он достаточно большой и немонотонный, это будет хорошо просматриваться.

Добавлено @ 19:07 
MoZy, зачем код спрятал? Мне писать лень ) 


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


Опытный
**


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

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



Пасиба!!! 
Сам бы никогда не додумался  smile  


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
MoZy
Дата 21.7.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

void DrawBit(HDC hdc,HINSTANCE g_Inst,char *res,int x, int y,int w,int h,DWORD flag)
{
    HDC hMemDC;
    HBITMAP bitmap;
    hMemDC = CreateCompatibleDC (hdc);
        
    bitmap=LoadBitmap(g_Inst,res);
    SelectObject (hMemDC,bitmap);

    BitBlt (hdc, x, y, w, h, hMemDC, 0, 0,flag);

    DeleteDC (hMemDC);
    DeleteObject(bitmap);
    return;
}

void DrawStrip(HDC hdc,HINSTANCE g_Inst,char *res,int x,int y,int w,int h)
{
    HBRUSH my_brush;
    LOGBRUSH my_lb;
    
    my_lb.lbStyle = BS_PATTERN;
    my_lb.lbHatch = (long)LoadBitmap(g_Inst,res);
    my_brush = CreateBrushIndirect(&my_lb);
    SetBrushOrgEx(hdc,x,y,NULL);
    SelectObject(hdc,my_brush);
    
    Rectangle(hdc,x,y,w,h);
   
    DeleteObject((void*)my_lb.lbHatch);
    DeleteObject(my_brush);
    return;
}


void DrawStripRGB(HDC hdc,bool fill,COLORREF rgb,int x,int y,int w,int h)
{
    HBRUSH my_brush;
    LOGBRUSH my_lb;
    HPEN my_pen = CreatePen(fill ? PS_NULL:PS_SOLID,0,rgb);
    SelectObject(hdc,my_pen);
    
    my_lb.lbStyle = fill ? BS_SOLID:BS_HOLLOW;
    
    if(fill) my_lb.lbColor = rgb;
    
    my_brush = CreateBrushIndirect(&my_lb);
    SetBrushOrgEx(hdc,x,y,NULL);
    SelectObject(hdc,my_brush);
    
    Rectangle(hdc,x,y,w,h);
    DeleteObject(my_brush);
    DeleteObject((void*)my_pen);

    return;
}


вот. если кому нада ) 
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0879 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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