Настройка режимов отображения SetMapMode
От: RDim Россия  
Дата: 13.10.05 11:51
Оценка:
Рисование CPen в окне и в метафайле с настройкой различной толщины линий в режиме по умолчанию MM_TEXT не вызывает вопросов. После установки режима MM_ANISOTROPIC, настройки координат и масштаба, рисование при толщине линий больше нуля происходит масштабирование линии (значительное утолщение), а если установить в ноль то в окне линия видна но метафайл печатается уже без неё.
Пробывал различные варианты настройки конструктора CPen — результат тот же.
Спасибо за советы.
Re: Настройка режимов отображения SetMapMode
От: rus blood Россия  
Дата: 13.10.05 12:12
Оценка:
Здравствуйте, RDim, Вы писали:

RD>Рисование CPen в окне и в метафайле с настройкой различной толщины линий в режиме по умолчанию MM_TEXT не вызывает вопросов. После установки режима MM_ANISOTROPIC, настройки координат и масштаба, рисование при толщине линий больше нуля происходит масштабирование линии (значительное утолщение), а если установить в ноль то в окне линия видна но метафайл печатается уже без неё.

RD>Пробывал различные варианты настройки конструктора CPen — результат тот же.
RD>Спасибо за советы.

Показывай код настройки режима DC и масштабирования.
Имею скафандр — готов путешествовать!
Re[2]: Настройка режимов отображения SetMapMode
От: RDim Россия  
Дата: 13.10.05 12:35
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Показывай код настройки режима DC и масштабирования.


CClientDC dc( this );
CMetaFileDC MFDC;
MFDC.CreateEnhanced(0, "UPU.wmf", 0, "");

CPen penS(PS_SOLID, 1, RGB(200, 200, 200));
CPen* oldPenS=dc.SelectObject(&penS);
oldPenS=MFDC.SelectObject(&penS);

.....//рисуем

LOGBRUSH lb;
lb.lbStyle = BS_SOLID;
lb.lbColor = RGB(0,0,0);
lb.lbHatch = 0;
CPen pen1;
pen1.CreatePen(PS_SOLID | PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_ROUND, 1, &lb);//Один из вариантов
CPen* oldPen1=dc.SelectObject(&pen1);
oldPen1=MFDC.SelectObject(&pen1);

dc.SetMapMode(MM_ANISOTROPIC);
dc.SetWindowExt(13, 200);
dc.SetViewportExt(XW, -YW);
dc.SetViewportOrg(x0, YW+y0);

MFDC.SetMapMode(MM_ANISOTROPIC);
MFDC.SetWindowExt(13, 200);
MFDC.SetViewportExt(XW, -YW);
MFDC.SetViewportOrg(x0, YW+y0);

.....//рисуем

::DeleteEnhMetaFile( MFDC.CloseEnhanced() );
Re[3]: Настройка режимов отображения SetMapMode
От: rus blood Россия  
Дата: 13.10.05 12:39
Оценка:
Здравствуйте, RDim, Вы писали:

RD>dc.SetMapMode(MM_ANISOTROPIC);
RD>dc.SetWindowExt(13, 200);
RD>dc.SetViewportExt(XW, -YW);
RD>dc.SetViewportOrg(x0, YW+y0);

RD>MFDC.SetMapMode(MM_ANISOTROPIC);
RD>MFDC.SetWindowExt(13, 200);
RD>MFDC.SetViewportExt(XW, -YW);
RD>MFDC.SetViewportOrg(x0, YW+y0);



И чему равны XW, YW ?
Имею скафандр — готов путешествовать!
Re[4]: Настройка режимов отображения SetMapMode
От: RDim Россия  
Дата: 13.10.05 12:43
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>И чему равны XW, YW ?


Рамеры картинки в окне XW=450, YW=200.
Re[5]: Настройка режимов отображения SetMapMode
От: rus blood Россия  
Дата: 13.10.05 12:48
Оценка:
Здравствуйте, RDim, Вы писали:

RD>Здравствуйте, rus blood, Вы писали:


RB>>И чему равны XW, YW ?


RD>Рамеры картинки в окне XW=450, YW=200.


Отношение XW к 13 задает увеличение по горизонтали.
Отношение -YW к 200 задает увеличение по вертикали.

Зачем вообще делаешь масштабирование?
Имею скафандр — готов путешествовать!
Re[6]: Настройка режимов отображения SetMapMode
От: RDim Россия  
Дата: 13.10.05 12:56
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Зачем вообще делаешь масштабирование?


Мне так удобно отображать график из массива, по вертикали имеем 200 ед. по горизонтали 14 ед. Данные получаю от прибора по комку а далее после обработки в моей програмке в документы буду отправлять (EXCEL например).
Re: Настройка режимов отображения SetMapMode
От: kmn Украина  
Дата: 13.10.05 14:40
Оценка:
Здравствуйте, RDim, Вы писали:

