MFC启动画面设计
- 格式:doc
- 大小:97.50 KB
- 文档页数:4
MFC 编写自己的特色启动窗体...........今天看到VC上面有个能增加启动窗体的向导不过那个利用向导做出来启动界面代码多我们根本无从修改于是我摸索着写了个启动窗体基于对话框的启动界面界面是一块一块的慢慢显示 ...涉及到的函数:srand((unsigned)time(NULL)); //以时间为轴随机rand()产生随机数CDC::StretchBlt() //从源DC拷贝位图到目的DC 有必要可以对位图进行拉伸和压缩Cwnd::CreateEx()创建一个窗体AfxRegisterWndClass()函数返回一个已经注册了的窗口类的名字CDC::CreateCompatibleDC()创建和某DC相兼容的DCCWnd::CenterWindow()窗体居中CWnd::UpdateWindow()更新窗体这时候会发送WM_PAINT消息导致OnPaint 函数的调用下面是代码具体代码首先创建一个MFC基于对话框的应用程序(一下是步骤)1. 定义一个CHelloWnd 类从CWnd 类派生来2. CHelloWnd 类添加成员和函数public:void CreateHellWindow();private:CBitmap bit;BITMAP info;3. 以上添加完成之后增加WM_PAINT 消息响应函数void OnPaint() 函数增加一副位图资源IDB_BITMAP1;// 函数1构造函数CHelloWnd::CHelloWnd(){bit.LoadBitmap(IDB_BITMAP1); //加载位图bit.GetBitmap(&info); //获得位图信息BITMAP}// 函数2 CreateHellWindow()void CHelloWnd::CreateHellWindow(){this->CreateEx(0,AfxRegisterWndClass(0,LoadCursor(NULL,IDC_ARROW)), //注册窗口类Hello Window!", //标题WS_POPUPWINDOW,//style0,0,info.bmWidth,// 宽info.bmHeight,//高NULL,NULL,NULL);}// 函数3 OnPaint() 函数void CHelloWnd::OnPaint() //调用CWnd类的UpDateWindow会发送WM_PAINT消息{CPaintDC dc(this);CDC dcCom;dcCom.CreateCompatibleDC(&dc); //创建兼容DCdcCom.SelectObject(&bit); //将位图选到兼容DC中int x=0,y=0; //随机坐标DC绘制时候的坐标都是相对于客户坐标而不是屏幕坐标 int num=0 ;//用于记录绘制次数到100次推出whileint check[10][10]={0}; //用于判断100个格子是否全部绘制int stepx=info.bmWidth/10; //设置绘制的每一个小格子的高度int stepy=info.bmHeight/10; //设置绘制的每一个小格子的宽度srand((unsigned)time(NULL)); //以时间为轴随机while(1){x=rand()%10; //产生0-9之间的数字y=rand()%10; //产生0-9之间的数字if(check[x][y]) //如果已经绘制直接进入下一个循环continue;dc.StretchBlt(x*stepx,y*stepy,stepx,stepy,&dcCom,x*stepx,y*stepy,stepx,stepy,SRCCO PY);check[x][y]=1 ;num++;if(num>=100)break ;Sleep(50);}}以上完成之后在APP类中的初始化函数 CMyDlg dlg; 对话框生成之前增加如下代码CHelloWnd *wnd=new CHelloWnd;wnd->CreateHellWindow();wnd->ShowWindow(SW_SHOW); //显示窗体wnd->CenterWindow(); //窗体居中wnd->UpdateWindow(); //发送WM_PAINT 消息到这里一个启动窗体就做好了大致就是这样。
MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开辟Windows应用程序的C++类库。
在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。
下面是使用MFC创建一个简单的画图程序的步骤。
步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。
在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。
输入项目名称并选择保存的位置。
在应用程序类型中,选择“单文档”或者“多文档”视图,具体根据你的需求而定。
点击“确定”按钮创建项目。
步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。
在资源视图中,双击IDD_DIALOG(或者其他对话框资源)以打开对话框编辑器。
在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。
在画图程序中,你可以添加一个画布控件来显示绘制的图形。
步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。
打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。
mfc界面设计教程MFC(Microsoft Foundation Classes)是一套用于开发Windows平台上图形用户界面(GUI)的C++类库。
MFC界面设计是开发Windows应用程序中不可或缺的一部分。
本文将向您介绍一些MFC界面设计的基本原则和技巧,帮助您创建出具有吸引力和用户友好的应用程序界面。
首先,设计一个清晰的用户界面是至关重要的。
您需要确保您的应用程序界面布局简洁明了,易于导航。
使用适当的菜单和工具栏来组织您的功能,使用户能够方便地找到和使用这些功能。
避免界面过于拥挤或混乱,这会给用户带来困惑和不满。
其次,选择合适的颜色和字体可以提升您应用程序界面的外观。
一般来说,最好选择与您应用程序主题相关的颜色,并确保文字清晰可读。
避免使用太多花哨的字体或颜色,这可能会让用户感到眼花缭乱。
另外,为您的界面添加一些可视化元素也是一个不错的选择。
例如,您可以使用图标来表示不同的功能或操作,这有助于用户更快地识别和理解这些内容。
您还可以考虑使用一些动画效果或过渡效果来吸引用户的注意力,但要确保这些效果不会分散用户的注意力或降低应用程序的性能。
此外,考虑到用户的反馈是很重要的。
您可以通过使用弹出窗口、对话框或状态栏来向用户显示相关的提示信息,告知他们当前的操作状态或发生的错误。
提供适当的错误处理机制也非常重要,以便用户能够轻松地解决问题或进行必要的更正。
最后,测试是一个不可忽视的环节。
在设计和开发过程中,您应该经常测试您的界面,以确保它在不同屏幕分辨率和操作系统上都能够正常显示和工作。
同时,您还应该进行用户体验测试,以了解用户对您设计的界面的感受和反馈,并根据需要进行相应的修改和改进。
总结起来,MFC界面设计需要注意清晰布局、合适的颜色和字体、可视化元素、合理的反馈机制以及充分的测试。
通过遵循这些原则和技巧,您可以创建出用户友好和吸引人的应用程序界面。
希望本文对您的MFC界面设计有所帮助!。
在VC++.net中制作启动屏幕的新方法在利用VC++.net编程过程中,遇到制作启动屏幕的问题,几经试验,得出一种方便简单的制作方法。
基本原理是利用对话框窗口的特性,在启动时首先创建对话框,设置一个获得位图文件的句柄,利用Picture控件的SetBitmap(HBITMAP hBitmap)方法,使位图文件充满整个P icture控件窗口,最后设置定时器,整个启动屏幕就制作完成。
下面介绍具体实现步骤。
1. 打开的开发环境,新建VC++.net中的MFC应用程序,输入工程名称MyS ample,点击“确定”,“完成”;2. 打开资源视图,添加对话框,更改ID为ID_DIALOG_SPLASH,设置对话框Cent er属性为True,Border属性为“无”;3. 在对话框中添加Picture控件,设置Picture控件的ID号为ID_PIC,Type属性为“位图”,Center image属性为True,然后调整标尺使对话框没有外框,调整对话框的大小以适应启动屏幕的要求,调整Picture的宽高使其充满整个对话框窗口;4. 双击对话框窗口,弹出类向导对话框,在类名中键入CSplash,选择基类为Cdialo g,点击确定,定义控件Picture的控件变量为m_pic;5. 在Csplash类中重载OnInitDialog()函数,添加消息WM_CHAR,WM_TIMER,W M_LBUTTONUP,WM_MBUTTONUP,WM_RBUTTONUP;6. 在OnInitDialog()函数中添加代码如下:7. 在OnTimer(UINT nIDEvent) 函数中添加代码如下:8. 在OnLButtonUp,OnLButtonUp,OnLButtonUp,OnChar函数中加入以下代码:9. 在MySample.Cpp中引入头文件在InitInstance()函数中加入代码:至此,启动屏幕就Ok了!VC++工程中加入SplashScreen摘要本文旨在剖析VC++工程中加入SplashScreen 的原理,并给出在VC++ MFC(exe)工程中加入SplashScreen 的步骤。
在VC6.0时代,我们通过在MFC工程中插入Splash组件来简单方便的实现这个功能,但在VS2008以后就没有了这个功能,所以如果想给自己的程序添加一个显示Logo的启动画面,就需要自己添加代码来实现,参考了下VC6.0中这个Splash组件添加后的代码,就很容易在自己的项目里实现这个功能。
如下图(来自网络)。
本文以VS2008为例做一个演示:首先,在菜单的“项目”中选择“添加类”->”c++类”,生成一个启动画面的Splash类。
然后,实现代码主要是在CwzdSplash类的头文件和cpp文件中实现。
在CwzdSplash类的头文件中我们添加下面的代码:#pragma once// CWzdSplashclass CWzdSplash : public CWnd{DECLARE_DYNAMIC(CWzdSplash)public:CWzdSplash();virtual ~CWzdSplash();protected:DECLARE_MESSAGE_MAP()public:CBitmap m_bitmap;// void Create(void);void Create(UINT nBitmapID);afx_msg void OnPaint();afx_msg void OnTimer(UINT_PTR nIDEvent);};在CwzdSplash类的cpp文件中我们添加下面的代码:// WzdSplash.cpp : 实现文件//#include "stdafx.h"#include "TinyPlusCompiler.h"#include "WzdSplash.h"// CWzdSplashIMPLEMENT_DYNAMIC(CWzdSplash, CWnd) CWzdSplash::CWzdSplash(){}CWzdSplash::~CWzdSplash(){}BEGIN_MESSAGE_MAP(CWzdSplash, CWnd) ON_WM_PAINT()ON_WM_TIMER()END_MESSAGE_MAP()// CWzdSplash 消息处理程序void CWzdSplash::Create(UINT nBitmapID) {m_bitmap.LoadBitmap(nBitmapID);BITMAP bitmap;m_bitmap.GetBitmap(&bitmap);//CreateEx(0,AfxRegisterWndClass(0),"",WS_POPUP|WS_VISIBLE|WS_BORDER,0 ,0,bitmap.bmWidth,bitmap.bmHeight,NULL,0);CreateEx(0,AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW)),NULL, WS_POPUP | WS_VISIBLE, 0, 0, bitmap.bmWidth, bitmap.bmHeight, NULL , NULL);}void CWzdSplash::OnPaint(){// TODO: 在此处添加消息处理程序代码// 不为绘图消息调用CWnd::OnPaint()CPaintDC dc(this); // device context forpaintingBITMAP bitmap;m_bitmap.GetBitmap(&bitmap);CDC dcComp;dcComp.CreateCompatibleDC(&dc);dcComp.SelectObject(&m_bitmap);// draw bitmapdc.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dcComp,0,0,SRCCOPY);}void CWzdSplash::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值//CWnd::OnTimer(nIDEvent);DestroyWindow(); //销毁初始画面窗口}最后在项目的主窗口视图的Create函数中添加下面的实例化过程就可以显示出我们自定义的Logo启动画面了:CWzdSplash wndSplash; //创建启动窗口类的实例wndSplash.Create(IDB_SPLASH);wndSplash.CenterWindow();wndSplash.UpdateWindow(); //send WM_PAINTSleep(1500);wndSplash.DestroyWindow();//销毁初始画面窗口注明一下要注意的地方:wndSplash.Create(IDB_SPLASH);中的IDB_SPLASH是在添加位图资源时添加进来的资源ID,自己可以定义自己所喜欢的启动图画。
画直线:ye在cview 中加入private:CPoint m_point; //自己加的在onlbutoondown 加入m_point=point; //自己加的在onlbuttonup 加入HDC hdc; //自己加的hdc=::GetDC(m_hWnd);MoveToEx(hdc,m_point.x,m_point.y,NULL);LineTo(hdc,point.x,point.y);::ReleaseDC(m_hWnd,hdc); //自己加的完成功能圆,直线,矩形的画法ye1首先在菜单添加各种ID然后定义一个变量m_way赋予不同的值然后增加鼠标按下和弹起的函数处理根据m_way的值按下:m_point=point;保存点的相关信息弹起:CClientDC dc(this);CPen pen(m_linestyle1,m_linewidth,RGB(255,0,0));dc.SelectObject(&pen);CBrush *pbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));dc.SelectObject(pbrush);switch(m_way){case 1:dc.SetPixel(point,RGB(255,0,0));break;case 2:dc.MoveTo(m_point);dc.LineTo(point);break;case 3:dc.Rectangle(CRect(m_point,point));break;case 4:dc.Ellipse(CRect(m_point,point));break;}再定义一个类:实现设置不同的线宽和线形,在弹出框进行编写加载位图:ye2首先构造一幅位图(不是位图的可以转化为位图在加载),然后增加一个消息处理BOOL CY e2View::OnEraseBkgnd(CDC* pDC)CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);CDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);dcCompatible.SelectObject(&bitmap);CRect rect;GetClientRect(&rect);pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);return TRUE;//return CV iew::OnEraseBkgnd(pDC);第二种情况BOOL CY e2View::OnEraseBkgnd(CDC* pDC){// TODO: Add your message handler code here and/or call defaultCBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);BITMAP bmp;bitmap.GetBitmap(&bmp);CDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);dcCompatible.SelectObject(&bitmap);CRect rect;GetClientRect(&rect);//pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp. bmHeight,SRCCOPY);return TRUE;//return CV iew::OnEraseBkgnd(pDC);}图片根据大小而放大缩小渐变:ye3先定义一个变量int width;然后在oncreat函数里输入如下函数调用SetTimer(1,100,NULL);最后开辟一个time消息做如下处理:void CYe3View::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultwidth+=5;CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);CRect rect;rect.left=0;rect.top=200;rect.right=width;rect.bottom=rect.top+tm.tmHeight;dc.SetTextColor(RGB(255,0,0));CString str;str.LoadString(ID_XIANSHI);dc.DrawText(str,rect,DT_LEFT);rect.top=150;rect.bottom=rect.top+tm.tmHeight;dc.DrawText(str,rect,DT_LEFT);CSize sz=dc.GetTextExtent(str);if(width>sz.cx){width=0;dc.SetTextColor(RGB(0,255,0));dc.TextOut(0,200,str);//dc.DrawText(str,rect,DT_LEFT);}CView::OnTimer(nIDEvent);}动态的画线先实现画线的代码然后在菜单中添加一个按钮实现触发SetTime()函数定时的发送TIME消息增加消息处理是捕获time消息,改变线长不断画线。
我整理的MFC界面美化一,对话框背景为一幅位图1.插入位图打开VC6.0MFC程序,右击“Dialog”,打开“引入”,选择图片就可以引入一个位图了。
2.打开“ClassView”,再打开“CAbouttDlg()”函数,找到void CTuxingDlg::OnPaint()函数,粘贴上CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP1);//IDB_BITMAP1是你自己的图对应的IDBITMAP bitmap;bmpBackground.GetBitmap(&bitmap);CBitmap*pbmpOld=dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);二.在对话框上显示一幅位图法一:把图片引入工程,其句柄名为IDB_BITMAP2;然后放一个静态控件或者图片控件到对话框上,将其句柄名设为IDC_SHOWBMP; 具体代码为在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP);HBITMAPhBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESO URCE(IDB_BITMAP2));p->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);p->SetBitmap(hBitmap);详解:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP); //获得指向IDC_SHOWBMP的指针,并将其强制转换为CStatic*类型,并赋值给pHBITMAPhBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESO URCE(IDB_BITMAP2));//从工程资源处获得IDB_BITMAP2的位图句柄,并将其赋值给hBitmap变量p->Modifystyle(0xF,SS_BITMAP|SS_CENTERIMAGE);//设置该静态控件(p指向的静态控件),使其用于显示位图,并且是在控件中央显示//(若无此步无法显示,因为没有说明静态对话框要显示的类型是什么)p->SetBitmap(hBitmap);//将需要显示的位图设置为bBitmap,即资源IDB_BITMAP1的句柄法二:通过位图所在路径显示位图(此方法无需事先将位图文件添加为该工程的资源) 在对话框上放一个静态控件(一定是静态控件,若图片控件则无法显示) 将其重命名为IDC_BMP(不重命名的话无法添加变量),然后再为该控件添加一个变量,命名为m_image.在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码: this->m_image.ModifyStyle(0,SS_BITMAP |SS_CENTERIMAGE);HBITMAP hBmp = (HBITMAP)::LoadImage(0, "path\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);this->m_image.SetBitmap(hBmp);详解:this->m_image.ModifyStyle(0,SS_BITMAP|SS_CENTERIMAGE);//和上面的作用一样,将该静态控件设置为是用来显示位图的,只不过这里是通过该静态对话框的变量来进行/ /modifystyle操作的HBITMAP hBmp = (HBITMAP)::LoadImage(0, "path\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //从bmp文件所在的路径直接读取该bmp图象的句柄,并将其转换为HBITMAP类型//注:其中的"path\\1.bmp"是相对路径,即在和可执行文件的同一目录下有一个名为path的文件夹,里面有一个名为1.bmp的位图文件.this->m_image.SetBitmap(hBmp); //通过变量m_image来设置该静态框所显示的位图文件.三.列表控件的背景在BOOL CTuxingDlg::OnInitDialog()函数中添加以下代码m_List.SetBkColor(RGB(444, 233, 255)); //三个参数可以任意改变,下同m_List.SetTextBkColor(RGB(444, 233, 255));四.设置列表控件属性带有表格线在BOOL CTuxingDlg::OnInitDialog()函数中添加以下代码DWORD NewStyle = m_List.GetExtendedStyle();NewStyle |= LVS_EX_GRIDLINES; m_List.SetExtendedStyle(NewStyle);五.改变全部界面的背景颜色点击“Globals”,再打开“theApp”,在Bool CPersonalFinancialManagementSystemApp::InitInstance()函数中添加SetDialogBkColor(RGB(444, 233, 255), RGB(0, 0, 0));。
MFC界面设计前两天boss让写写界面,看程序看的头晕脑转,就在网上瞎搜搜,写些关于MFC的界面设计。
包括:窗体背景图、窗体大小、按钮背景图、控件透明、编辑框重影、exe图标、托盘程序。
下面逐一代码解析:窗体背景图:背景图,要在OnPaint() 函数中进行修改。
窗体不再使用默认,在else中添加代码[cpp] view plaincopyprint?//改变窗体大小MoveWindow(0,0,500,400,TRUE);//设置背景CPaintDC dc(this);CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);//在资源里添加的位图名CBrush brush;brush.CreatePatternBrush(&bitmap);CBrush* pOldBrush = dc.SelectObject(&brush); dc.Rectangle(0,0,600,400); //宽、长;dc.SelectObject(pOldBrush);//CDialog::OnPaint();按钮背景图:[cpp] view plaincopyprint?CBitmapButton m_BitmapButton;//声明按钮位图对象实现代码:[cpp] view plaincopyprint?//按钮添加图片m_BitmapButton.LoadBitmaps(IDB_BITMAP1);//位图名称m_BitmapButton.SubclassDlgItem(IDC_BConn,this);//按钮ID,句柄m_BitmapButton.SizeToContent();//把按钮设置成位图大小控件透明:重载OnCtlColor函数。
有的控件需要修改OwnerDraw属性为True。
[cpp] view plaincopyprint?afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);//透明添加消息函数:[cpp] view plaincopyprint?BEGIN_MESSAGE_MAP(CClientDlg, CDialog)//......ON_WM_CTLCOLOR()//透明//}}AFX_MSG_MAP//......END_MESSAGE_MAP() 实现:[cpp] view plaincopyprint?//重载——透明HBRUSH CClientDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// <SPAN style="WHITE-SPACE: pre"></SPAN>CTLCOLOR_BTN Button control//按钮// CTLCOLOR_DLG Dialog box//对话框// CTLCOLOR_EDIT Edit control//编辑框// CTLCOLOR_LISTBOX List-box control//列表框// CTLCOLOR_MSGBOX Message box//消息框// CTLCOLOR_SCROLLBAR Scroll-bar control// CTLCOLOR_STATIC Static control//——这些控件都能设置透明if(nCtlColor == CTLCOLOR_EDIT){pDC->SetBkMode(TRANSPARENT); //设置透明pDC->SetTextColor(RGB(255, 0, 255)); // 设置文本颜色return(HBRUSH)::GetStockObject(NULL_BRUSH);}return hBrush;编辑框重影:添加消息框的事件处理函数OnEnChange,[cpp] view plaincopyprint?//方法1CRect rtlbl;GetDlgItem(IDC_EPort)->GetWindowRect(&rtlbl); ScreenToClient(&rtlbl); //转到客户端界面InvalidateRect(&rtlbl);//刷新对话框背景////方法二GetDlgItem(IDC_EPort)->GetParent()->RedrawWindow();//会闪动exe图标:如果资源里的图标有多个,exe会自动选择较小的作为自己的图标。
MFC启动画面设计
玩过微软的Office的人都知道,每当打开Office软件,在它初始化的那段时间里,都会出现一个画面,这个画面就是启动画面。
所谓启动画面也就是Splash Screen,你也可以说它是“炫耀画面”。
它常常用以显示公司的标志和版权等信息。
目标
用一张位图来作为启动画面,在进入程序时显示。
策略
在应用程序类的I n i t I n s t a n c e ()函数中,在最早时刻创建启动窗口。
启动窗口用一个位图类显示在普通窗口中。
步骤
1.创建一个启动窗口类
1)用ClassWizard创建一个从一般CWnd类(当然也可以是CFrameWnd类)派
生的普通窗口类。
如图所示:
2)添加Create()成员函数到该类,在该函数中装入启动窗口中显示的位图,以及
在屏幕中央创建该窗口。
void CWzdSplash::Create(UINT nBitmapID)
{
m_bitmap.LoadBitmap(nBitmapID);
BITMAP bitmap;
m_bitmap.GetBitmap(&bitmap);
int x=(::GetSystemMetrics(SM_CXSCREEN)-bitmap.bmWidth)/2;
int y=(::GetSystemMetrics(SM_CYSCREEN)-bitmap.bmHeight)/2;
CRect rect(x,y,x+bitmap.bmWidth,y+bitmap.bmHeight);
CreateEx(0,AfxRegisterWndClass(0),"",WS_POPUP|WS_VISIBLE|WS_BORDE R,rect,NULL,0);
}
3)用ClassWizard添加一个WM_PAINT消息处理函数到该窗口类中,在这里用
BitBlt()把位图绘制到屏幕上。
void CWzdSplash::OnPaint()
{
CPaintDC dc(this); // device context for painting
BITMAP bitmap;
m_bitmap.GetBitmap(&bitmap);
CDC dcComp;
dcComp.CreateCompatibleDC(&dc);
dcComp.SelectObject(&m_bitmap);
// draw bitmap
dc.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dcComp,0,0,SRCCOPY);
}
2.把启动窗口类插入到InitInstance()函数中
1)在应用程序类的InitInstance()函数的开始处,创建该启动类的一个实例,调用它的Create(),并强制它进行绘制。
CWzdSplash wndSplash; //创建启动窗口类的实例
wndSplash.Create(IDB_BITMAP1);
wndSplash.UpdateWindow(); //send WM_PAINT
2)因为启动窗口类创建在堆栈中,一旦InitInstance()返回,该窗口将被自动销毁,因此,如果应用程序花费大量时间进行初始化,则不必采用在应用程序中加延时的方法,使启动窗口停留足够长的时间以确保读取显示的信息;如果应用程序花费很少时间进行初始化,或者担心高速机器把启动窗口变成影像,添加下面代码行到InitInstance( )的某个地方以对应用程序进行延时处理。
// add if splash screen too short
Sleep(2000);
至此,一个具有启动画面的小程序完成了,大家可以试试看它的运行效果。