Add SplashScreen in vs201

Source: Internet
Author: User
Tags bool

Author information: Luo Shupeng Http://www.cnblogs.com/luoshupeng

As the author took some detours in the course of practice, I recorded these cases, hoping to provide some experience for the latter.

In the VC6.0 era, you can add SplashScreen to your project through components by using the menu Project->add to Project->componentsand Controls in the IDE, from the visual c+ + Components Select Splash Screen This component to insert the project.

But into the VC. NET era, this method is not, need the program author to join the SplashScreen class, their own processing some system messages. The following author has recorded the practice process, and pointed out the need to pay attention to the place.

First, create a new SplashScreen class, and declare members and methods

The new base class is the Csplashwnd class for CWnd (of course, the class name is free to write) and declares the following members:

CBitmap M_bitmap; Load SplashScreen pictures with

Static Csplashwnd*c_psplashwnd; A handle to the Csplashwnd class that can be used to determine whether Csplashwnd has been created or destroyed

Static Boolc_bshowsplashwnd; Identifies whether the display is displayed for static members that need to be initialized outside the class

Class members are generally declared as protection types (protected). Next, you declare several static methods to handle these members:

Static Boolc_bshowsplashwnd; Identifies whether the display is displayed for static members that need to be initialized outside the class

static void ShowSplashScreen (cwnd* pparentwnd = NULL); Used to display the SplashScreen window

Static Boolpretranslateappmessage (msg* PMSG); To handle some messages note that this is not the PreTranslateMessage method inherited from the CWnd class

These methods must be declared as public types, because these methods are called externally. Next, we declare two custom methods:

BOOL Create (Cwnd*pparentwnd = NULL); Create window

void Hidesplashscreen (void); Hide Window

I declare these methods as protection types (protected). Next, we will declare some functions for handling system messages:

virtual void PostNcDestroy ();

afx_msg int OnCreate (lpcreatestruct lpcreatestruct);

afx_msg void OnTimer (Uint_ptr nidevent);

afx_msg void OnPaint ();

At this point, the class has been designed. The complete header file is as follows:

#pragma once

#include "AFXWIN.h"

Csplashwnd

Class Csplashwnd:public CWnd

{

Declare_dynamic (Csplashwnd)

Protected

Csplashwnd ();

Public

Virtual~csplashwnd ();

Protected

CBitmap M_bitmap; Load SplashScreen pictures with

staticcsplashwnd* C_psplashwnd; A handle to the Csplashwnd class that can be used to determine whether Csplashwnd has been created or destroyed

Staticbool C_bshowsplashwnd; Identifies whether the display is displayed for static members that need to be initialized outside the class

Public

static void Enablesplashscreen (BOOL benable = TRUE); Used to set C_bshowsplashwnd

static void ShowSplashScreen (cwnd* pparentwnd = NULL); Used to display the SplashScreen window

Staticbool pretranslateappmessage (msg* pMsg); To handle some messages note that this is not the PreTranslateMessage method inherited from the CWnd class

Protected

Virtualvoid PostNcDestroy ();

afx_msg intoncreate (lpcreatestruct lpcreatestruct);

afx_msg Voidontimer (uint_ptr nidevent);

Afx_msg Voidonpaint ();

BOOL Create (cwnd* pparentwnd = NULL); Create window

Voidhidesplashscreen (void); Hide Window

Declare_message_map ()

};

The realization of the Csplashwnd class method

The point to note here is that you must set the C_psplashwnd member to a null type in the destructor, or the program will receive an exception when it receives the message. There's nothing else, just look at the code.

Splash.cpp:implementation file

//

#include "stdafx.h"

#include "Splash.h"

Csplashwnd*csplashwnd::c_psplashwnd;

Boolcsplashwnd::c_bshowsplashwnd;

Csplashwnd

Implement_dynamic (Csplashwnd,cwnd)

Csplashwnd::csplashwnd ()

{

}

Csplashwnd::~csplashwnd ()

{

ASSERT (C_psplashwnd = = this);

C_psplashwnd = NULL;

}

Begin_message_map (Csplashwnd,cwnd)

On_wm_create ()

On_wm_timer ()

On_wm_paint ()

End_message_map ()

Csplashwnd message handlers

Voidcsplashwnd::enablesplashscreen (BOOL benable/* =true*/)

{

C_bshowsplashwnd = benable;

}

Voidcsplashwnd::showsplashscreen (cwnd* pparentwnd/* =null*/)

{

If you do not show splashscreen or Splashwnd objects have been created then return

if (!c_bshowsplashwnd | | c_psplashwnd!=null)

{

Return

}

C_psplashwnd = Newcsplashwnd;

if (!c_psplashwnd->create (pParentWnd))

{

Deletec_psplashwnd;

}

Else

{

C_psplashwnd->updatewindow ();

}

}

Boolcsplashwnd::P retranslateappmessage (msg* pMsg)

