Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с координатами.. Совсем запутался.. 
:(
    Опции темы
Coocky
Дата 27.1.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Привет!
Нужно скопировать фон диалога под кнопкой в кнопку..
Потерялся с координатами. Копирование происходит в классе кнопки.
Код



Rect rect,rect2;

GetWindowRect(rect);
GetClientRect(rect2);
CEliteAntiKeyLoggerDlg*dlg=(CEliteAntiKeyLoggerDlg*)GetParent();

CDC * c_dc=dlg->GetDC();

dlg->ScreenToClient(rect);

dc.BitBlt(0 ,0 ,rect2.right ,rect2.bottom ,c_dc,rect.left, rect.bottom, SRCCOPY);


Бред получается


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Fixin
Дата 27.1.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


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

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



Код

dc.BitBlt(0, 0, rect2.right-rect2.left, rect2.bottom-rect2.top, c_dc, ddx, ddy, SRCCOPY);


ddx - х координата кнопки в клиентской части родительского диалога
ddу - у координата кнопки в клиентской части родительского диалога

Цитата(Coocky @ 27.1.2006, 12:01 Найти цитируемый пост)

dlg->ScreenToClient(rect);

А это зачем?


И еще: BitBlt - использует логические координаты (как я понял из справки по МФС), а в rect`е - пиксели.
PM MAIL ICQ   Вверх
Coocky
Дата 27.1.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Fixin @ 27.1.2006, 12:20 Найти цитируемый пост)

dlg->ScreenToClient(rect);



А это зачем?

Да переводил координаты кнопки из оконных в родителские, т.е. узнавал положение кнопки от левого верхнего угла окна
Добавлено @ 12:54
Цитата(Fixin @ 27.1.2006, 12:20 Найти цитируемый пост)

ddx - х координата кнопки в клиентской части родительского диалога
ddу - у координата кнопки в клиентской части родительского диалога

Так для этого и делал dlg->ScreenToClient(rect);
Блин ,опять запутался...
Добавлено @ 12:55
Не получается...
Добавлено @ 13:04
Да нет..Вроде все правильно ...просто чето при ресайзинге остается старый фон..
Что же делать?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 27.1.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Если пару раз окно свернуть и востановить, тогда все ОК.
Блин, я уже запарился..


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 27.1.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



По идее, должно быть так:

Код

CRect rBtn;
GetWindowRect(rBtn);          // кнопка в экранных коодинитах
dlg->ScreenToClient(rBtn);   // теперь в координитах клиентской части дилога

dc.BitBlt(0 ,0 ,rBtn.Width() ,rBtn.Height(),c_dc,rBtn.left, rBtn.top, SRCCOPY);


Это если мы находимся в коде кнопки, и dc - ее контекст.

Но копируется-то вовсе не фон, а то что по факту есть на этом месте в контексте. Если контекст не мемори, то большое подозрение, что это вообще одно и то же место в видеопамяти...

И еще, поведение зависит от того, в какой момент этот код вызывается (что до этого нарисовано в контексте).

И проверь, не стоит ли у диалога ClipChildren.




--------------------
...
PM   Вверх
Coocky
Дата 27.1.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 27.1.2006, 13:30 Найти цитируемый пост)

И проверь, не стоит ли у диалога ClipChildren.

Немного опередила меня smile Только что разобрался smile Стоит радимый!
Но если убрать-такое мерцание!!!!
Как быть!
Добавлено @ 13:45
Цитата(Earnest @ 27.1.2006, 13:30 Найти цитируемый пост)

И еще, поведение зависит от того, в какой момент этот код вызывается

В void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)




--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 27.1.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Конечно, будет моргать - место кнопки заливается фоном перед каждой прорисовкой, а с ClipChildren оно из заливки вырезается...

Хотела написать - только через memory context, но подумала: это ж надо в диалоге Paint перехватывать, и подставлять свой контекст, и самому делать отрисовку всех контролов - только так можно гарантировать, что кнопки этот же контекст получат...
В общем, караул, я бы туда не полезла...

Наверно нужно идти другим путем. В чем задача-то состоит? Зачем фон туда-сюда копировать?




--------------------
...
PM   Вверх
Coocky
Дата 27.1.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Вот посмотри на дизайн
Там в правом верхнем углу стоят две кнопки. Посмотри-фон под ними прозрачный! Мне нужно такт сделать, тем более, что у диалога есть ресайзинг, и еще часть верхнего битмпа растягивается..
Что посоветуете-ГОРЮ!!!

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  all.rar 51,45 Kb


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 27.1.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот эта широкая полоса, на которой кнопки стоят - битмапом рисуется, в твоем коде, с помощью StretchBlt?
Тогда так: рисуй сразу в два контекста, сначала в memory-context с растяжением, потом копируй BitBlt в экранный. Потом под кнопками рисуй из мемори. ClipChildren верни взад.


--------------------
...
PM   Вверх
Coocky
Дата 27.1.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 27.1.2006, 14:22 Найти цитируемый пост)

Тогда так: рисуй сразу в два контекста, сначала в memory-context с растяжением, потом копируй BitBlt в экранный. Потом под кнопками рисуй из мемори.

Уф.. Загнула..
Если есть время -подправь
Код

Рисовани кнопки
void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    
CDC dc;

dc.Attach(lpDrawItemStruct->hDC);

CRect rect,rect2;

GetWindowRect(rect);
GetClientRect(rect2);
CEliteAntiKeyLoggerDlg*dlg=(CEliteAntiKeyLoggerDlg*)GetParent();

CDC * c_dc=dlg->GetDC();
dlg->ScreenToClient(rect);
dc.BitBlt(0, 0, rect2.right-rect2.left, rect2.bottom-rect2.top, c_dc, rect.left, rect.top, SRCCOPY);
if(GetDlgCtrlID()==IDC_BUTTON1)
{
dc.DrawIcon(5,5,AfxGetApp()->LoadIcon( IDI_ICON1));
}
if(GetDlgCtrlID()==IDC_BUTTON2)
{
dc.DrawIcon(5,5,AfxGetApp()->LoadIcon( IDI_ICON2));
}

//dc.Draw3dRect(&lpDrawItemStruct->rcItem,RGB(20,200,76),RGB(0,0,190));
dc.Detach();


Диалог
Код

BOOL CEliteAntiKeyLoggerDlg::OnEraseBkgnd(CDC* pDC)
{
    // TODO: Add your message handler code here and/or call default
    
    CRect rect;
    GetClientRect(&rect);
    pDC->BitBlt(0,70,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY);
    bmp2.GetBitmap(&bitmapinfo);
bmp3.GetBitmap(&bitmapinfo2);
//bmp4.GetBitmap(&bitmapinfo3);
int nOldStretchBltMode = pDC->SetStretchBltMode (COLORONCOLOR);
    pDC->BitBlt(0,0,bitmapinfo.bmWidth,bitmapinfo.bmHeight,&memDC1,0,0,SRCCOPY);
    pDC->StretchBlt(bitmapinfo.bmWidth,0,rect.right,bitmapinfo2.bmHeight,&memDC2,0,0,bitmapinfo2.bmWidth,bitmapinfo2.bmHeight,SRCCOPY);
    //pDC->BitBlt(rect.right-bitmapinfo3.bmWidth,0,bitmapinfo3.bmWidth,bitmapinfo3.bmHeight,&memDC3,0,0,SRCCOPY);
    pDC->SetStretchBltMode (nOldStretchBltMode);
    
    return TRUE;
}




--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 27.1.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Я во проще сделал, но результат такой же...
Код

MyButton::MyButton()
{
    m_Bmp.LoadBitmap(IDB_BITMAP21);
    m_Bmp2.LoadBitmap(IDB_BITMAP22);
    imgList.Create(    32, 
                    32, 
                    ILC_COLOR24|ILC_MASK, 1, 0);
    imgList.Add(&m_Bmp, RGB(255,255,255));
    imgList.Add(&m_Bmp2, RGB(255,255,255));
}

Код

void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    
CDC dc;

dc.Attach(lpDrawItemStruct->hDC);

if(GetDlgCtrlID()==IDC_BUTTON1)
{
 CPoint pt( 0,0);
    BOOL z=imgList.Draw(&dc, 0, pt, ILD_TRANSPARENT);
}
if(GetDlgCtrlID()==IDC_BUTTON2)
{
CPoint pt( 0,0);
    BOOL z=imgList.Draw(&dc, 1, pt, ILD_TRANSPARENT);
}
        dc.Detach();
}



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 27.1.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Извини, смысла твоих многочисленных переменных, а также BitBlt и StretchBlt, не понимаю, но коротко я имела в виду следующее:
Допустим, в класе диалога есть мемори-контекст m_BmpMemDC, к которому приаттачен исходный битмап. Еще там есть m_StretchedDC + m_StretchedBmp, соответственно

Далее, в OnEraseBkgnd диалога делаем следующее (пишу только то, что нужно для полосы).

Код


...

m_StretchedBmp = CreateCompatibleBitmap(нужного размера)
m_StretchedDC.SelectObject(m_StretchedBmp);

// растягиваем красивый битмап под нужный размер
m_StretchedDC.StretchBlt( с координатами сам... m_BmpMemDC) 

// копируем в эранный контекст
dc.BitBlt(...m_StretchedDC ...)

...


Все, теперь у нас есть откуда скопировать фон под кнопки

Далее, в Button::OnDrawItem копируем фон не из c_dc (b вообще, он нам больше не нужен), а из m_StretchedDC.
По-моему, должно получится.


--------------------
...
PM   Вверх
Coocky
Дата 27.1.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 27.1.2006, 15:07 Найти цитируемый пост)

Извини, смысла твоих многочисленных переменных, а также BitBlt и StretchBlt, не понимаю, но коротко я имела в виду следующее:

Верхний битмап разделен на две части, т.к. примерно 1/3 слева содержит текст-(у тебя его не видно)
Следовательно я тяну вторуе 2/3, что б текст не расползался.. smile
Сейчас пропробую твой код.. smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 27.1.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Earnest

Запутала smile
Есть три битмапа

bmp1
bmp2
bmp3
есть
CDC memDC1
CDC memDC2
CDC memDC3
Что дальше?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 27.1.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Coocky
Это ты меня запутал.
Я думала, тебе обязательно нужно фон скопировать. А тебе всего лишь нужно его не испортить (хотя, конечно, можно было из твоего кода понять, но я особо не вникала - я же на работе, и меня тут со всех сторон пинают,... т.е. пытаются smile ).
Короче, твой вариант с ImgList и ILD_TRANSPARENT самый нормальный, особенно, если получилось, и нечего тут голову ломать.


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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