Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Creating Your First Windows Application

0.00/5 (No votes)
14 Jun 2000 1  
A brief step-by-step tutorial that demonstrates creating an SDI based application that does not use the MFC Doc/View architecture

Introduction

In this tutorial, we are going to create a simple SDI program using AppWizard that displays the last key pressed in the middle of its window. I assume you have good knowledge of C++ and polymorphism. I also assume that you have worked with Windows before and that you are rather familiar with Windows programs.

1. Choosing the Project Type

The first step to creating a new project is to choose New from the File menu. This can also be done using the CTRL + N keyboard shortcut. Click on the "project" tab to get a list of the available project types. In our case, we will create an MFC program, so choose MFC "AppWizard (exe)". The AppWizard is a wizard that will create one of 3 typical programs:

  1. A SDI program
  2. A MDI program
  3. A Dialog based program

Enter the name of your program in the "Project name" field. In our example, we will call the project SDIPROG. Change the location if you wish and then press OK.

2. AppWizard - Step 1

Choose the project you wish to create, in our case "Single Document". This will create an application that has a single viewing window within a main frame. Uncheck the "Document/View architecture support" checkbox and press "Next". If you specify that you want to use the Doc/View architecture, then the wizard will create CDocument and CView derived classes. The CDocument derived class is where all data should be stored and processed, and the CView derived class is used to display this data. In our case, we will not be using this architecture, and will instead use a simple CWnd derived class that will handle the data and presentation in one place.

3. AppWizard - Step 2 - 3

Accept the defaults and press "Next".

4. AppWizard - Step 4 - 5

You can experiment with the settings in these dialogs, but in this tutorial, you should just press "Next".

5. AppWizard - Step 6

Press "Finish". A dialog box will popup informing you of the settings you have chosen. Press OK.

6. The View

After creating the project, AppWizard will generate a number of classes. One of them is the "View". The View is the part of the program that is not part of the Frame, which includes the borders, the caption, the menu and the toolbars. AppWizard creates a class called CChildView that encapsulates the view. With CChildView, you perform operations on the view, and you receive input sent to the view.

7. Drawing in the View

First thing we'll do is add a CString member variable named m_strText to CChildView:

// ChildView.h : interface of the CChildView class
//...
class CChildView : public CWnd
{
//...
protected:
	CString m_strText;
//...

Then we need to initialize m_strText, we'll do so by adding a call to m_strText's constructor inside CChildView's constructor:

CChildView::CChildView() : m_strText(_T("The character you entered was:"))
{
//...
}

CChildView has a virtual member function named OnPaint. OnPaint is called by Windows telling your program to draw/redraw the view. Among other things, this can occur when your view is created, when the view gets "uncovered" by a window, when your window moves or when your window's size changes. When AppWizard creates your program, it adds the following code to your OnPaint() function:

void CChildView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	
	// Do not call CWnd::OnPaint() for painting messages
}

dc Is a CPaintDC object. CPaintDC encapsulates a Device Context. A Device Context refers to an output device (such as a video card or printer) and its device driver. A device context is used to display graphics and text in a window. One of the member functions of CPaintDC is DrawText(). DrawText() allows you to draw text in the Device Context, which in our case is the view. DrawText() needs a rectangle area in which it should draw. We'll get the view's rectangle by using the GetClientRect function. Next, we'll add the code that draws the contents of m_strText in the view:

void CChildView::OnPaint() 
{
	CPaintDC dc(this);    // device context for painting
	
	CRect rect;           // Create a CRect object
	GetClientRect(rect);  // Retrieve the view's rectangle into the rect object
	
	// Draw the text in the middle of the view
	dc.DrawText(m_strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); 
	
	// Do not call CWnd::OnPaint() for painting messages
}

8. Receiving Input

When your view gets mouse/keyboard input, Windows will send a message to your view. To get the message, you need to create a message handler. You create a message handler using ClassWizard:

Press CTRL + W to start ClassWizard. Select the "class info" tab and choose "Child Window" in the "Message Filter" combobox.

Select the "message map" tab. Choose WM_CHAR from the "Messages" list, and press the "Add Function" button. Press "Edit Code" to edit the newly created OnChar function.

OnChar is called when the user enters a character in your view. The code created by ClassWizard:

void CChildView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CWnd::OnChar(nChar, nRepCnt, nFlags);
}

In OnChar, we'll add the code to change m_strText and then have the view redraw:

void CChildView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	m_strText = _T("The character you entered was: ");
	m_strText += (TCHAR)nChar;
	Invalidate();
	
	CWnd::OnChar(nChar, nRepCnt, nFlags);
}

Invalidate() tells your view to redraw itself, and eventually calls OnPaint().

9. Building And Running

Building the program is the most complicated stage - You have to press F5 and then... Wait. :)

Now that we have passed the complex building stage, the program should start. Click on the view and start typing. The text should be drawn according to the character you entered.

Further Reading

License

This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.

A list of licenses authors might use can be found here.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here