Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SSW_8_11.doc
Скачиваний:
0
Добавлен:
17.02.2020
Размер:
5.22 Mб
Скачать

4. The elements of text processing in mfc

Text output in MFC

There are a lot of functions, which simplify the work with graphics in MFC. Mainly they belong to CDC class.

For text output MFC has such function as CDC::TextOut(). That function Writes a character strin at the specified location using the currently selected font. Character origins are at the upper-left corner of the character cell. By default, the current position is not used or updated by the function.

virtual BOOL CDC::TextOut( int x, int y, LPCTSTR lpszString, int nCount );

BOOL CDC::TextOut( int x, int y, const CString& str );

Parameters:

x   Specifies the logical x-coordinate of the starting point of the text.

y   Specifies the logical y-coordinate of the starting point of the text.

lpszString   Points to the character string to be drawn.

nCount   Specifies the number of bytes in the string.

str   A CString object that contains the characters to be drawn.

TextOut() uses the logical coordinates, measured in logical units. In action they are transformed to pixels.

Default, text has black color on the white background. But we can make other settings. Functions SetTextColor and SetBkColor make that.

virtual COLORREF CDC::SetTextColor(COLORREF Color); // sets the text color

virtual COLORREF CDC::SetBkColor(COLORREF Color); // sets the background color

Here COLORREF is 32-bit value. By that value the color can be set.

  1. Color is set in RGB-format – Red, Green, Blue, that means the relative density, which in result get the real color;

COLORREF RGB(BYTE red, BYTE green, BYTE blue);

RGB(255,255,255) // white color

RGB(255,0,255) // bright red color

RGB(0,0,0) // black color

  1. The color value in RGB is set relatively to palette.

The color value in RGB is set in range 0-255 (on density value)

The modes of background reflection

Function SetBkMode() sets the background color seting mode:

int CDC::SetBkMode( int nBkMode );

nBkMode   Specifies the mode to be set.

This parameter can be either of the following values:

OPAQUE   Background is filled with the current background color before the text, hatched brush, or pen is drawn. This is the default background mode.

TRANSPARENT   Background is not changed before drawing.

Text metrics getting

The TextOut() function gets to output the text string, beginning from some position, but there is possibility to set the output format, also there is no sequence “Enter-Enter”.

So, if there is used different fonts, there should be some ways to change that.

BOOL CDC::GetTextMetrics( LPTEXTMETRIC lpMetrics );

lpMetrics   Points to the TEXTMETRIC structure that receives the metrics.

The TEXTMETRIC structure contains the current settings of text font, linked to the current device context.

The TEXTMETRIC structure contains basic information about a physical font. All sizes are given in logical units; that is, they depend on the current mapping mode of the display context.

typedef struct tagTEXTMETRIC { // tm

LONG tmHeight; // Specifies the height (ascent + descent) of characters

LONG tmAscent; // Specifies the ascent (units above the base line) of characters

LONG tmDescent; // Specifies the descent (units below the base line) of characters

LONG tmInternalLeading; // Specifies the amount of leading (space) inside the bounds set by the tmHeight member. Accent marks and other diacritical characters may occur in this area. The designer may set this member to zero.

LONG tmExternalLeading; // Specifies the amount of extra leading (space) that the application adds between rows. Since this area is outside the font, it contains no marks and is not altered by text output calls in either OPAQUE or TRANSPARENT mode. The designer may set this member to zero.

LONG tmAveCharWidth; // Specifies the average width of characters in the font (generally defined as the width of the letter x). This value does not include the overhang required for bold or italic characters.

LONG tmMaxCharWidth; // Specifies the width of the widest character in the font.

LONG tmWeight; // Specifies the weight of the font

LONG tmOverhang; // Specifies the extra width per string that may be added to some synthesized fonts. When synthesizing some attributes, such as bold or italic, graphics device interface (GDI) or a device may have to add width to a string on both a per-character and per-string basis. For example, GDI makes a string bold by expanding the spacing of each character and overstriking by an offset value; it italicizes a font by shearing the string. In either case, there is an overhang past the basic string. For bold strings, the overhang is the distance by which the overstrike is offset. For italic strings, the overhang is the amount the top of the font is sheared past the bottom of the font.

LONG tmDigitizedAspectX; // Specifies the horizontal aspect of the device for which the font was designed.

LONG tmDigitizedAspectY; // Specifies the vertical aspect of the device for which the font was designed. The ratio of the tmDigitizedAspectX and tmDigitizedAspectY members is the aspect ratio of the device for which the font was designed.

BCHAR tmFirstChar; // Specifies the vertical aspect of the device for which the font was designed. The ratio of the tmDigitizedAspectX and tmDigitizedAspectY members is the aspect ratio of the device for which the font was designed.

BCHAR tmLastChar; // Specifies the value of the last character defined in the font.

BCHAR tmDefaultChar; // Specifies the value of the character to be substituted for characters not in the font.

BCHAR tmBreakChar; // Specifies the value of the character that will be used to define word breaks for text justification.

BYTE tmItalic; // Specifies an italic font if it is nonzero

BYTE tmUnderlined; // Specifies an underlined font if it is nonzero

BYTE tmStruckOut; // Specifies a strikeout font if it is nonzero

BYTE tmPitchAndFamily; // Specifies information about the pitch, the technology, and the family of a physical font. The four low-order bits of this member specify information about the pitch and the technology of the font. A constant is defined for each of the four bits:

Constant

Meaning

TMPF_FIXED_PITCH

If this bit is set the font is a variable pitch font. If this bit is clear the font is a fixed pitch font. Note very carefully that those meanings are the opposite of what the constant name implies.

TMPF_VECTOR

If this bit is set the font is a vector font.

TMPF_TRUETYPE

If this bit is set the font is a TrueType font.

TMPF_DEVICE

If this bit is set the font is a device font.

An application should carefully test for qualities encoded in these low-order bits, making no arbitrary assumptions. For example, besides having their own bits set, TrueType and PostScript fonts set the TMPF_VECTOR bit. A monospace bitmap font has all of these low-order bits clear; a proportional bitmap font sets the TMPF_FIXED_PITCH bit. A Postscript printer device font sets the TMPF_DEVICE, TMPF_VECTOR, and TMPF_FIXED_PITCH bits.

The four high-order bits of tmPitchAndFamily designate the font’s font family. An application can use the value 0xF0 and the bitwise AND operator to mask out the four low-order bits of tmPitchAndFamily, thus obtaining a value that can be directly compared with font family names to find an identical match. For information about font families, see the description of the LOGFONT structure.

BYTE tmCharSet; // Specifies the character set of the font.

} TEXTMETRIC;

