Jump to content
Software FX Community

Re: CFX98: Font does not scale when Paint() is called?


User (Legacy)

Recommended Posts

(the shortened version of the original article can be

found at the end of this message)

Thanks, Frank, for clarifying the reasons. However,

it seems to me that this does not fully fit to the

observed situation. I think that I need more

information about how the size of fonts is

recalculated. Could you comment this or could you

point to some documentation?

(BTW, I did read the Q1381013, but it was rather

difficult to access the page. The search engine

does not show any link -- probably the missing

title of the document is the reason. I did access

the page finally using

http://support.softwarefx.com/kb/138/1/013.htm

There probably is the logical error in the

article. The second argument in the SetWindowExt()

should probably contain nPrnHeight, not the

nPrnWidth. Another minor problem is that I had to

replace tabs for spaces to be able to print the

HTML page; some code falled out of the right

margin of the paper.)

After the following details, I do ask another

question that is related to scaling the fonts when

the chart is displayed on the screen in a preview

window (hand written code) with THE ZOOM FACTOR

SETTING REQUIRED.

Details on the problem with scaling fonts

-----------------------------------------

I did observe the problem of font scaling in the

situation when the device context was directly

related to a physical printer. When I called the

following just before the chart Paint()...

int xOutRes = dc.GetDeviceCaps(LOGPIXELSX);

int xOutWidth = dc.GetDeviceCaps(HORZRES);

spChartFX->Paint(reinterpret_cast<long>(dc.m_hDC),

rcChart.left, rcChart.top,

rcChart.right, rcChart.bottom,

ChartfxLib::CPAINT_PRINT, 0);

I did obtain xOutRes equal to 600 (HP LaserJet 5) and

xOutWidth equal to 4727 (i.e. 7.8783333... inch) which

corresponds well with the 200mm returned when called

dc.GetDeviceCaps(HORZSIZE).

The dc is the instance of WTL::CDCHandle. I do not

use MFC, nor any "preview code" implemented in WTL.

In other words, there is no special code hidden

behind the scene, and the device context is the

printer's device context (not the memory DC).

I think that the behaviour is somehow related to the

mapping mode which was set as follows (before the

Paint()):

dc.SetMapMode(MM_ANISOTROPIC);

dc.SetWindowExt(2540, 2540);

dc.SetViewportExt(dc.GetDeviceCaps(LOGPIXELSX),

dc.GetDeviceCaps(LOGPIXELSY));

Here the 2540 is one inch in hundredths of

milimeters.

When the same result is printed (physically) to

LaserJet 3 and LaserJet 5, then the default height of

the Y-axis labels is about 0.5 mm for the 300 dpi

printer and about 0.25 mm for 600 dpi printer (hard

to measured, the height on 600dpi printer seems to be

the half of height on 300dpi printer).

I admit that I am not fluent with mapping modes and

there may be some error "between the chair and the

keyboard". But what mistake am I doing?

Related question to displaying chart with scaled font

on the screen

-----------------------------------------------------

This question is closely related to the upper question.

I tried to play with the code based on the one from

the Q1381013 article in situation when the preview is

displayed on the display.

The problem is that the zoom capability is required

here. In other words, the user can choose how big the

preview window or what even what part of the page he

or she wants to look at (window with scrolls with

high magnification -- only the smal part of the page

is visible). Here, the font of the chart should be

scaled according to the current mapping mode

(Window/Viewport ratio).

The chart part of the page should behave as if it was

a picture (fonts scaled to the size for the final

output device). The difference, in comparison with

the hypothetical picture, is no dependency on the

display and/or final output device resolution. I.e.,

the chart should be painted again, but the ratio of

font size to the chart size should be preserved.

I was not successfull to implement the above

mentioned feature. Fonts were always scaled so that

they looked the same size on the display

independently on the zoom factor of the preview.

Am I doing a mistake or is it the CFX98 feature?

Thanks for explanation,

Petr

"Francisco Padron" <frankp@softwarefx.com> wrote...

>

> When CPAINT_PRINT is specified the size of the fonts

> is recalculated based on the resolution of the

> current device context vs. the screen resolution. If

> the device context you are passing is a Memory DC

> (e.g Metafile) this can not be obtained therefore

> the conversion will not be made.

>

> Check out article Q1381013 for more details

[...]

>

> "Petr Prikryl" [...] wrote ...

[...]

> >

> > I do have problem when calling the Paint(). The font

> > which is used for labeling axes (I did not try other

> > fonts) does not scale for different device context

> > while the chart does.

[...]

> > The device context uses MM_ANISOTROPIC mapping mode.

> > The logical coordinates are in 1/100 of mm. The

> > ViewportExt and WindowExt are set differently for a

> > display and for various printers to obtain 1:1

> > visual appearance. The auxiliary ruler marks and

> > some text (painted using the device context) show

> > that the mapping works as desired both on the

> > display and on the tested printers.

> >

> > The chart displayed by Paint() fills correctly the

> > given rectangular area leaving only some (expected)

> > small margins. However, the font on 300 DPI printer

> > is very small. The chart fills the given rectangle

> > correctly again. In other words, the ratio between

> > the font size and the chart-box size changes.

> > I tried to choose a different font name and size,

> > but the problem remains.

[...]

--

Petr Prikryl, SKIL s.r.o., e-mail: prikrylp at skil dot cz

Please, don't reply via e-mail.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...