
- •The ministry of education and science of ukraine kharkiv national university of radio electronics
- •1. The Basics of Microsoft Foundation Classes
- •Mfc general information
- •A Framework of mfc-program
- •Creating the Application Class
- •Creating the Frame-Window Class
- •Declaring a Message Map and instantiation of application object global instance
- •Defining a Message Map
- •Messages and their processing in mfc-programs
- •Writing Message Map Functions
- •Message boxes and menus in mfc-programs
- •2. Dialog windows
- •2.1 Modal and modeless dialog windows
- •2.2 The control elements of dialog window
- •CListBox::AddString (lpctstr lpszItem ); // Call this member function to add a string (lpszItem) to a list box;
- •3. Additional control elements in mfc-programs. Working with icons, cursors, raster images
- •3.1 Additional control elements
- •Radio buttons
- •Afx_msg void cWnd::OnVScroll( uint nSbCode, uint nPos, cScrollBar* pScrollBar ); afx_msg void cWnd::OnHScroll( uint nSbCode, uint nPos, cScrollBar* pScrollBar );
- •Afx_msg void OnVScroll( uint nSbCode, uint nPos, cScrollBar* pScrollBar );
- •Working with icons, cursors, raster images
- •The icons and cursor registration
- •Icon and cursor loading
- •4. The elements of text processing in mfc
- •The redrawing problem decision
- •5. The Elements of working with graphics
- •5.1 The graphics functions.
- •Working with brushes
- •5.2 The mapping modes and output regions
- •6. Common control elements
- •Windows Common Controls
- •6.2 The toolbar using
- •On resizing, the message wm_size is sent and the standard handler OnSize() is called.
- •The working with Spins
- •The working with slider
- •To set the range (minimum and maximum positions) for the slider in a slider control use the following function:
- •The working with progress bar
- •The tree control using in mfc programs
- •Adding elements to the tree
- •The status bars usage
- •Bool cStatusBarCtrl::SetParts( int nParts, int* pWidths );
- •Tab controls using in mfc-programs
- •Int cTabCtrl::GetCurSel(); To Selects a tab in a tab control use SetCurSel() function:
- •Int cTabCtrl::SetCurSel( int nItem );
- •The property sheets and wizards
- •7. Thread multitasking and it’s implementation in mfc
- •7.1 The basic features of multitasking
- •7.2 The Synchronization
- •7.3 The working with semaphore
- •7. 4 The working with event object
- •8. The concept of Document view
- •8.1 Introduction to document conception
- •The control of documents storing
- •8.2 The dynamic creation of objects
- •The application framework creation
- •The main window and application classes creation
- •Listing 8.1 The example of main window class in Document / View concept
- •Listing 8.2 The example of document class in Document / View concept
- •8.3 The document framework creation
- •8.4 The initiation of application
- •8.5 The standard id’s, used in Document / View concept
- •9. The special types of menu and their implementation in mfc
- •9.1 The description of special menu styles
- •The mechanism to make changes in menus
- •9.2 The dynamic and floating menus implementation
- •CMenu::CreatePopupMenu
- •The example programs to work with dynamic menus
- •10. The system of help
- •10.1 The basic information on help structures
- •The call of help
- •The file of help
- •The Help file creating
- •The example of rtf file
- •10.2 The Help system including to the mfc-program
- •Parameters:
- •Return Values: If the function succeeds, the return value is nonzero. If the function fails, the return value is zero.
- •10.3 The handlers of help messages
- •The processing of help calls
- •Wm_commandhelp message processing
- •10.4 Wm_contextmenu message processing
- •11. Manipulating Device-Independent Bitmaps
- •11.1 The types of bitmap
- •11.2 The structures included to bitmap
- •Introducing the cDib Class
- •11.3 Programming the cDib Class
- •Loading a dib into Memory
- •Other cDib Member Functions
- •Creating ShowDib program
- •Modifying ShowDib's Resources
- •Adding Code to ShowDib
- •Examining the OnFileOpen() Function
- •Examining the OnDraw() Function
- •12. The elements of Database Programming
- •12.1 Understanding Database Concepts
- •Accessing a Database
- •12.2 Mfc odbc Classes
- •Registering the Database
- •Creating the Basic Employee Application
- •Creating the Database Display
- •Adding and Deleting Records
- •12.4 Sorting and Filtering
- •12.5 Odbc versus dao
- •13. Remote Automation
- •13.1 The introduction to Remote Automation
- •13.2 The Remote Automation Connection Manager and user components
- •13.3 Automation
- •Automation Clients
- •13.4 ActiveX
- •ActiveX Document Servers
- •ActiveX Document Containers
- •ActiveX Document Views
- •13.5 ActiveX Documents
- •ActiveX Controls
- •Interaction Between Controls with Windows and ActiveX Control Containers
- •13.6 Optimization of ActiveX Controls
- •13.7 Automation Servers
- •13.8 Connection Points
- •14. Microsoft DirectX and the main items of its using
- •14.2 The Component Object Model
- •IUnknown Interface
- •DirectX com Interfaces
- •DirectDraw Architecture
- •Other DirectDraw Features
- •Width and Pitch
- •14.5 Support for 3d Surfaces in DirectX
- •14.6 Direct3d Integration with DirectDraw
- •Direct3d Device Interface
- •Direct3d Texture Interface
- •The Basics of DirectDraw
- •Step 6: Writing to the Surface.The first half of the wm_timer message in ddex1 is devoted to writing to the back buffer, as shown in the following example:
- •Loading Bitmaps on the Back Buffer
- •Step 1: Creating the Palette. The ddex2 sample first loads the palette into a structure by using the following code:
- •Step 4: Flipping the Surfaces. Flipping surfaces in the ddex2 sample is essentially the same process as that in the first example. Blitting from an Off-Screen Surface
- •Step 1: Creating the Off-Screen Surfaces. The following code is added to the doInit function in ddex3 to create the two off-screen buffers:
- •Color Keys and Bitmap Animation
- •Dynamically Modifying Palettes
- •Optimizations and Customizations
- •Blitting with Color Fill
- •Determining the Capabilities of the Display Hardware
- •Storing Bitmaps in Display Memory
- •Triple Buffering
- •15. General information on OpenGl
- •15.1 Common information
- •Primitives and Commands
- •OpenGl Graphic Control
- •Execution Model
- •15.2 Basic OpenGl Operation
- •OpenGl Correctness Tips
- •15.3 OpenGl example program
- •Ph.D. Assosiate prof. Tsimbal Alexander m. System software, summary of lectures.
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.
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
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.