The string length getting

The symbols of font has different width. The string length is measured in logical units. So the information about the symbol amount in the string lost its actuality.

CSize CDC::GetTextExtent( LPCTSTR lpszString, int nCount ) const;

CSize CDC::GetTextExtent( const CString& str ) const;

Returns Value is the dimensions of the string (in logical units) in a CSize object.

Parameters:

lpszString   Points to a string of characters. You can also pass a CString object for this parameter.

nCount   Specifies the number of characters in the string.

str    A CString object that contains the specified characters.

CSize type includes a number of parameters:

typedef struct tagSIZE {

int cx; // Specifies the x-extent when a function returns.

int cy; // Specifies the y-extent when a function returns.

} SIZE;

The SIZE structure specifies the width and height of a rectangle.

The system metrics getting

The display dimension is returned by GetSystemMetric() function:

int GetSystemMetrics( int nIndex )

// system metric or configuration setting to retrieve

Index has some values. Among them are the following:

SM_CXFULLSCREEN, SM_CYFULLSCREEN

Width and height of the client area for a full-screen window. To get the coordinates of the portion of the screen not obscured by the tray, call the SystemParametersInfo function with the SPI_GETWORKAREA value.

SM_CXSCREEN, SM_CYSCREEN

Width and height, in pixels, of the screen

Let’s consider the elements of program to work with text. First of all you should make some changes for main window class constructor. It is shown in Listing 4.1:

Listing 4.1 The constructor of Main Window class

int max_X, max_Y; // global variables to save the screen parameters

CMainWin::CMainWin(LPCSTR a)

{Create (a,"MainWindow",WS_OVERLAPPEDWINDOW|WS_VSCROLL |

WS_HSCROLL,rectDefault,NULL,MAKEINTRESOURCE(IDR_MENU1));

m_X=0;m_Y=0; // the current coordinates (class CMainWin members)

max_X=GetSystemMetrics(SM_CXSCREEN);

max_Y=GetSystemMetrics(SM_CYSCREEN);

}

Really other function produces the basic operations with text. It’s OnText() handler.

(See Listing 4.2)

Listing 4.2 The OnText() handler

void CMainWin::OnText()

{CCientDC DC(this);

TEXTMETRIC tm;

CSize size;

DC.SetTextColor(RGB(0,0,0));

DC.SetBkColor(RGB(0,255,255));

DC.GetTextMetrics(&tm);

wsprintf(t,"The font is %ld pixels high",tm.tmHeight);

DC.TextOut(m_X,m_Y,t,strlen(t));

m_Y=m_Y+tm.tmHeight+tm.tmExternalLeading;

strcpy(t,"This is on the next line");

DC.TextOut(m_X,m_Y,t,strlen(t));

size=DC.GetTextExtent(t,strlen(t));

wsprintf(t,"Previous string is %ld units long",size.cx);

//m_X=size.cx;

DC.TextOut(m_X,m_Y,t,strlen(t));

m_Y=m_Y+tm.tmHeight+tm.tmExternalLeading;

//m_X=0;

wsprintf(t,"Screen dimensions %d %d",max_X,max_Y);

DC.TextOut(m_X,m_Y,t,strlen(t));

m_Y=m_Y+tm.tmHeight+tm.tmExternalLeading;

wsprintf(t,"Font height %d before",tm.tmHeight);

DC.TextOut(m_X,m_Y,t,strlen(t));

m_Y=m_Y+tm.tmHeight+tm.tmExternalLeading;

tm.tmHeight=20;

wsprintf(t,"Font height %d before",tm.tmHeight);

DC.TextOut(m_X,m_Y,t,strlen(t));

m_Y=m_Y+tm.tmHeight+tm.tmExternalLeading;

//m_X=m_Y=0;

tm.tmHeight=tm.tmHeight*2;

InvalidateRect(NULL);

}

The last listing describes the information forming to output to display. That information consists of several strings – text with different scale.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]