RD>Рисование CPen в окне и в метафайле с настройкой различной толщины линий в режиме по умолчанию MM_TEXT не вызывает вопросов. После установки режима MM_ANISOTROPIC, настройки координат и масштаба, рисование при толщине линий больше нуля происходит масштабирование линии (значительное утолщение), а если установить в ноль то в окне линия видна но метафайл печатается уже без неё.


Дело в том, что нуливая толщина линии означает то, что линия всегда будет рисоваться толшиной в один __Физический__ пиксел т.е. не зависит от масштаба. Может по этой причине ее и не видно (а может драйвер выкидывает) при печати.
Re[2]: Настройка режимов отображения SetMapMode
От: RDim Россия  
Дата: 13.10.05 14:59
Оценка:
Здравствуйте, kmn, Вы писали:

kmn>Дело в том, что нуливая толщина линии означает то, что линия всегда будет рисоваться толшиной в один __Физический__ пиксел т.е. не зависит от масштаба. Может по этой причине ее и не видно (а может драйвер выкидывает) при печати.


Я согласен что линия всегда будет рисоваться толшиной в один __Физический__ пиксел, но мне не понятно, есть ли возможность настроить CPen чтобы в метафайле он был нужной толщины или придется обходить масштабирование, а это не совсем удобно.
Кроме CPen чем еще можно рисовать линии?
Re[3]: Настройка режимов отображения SetMapMode
От: kmn Украина  
Дата: 13.10.05 15:25
Оценка:
Здравствуйте, RDim, Вы писали:

RD>Здравствуйте, kmn, Вы писали:


kmn>>Дело в том, что нуливая толщина линии означает то, что линия всегда будет рисоваться толшиной в один __Физический__ пиксел т.е. не зависит от масштаба. Может по этой причине ее и не видно (а может драйвер выкидывает) при печати.


RD>Я согласен что линия всегда будет рисоваться толшиной в один __Физический__ пиксел, но мне не понятно, есть ли возможность настроить CPen чтобы в метафайле он был нужной толщины или придется обходить масштабирование, а это не совсем удобно.

RD>Кроме CPen чем еще можно рисовать линии?

Если Вам надо чтобы в метафайле линия была толщиной в 10 пикселей, то надо так:
CSize size(10, 10);
pDC->DPtoLP(&size);
size.cx и size.cy — толщин линии
Re[3]: Настройка режимов отображения SetMapMode
От: rus blood Россия  
Дата: 14.10.05 10:15
Оценка:
Здравствуйте, RDim, Вы писали:

RD>Здравствуйте, kmn, Вы писали:


kmn>>Дело в том, что нуливая толщина линии означает то, что линия всегда будет рисоваться толшиной в один __Физический__ пиксел т.е. не зависит от масштаба. Может по этой причине ее и не видно (а может драйвер выкидывает) при печати.


RD>Я согласен что линия всегда будет рисоваться толшиной в один __Физический__ пиксел, но мне не понятно, есть ли возможность настроить CPen чтобы в метафайле он был нужной толщины или придется обходить масштабирование, а это не совсем удобно.

RD>Кроме CPen чем еще можно рисовать линии?

Насколько я понимаю, масштабирование в DC происходит непосредственно при выводе на девайс, и происходит это растровым способом. Т.е. ты что-то нарисовал pen-ом на логической поверхности, а потом это растровым способом масштабируется на экран (принтер).

Здесь
Автор: McSeem2
Дата: 28.09.05
и здесь
Автор: McSeem2
Дата: 29.09.05
есть обсуждение бед растрового вывода.
Имею скафандр — готов путешествовать!
Re[4]: Настройка режимов отображения SetMapMode
От: RDim Россия  
Дата: 14.10.05 14:09
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Насколько я понимаю, масштабирование в DC происходит непосредственно при выводе на девайс, и происходит это растровым способом. Т.е. ты что-то нарисовал pen-ом на логической поверхности, а потом это растровым способом масштабируется на экран (принтер).


Масштабируются области относительно друг друга для удобства восприятия информации и, само сабой, конечный результат — это растровое изображение, потому что физические свойства устройств визуализации иначе не могут. Но результат обработки сохраняется либо массивом (который не очень то удобно воспринимать), либо в векторе (wmf), а вектор это вектор.

Вы писали: ты что-то нарисовал pen-ом на логической поверхности, а потом это растровым способом масштабируется...
Наоборот, сначала масштабирование, а затем уже и рисование. Как там уж, я не знаю, усроен процесс pen-а, но получается так, чем больше разница масштаба областей, тем больше пятно pen-а. До масштабирования pen=1 и рисует в 1 пик., а после масштабирования при разнице, например, в десять и pen рисует в 10 пик при pen=1.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.