{

if (C_psplashwnd = = NULL)

Returnfalse;

if (Pmsg->message = = Wm_keydown

|| Pmsg->message ==wm_syskeydown

|| Pmsg->message ==wm_lbuttondown

|| Pmsg->message ==wm_rbuttondown

|| Pmsg->message ==wm_mbuttondown

|| Pmsg->message ==wm_nclbuttondown

|| Pmsg->message ==wm_ncrbuttondown

|| Pmsg->message ==wm_ncmbuttondown)

{

C_psplashwnd->hidesplashscreen ();

Returntrue;

}

Returnfalse;

}

void Csplashwnd::P Ostncdestroy ()

{

Delete this;

}

Intcsplashwnd::oncreate (lpcreatestruct lpcreatestruct)

{

if (cwnd::oncreate (lpcreatestruct) = =-1)

return-1;

Todo:add your specialized creation code here

CenterWindow ();

SetTimer (1,3000,null);

Return0;

}

Voidcsplashwnd::ontimer (Uint_ptr nidevent)

{

Todo:addyour Message Handler code here and/or call default

if (nidevent = = 1)

{

Hidesplashscreen ();

}

/*cwnd::ontimer (nidevent); * *

}

Voidcsplashwnd::onpaint ()

{

CPAINTDC DC (this);//device context for painting

Todo:addyour Message Handler code here

Do Notcall cwnd::onpaint () for painting messages

CDC dcimg;

if (!dcimg.createcompatibledc (&DC))

{

Return

}

BITMAP BM;

M_bitmap. Getbitmap (&BM);

Paint Theimage

cbitmap* poldbit =dcimg.selectobject (&M_BITMAP);

dc. BitBlt (0,0,bm.bmwidth,bm.bmheight,&dcimg,0,0,srccopy);

Dcimg.selectobject (Poldbit);

}

Boolcsplashwnd::create (cwnd* pParentWnd)

{

if (!m_bitmap. LoadBitmap (Idb_splash))

{

Returnfalse;

}

BITMAP BM;

M_bitmap. Getbitmap (&BM);

Returncreateex (0,

AfxRegisterWndClass (0,afxgetapp ()->loadstandardcursor (Idc_arrow)),

Null

ws_popup| Ws_visible,

0,

0,

Bm.bmwidth,

Bm.bmheight,

Pparentwnd->getsafehwnd (),

NULL);

}

void Csplashwnd::hidesplashscreen (void)

{

DestroyWindow ();

AfxGetMainWnd ()->updatewindow ();

}

Third, use the Csplashwnd class in SDI or MDI

(1) Call Csplashwnd::enablesplashscreen () in CWinApp::InitInstance () to set the C_bshowsplashwnd;
Call Csplashwnd::P retranslateappmessage () in PreTranslateMessage () to pass keyboard and mouse messages to the Csplashwnd object

(2) (2) Call Csplashwnd::showsplashscreen () in OnCreate () of the CMainFrame object to create a static SplashScreen window object C_psplashwnd, and sets its parent window to CMainFrame.

The code is as follows:

Boolcdrawapp::initinstance ()

{

Used to handle whether the SplashScreen is displayed

{

CCommandLineInfo Cmdinfo;

ProcessShellCommand (Cmdinfo);

Csplashwnd::enablesplashscreen (Cmdinfo.m_bshowsplash);

}

...........

}

Boolcdrawapp::P retranslatemessage (msg* pMsg)

{

if (Csplashwnd::P retranslateappmessage (PMSG))

Returntrue;

Returncwinappex::P retranslatemessage (PMSG);

}

Intcmainframe::oncreate (lpcreatestruct lpcreatestruct)

{

if (cmdiframewndex::oncreate (lpcreatestruct) = =-1)

return-1;

...........

Csplashwnd::showsplashscreen (this);

Return0;

}

There are no errors during this process, but you will be prompted at compile time: Idb_splash is not defined. This requires the inclusion of a single-bit graph resource in the resource and the "resource.h" header file in the CSlashWnd.cpp file.

Iv. using the Csplashwnd Class in a dialog box

Used in dialog boxes and used in SDI or MDI basic similarity, first in CWinApp's inheriting class to handle the InitInstance () and PreTranslateMessage (msg* PMSG) Two message functions, and then in the dialog box class Wm_ The Create response function displays SplashScreen.

Boolcdlgapp::initinstance ()

{

Used to handle whether the SplashScreen is displayed

{

CCommandLineInfo Cmdinfo;

ProcessShellCommand (Cmdinfo);

Csplashwnd::enablesplashscreen (Cmdinfo.m_bshowsplash);

}

..........

}

Boolcdlgapp::P retranslatemessage (msg* pMsg)

{

if (Csplashwnd::P retranslateappmessage (PMSG))

{

Returntrue;

}

Returncwinapp::P retranslatemessage (PMSG);

}

Intcdlgdlg::oncreate (lpcreatestruct lpcreatestruct)

{

if (cdialogex::oncreate (lpcreatestruct) = =-1)

return-1;

Todo:add your specialized creation code here

Csplashwnd::showsplashscreen (this);

Return0; }

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.