Jump to content
Software FX Community

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


Software FX

Recommended Posts

dc.GetDeviceCaps()

Is not MFC ????

MFC keeps TWO hDC inside de CDC, that's why you get a result. The print

preview in MFC DOES crate a memory DC.

If you are printing directly to a Printer DC, just remove all scalling (map

one logical pixel to 1 physical pixel) and call Paint with CPAINT_PRINT,

Chart FX will make the appropriate conversions.

--

Frank

SFX

"Petr Prikryl"

<Answer.via.news.please.prikrylp@nospam.skil.nospam.cz.nospam> wrote in

message news:gR8ukMmEAHA.1416@sfxserver.softwarefx.com...

> (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...