Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.211.173] |
|
Сообщ.
#1
,
|
|
|
Сейчас у меня изображение рисуется как-бы поверх статика. Как рисовать в нем?
SetBitmap не подходит, т.к. нет изменения размеров изображения под контрол. BOOL CFileMappingDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here myStatic.Create(NULL, WS_BORDER|WS_CHILD|WS_VISIBLE|SS_BITMAP| SS_CENTERIMAGE, CRect(10,10,250,250), this, 11001); return TRUE; // return TRUE unless you set the focus to a control } void CFileMappingDlg::DrawImage(CPaintDC* dc) { // Получить область рисования CRect rClientRect; myStatic.GetClientRect(rClientRect); //GetClientRect(rClientRect); rClientRect.NormalizeRect(); // Параметры рисования //const int iDisp = 1;// Отступы от краев клиентской области int iWidth = rClientRect.Width() - 2/* * iDisp*/; // Ширина области рисования int iHeight = rClientRect.Height() - 2/* * iDisp*/; // Высота области рисования HBITMAP hbitmap = (HBITMAP) ::LoadImage(AfxGetInstanceHandle(), "c:\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); //myStatic.SetBitmap( hbitmap ); if(hbitmap){// Файл успешно загружен // Создаем экземпляр класса CBitmap CBitmap m_Bitmap; // Прикрепляем загруженный рисунок к объекту класса m_Bitmap.Attach(hbitmap); // Создать родную структуру для объекта класса CBitmap BITMAP bm; // Перекачать загруженное в структуру HBITMAP изображение // в родную для объекта m_Bitmap структуру BITMAP m_Bitmap.GetBitmap(&bm); // Создать совместимый контекст устройства в памяти // по переданному в функцию параметру CPaintDC* dc CDC dcMem; dcMem.CreateCompatibleDC(dc); // Поместить растровое изображение в dc памяти dcMem.SelectObject(m_Bitmap); // Может адрес? // Копировать и изменить размеры точечного // рисунка по диалоговому окну холста dc->StretchBlt(rClientRect.top, rClientRect.left, iWidth, iHeight,// Приемник: dc экрана &dcMem, 0, 0, bm.bmWidth, bm.bmHeight,// Источник: dc памяти SRCCOPY); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CFileMappingDlg::OnPaint() { CPaintDC dc(this); // Локальный контекст устройства DrawImage(&dc); } И еще, при переносе функции LoadImage в OnInitDialog, загрузка происходит, но при перетаскивании окна картинка пропадает. |
Сообщ.
#2
,
|
|
|
1. добавь переменную типа CStatic при помощи визарда на диалоге
унаследуйся от CStatic и перегрузи там OnPaint замени тип переменной со CStatic на производный класс. После этого у тебя будет отдельный класс, отвечающий за работу статика Цитата TechnoMag @ И еще, при переносе функции LoadImage в OnInitDialog, загрузка происходит, но при перетаскивании окна картинка пропадает. Цитата TechnoMag @ m_Bitmap.Attach(hbitmap); деструктор заберет с собой хендл в небытие, то есть вызовет DeleteObject нужно после окончания использования вызывать Detach, либо Attach сделать единожды после LoadImage |
Сообщ.
#3
,
|
|
|
По первому пункту ничего не понял.
- не могу добавить переменную типа CStatic при помощи визарда. В нем есть только стандартные типы. VS 2008 - "замени тип переменной со CStatic на производный класс" ?? - разве у статика есть OnPaint? подробней пожалуйста объясните. У меня щас получается, что при перемещении окна все контролы в нем затираются. Прикреплённый файлFileMapping1.zip (44,72 Кбайт, скачиваний: 132) |
Сообщ.
#4
,
|
|
|
Цитата TechnoMag @ - не могу добавить переменную типа CStatic при помощи визарда. В нем есть только стандартные типы. VS 2008 в редакторе ресурсов на диалог бросаешь статик, даешь ему идентификатор. Затем правой кнопкой по этому статику и Add Variable, там поставишь галочку на Control Variable, введешь название и выберешь тип. Если вручную, то идешь в класс диалога и в функции DoDataExchange производишь связывание переменной контрола с самим контролом на статике при помощи макроса DDX_Control Цитата TechnoMag @ это ты уже сделал- "замени тип переменной со CStatic на производный класс" ?? осталось передать хендл битмапа в объект класса производного от CStatic, иначе статик не узнает ничего о картинке Цитата TechnoMag @ - разве у статика есть OnPaint? зачем спрашивать, если ты уже попробовал? OnPaint это обработчик сообщения WM_PAINT, которое есть у всех окон. Цитата TechnoMag @ У меня щас получается, что при перемещении окна все контролы в нем затираются. сделай все правильно со статиком и будет все нормально. только проследи за hbitmap. мало того что нужно делать detach, так у тебя еще есть SelectObject, а то что выбираешь в контекст, нужно возвращать назад по завершению OnPaint... |
Сообщ.
#5
,
|
|
|
Вы меня запутали. Сначала вы говорите о переменной, потом откуда-то появляется производный класс.
Цитата в редакторе ресурсов на диалог бросаешь статик, даешь ему идентификатор. Затем правой кнопкой по этому статику и Add Variable, там поставишь галочку на Control Variable, введешь название и выберешь тип. Переменную создал, но как тогда создать отдельный класс? И нужен ли он вообще? Цитата После этого у тебя будет отдельный класс, отвечающий за работу статика Я так понимаю должны быть файлы mystatic.cpp и mystatic.h как в первом атаче, но я это делал через AddClass, потом вручную сделал класс членом диалога. И динамически создал статик производного класса. И рисовать битмап нужно в OnPaint производного класса или в OnPaint диалога все-таки? |
Сообщ.
#6
,
|
|
|
Цитата TechnoMag @ Переменную создал, но как тогда создать отдельный класс? И нужен ли он вообще? ну ты же хотел в статике рисовать... поэтому нужен. отдельный класс создаётся отдельной операцией и с созданием переменной не имеет ничего общего. Только нужно у конечной переменной в конце заменить CStatic на свой класс. это у тебя тоже сделано было Цитата TechnoMag @ Я так понимаю должны быть файлы mystatic.cpp и mystatic.h как в первом атаче, но я это делал через AddClass, потом вручную сделал класс членом диалога. И динамически создал статик производного класса. да я видел как ты сделал. класс создал, и статик динамический. А я объяснял как его привязать к ресурсу диалога. Цитата TechnoMag @ И рисовать битмап нужно в OnPaint производного класса или в OnPaint диалога все-таки? в OnPaint производного класса, ибо нафига эти танцы вообще нужны были .... Цитата TechnoMag @ Вы меня запутали. Сначала вы говорите о переменной, потом откуда-то появляется производный класс. на форуме я про это объяснял уже с десяток раз и обычно никто не путался... |
Сообщ.
#7
,
|
|
|
В общем отобразить битмап в статике получилось. Вы говорили, что нужно освободить контекст устройства после рисования, кроме этих операций
m_Bitmap.Detach(); dcMem->DeleteDC(); dc->DeleteDC(); нужно еще что-то делать? Связанное с SelectObject ... |
Сообщ.
#8
,
|
|
|
Цитата TechnoMag @ В общем отобразить битмап в статике получилось. Вы говорили, что нужно освободить контекст устройства после рисования, кроме этих операций я не говорил про освобождение контекста... почитай Рисование в DC, будет полезней, чем я буду каждое недопонимание пытаться объяснить |