Click here to Skip to main content
Click here to Skip to main content

Creating your first Windows application

, 14 Jun 2000
Rate this:
Please Sign up or sign in to vote.
A brief step-by-step tutorial that demonstrates creating an SDI based application that does not use the MFC Doc/View architecture.
<!-- Download Links -->
  • Download demo project - 14.5 Kb
  • <!-- Main HTML starts here -->

    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 it's 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 it's 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. Smile | :)

    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

    Share

    About the Author

    Daniel Kopitchinski
    Web Developer
    Israel Israel
    No Biography provided

    Comments and Discussions

     
    Questionone question on OnChar()? Pinmemberjeansea5-Feb-09 4:40 
    AnswerRe: one question on OnChar()? Pinmemberganesa1920-Jan-11 3:49 
    QuestionMFC ClassWizard in Vis C++ .NET [modified] Pinmembersphereboy27-Jun-06 5:13 
    My original question was : "How do you bring up the MFC ClassWizard in Visual C++ .NET? I am unable to find it."
     
    Mod: Can you update this to reflect the new version of C++? Thanks $1,000,000.
     
    Thank you,
    G
    cpp@nearsphere.com
     
    -- modified at 11:59 Tuesday 27th June, 2006
    GeneralVery helpfull for beginners but.. PinmemberNajmul hassan17-Dec-05 23:25 
    QuestionSDI or MDI project type? Pinmemberkrugger14-Jan-04 9:57 
    Generalwerd PinsussAnonymous12-Apr-03 6:05 
    Generalc++ PinmemberGaneshRam12-Apr-02 16:17 
    GeneralAppreciation PinmemberSyedAbdulhaq30-Mar-02 23:43 
    GeneralRe: Appreciation PinsussAnonymous28-Dec-02 6:20 
    Generaldownload tutorial Pinmemberdr3dd17-Feb-02 6:06 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

    | Advertise | Privacy | Terms of Use | Mobile
    Web01 | 2.8.141223.1 | Last Updated 15 Jun 2000
    Article Copyright 2000 by Daniel Kopitchinski
    Everything else Copyright © CodeProject, 1999-2014
    Layout: fixed | fluid