vc基于对话框的应用程序添加启动画面
- 格式:doc
- 大小:14.50 KB
- 文档页数:2
怎么样在VC中使用Static控件来显示图像?在使用MFC编写程序时,经常需要显示图像;根据GDI的要求,需要一个DC(设备内容)作为显示的基础;实际上任何Windows的窗口都可以作为一个DC,我们可以通过API或MFC的函数来得到,例如:HDC GetDC (HWND);---这里的HWND是窗口的句柄CDC * CWnd::GetDC ();---这里的CWnd实际上是任何从CWnd的类当我们使用MFC的单文档或多文档框架时,我们可以使用CView作为图像显示的DC,这个时候我们将绘制图像的操作放在OnDraw中就可以了;当窗口无效或更新的时候,框架会自动调用该函数来重新绘制图像;这里没有什么问题,我们主要来谈谈另外一种模式:当你需要在一个基于Dialog程序或一个CDialog控件中显示图像的问题。
实际上什么控件都可以作为图像显示的DC,他们可以是按钮、图片控件、Static控件等,只要有窗口的控件都可以得到DC。
这里仅以Static控件作为图像显示的控件来介绍。
首先看我程序的基本逻辑:源文件后面的按钮是用来选择位图文件的;而下面的图像显示区域是用来显示图像的Static 控件;当设置好要显示的图像文件以后,图像就自动在Static中画出来。
●第一次一开始,我在CDialog对应的按钮处理程序中调用显示图像的代码,代码如下(IDC_PICVIEW为Static的ID):然后在CImageCntDlg::OnPaint中也调用ShowImage(TRUE);然后编译运行。
一开始还可以,选择BMP文件之后也可以正确选择,但当激活另一个程序(也就是隐藏了该窗口),然后再激活这个程序,这个时候发现Static中图像显示闪烁一下后变成灰色的背景。
到底什么发生了?●到底什么发生了?上面的现象告诉我们,即使我们将ShowImage放在CDialog的WM_PAINT处理消息中,在某些情况下仍然不能正确的处理。
卓为VC——界面窗口——VC对话框小知识一、对话框属性:1.Styles->Clip siblings:排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到绘图消息时,将所有重叠窗口排除在外,只重绘指定的子窗口。
Styles->Clip children:当在父窗口内绘图时,排除子窗口区域。
2.More StylesSystem modal:系统模式对话框Absolute align:坐标相对于屏幕原点Set foreground:设置为前台窗口No fail create:应用于Windows 95No idle message:不发送空闲消息Control:不使用标题栏的对话框Center:在屏幕中心显示对话框Center mouse:以鼠标坐标为对话框中心显示对话框Local edit:指定编辑控件的正文将存储于应用程序的局部数据段中3.Extended StylesTool Window:工具栏窗体Client edge:对话框边框下凹Static edge:对话框边框为实边框Accept files:是否接受文件拖放Control parent:用<Tab>键在窗口的子窗口间搜索Context help:在窗口标题栏添加一个问号按钮No parent notify:以这个风格创建的窗口在创建和销毁时,不向父窗口发送 WM_PARENTNOTFY消息二、对话框的创建与显示1.模态对话框:CDlg dlg;dlg.DoModal();CDialog::OnOK();//或CDialog::OnCancel() 关闭模态对话框2.非模态对话框CDlg *dlg=new CDlg;dlg->Create(IDD_DIALOG,this);dlg->ShowWindow(SW_SHOW);dlg->DestroyWindow(); //销毁非模态对话框,若在一个非模态对话框中实现OnCancel方法,需在内部调用DestroyWindow方法,不要调用基类的OnCancel方法,因为它调用EndDialog方法将使对话框不可见,但不销毁对话框。
用VC制作初始画面在以前的“电脑工作室”中,我们曾介绍过用VB、VFP制作初始画面,那么,如何在VC中绘制软件初始画面呢?本文将详细介绍其设计步骤。
1. 创建一个SDI或MDI工程。
2. 新建或导入一个ID号为IDB—SPLASH的位图。
3. 从CWnd类派生一个名为CSplashWnd的子类,并添加两个保护成员变量:CBitmap m—bitmap;//初始画面位图staticCSplashWnd c—pSplashWnd;//指向初始画面窗口的指针c—pSplashWnd为静态成员变量,应在类的实现文件(.cpp)开头说明:CSplashWnd CSplashWnd::c—pSplashWnd;4. 向CSplashWnd类中加入一个静态公有成员函数ShowSplashScreen,此函数将被主框架窗口调用:voidCSplashWnd::ShowSplashScreen(CWnd pParentWnd){ //此函数传递的参数是主框架窗口if(c—pSplashWnd!=NULL) return;c—pSplashWnd=new CSplashWnd;if(!c—pSplashWnd->Create(pParentWnd))//创建初始画面窗口delete c—pSplashWnd;elsec—pSplashWnd->UpdateWindow();//显示初始画面窗口}5. 编辑ShowSplashScreen函数中调用的Create函数(保护成员函数):BOOL CSplashWnd::Create(CWnd pParentWnd){if(!m—bitmap.LoadBitmap(IDB—SPLASH))//载入位图return FALSE;BITMAP bm;m—bitmap.GetBitmap(&bm);return CreateEx(0, AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC—WAIT)),NULL, WS—POPUP | WS—VISIBLE, 0, 0, bm.bmWidth, bm.bmHeight,pParentWnd->GetSafeHwnd(), NULL);//创建主框架窗口的子窗口}6. CreateEx将调用OnCreate函数进行窗口的初始化,重载此函数:intCSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CWnd::OnCreate(lpCreateStruct)==-1)return -1;CenterWindow();SetTimer(1,1000,NULL); //时间控制return 0;}7. 显示窗口时发送WM—PAINT消息,所以我们映射此消息:voidCSplashWnd::OnPaint(){CPaintDCdc(this);CDC dcImage;if(!dcImage.CreateCompatibleDC(&dc)) return;BITMAP bm;m—bitmap.GetBitmap(&bm);CBitmap pOldBitmap=dcImage.SelectObject(&m—bitmap);dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcImage,0,0,SRCCOPY);dcImage.SelectObject(pOldBitmap);}8. 映射WM—TIMER消息,从而在一定时间后销毁窗口:voidCSplashWnd::OnTimer(UINT nIDEvent){DestroyWindow(); //销毁初始画面窗口AfxGetMainWnd()->UpdateWindow();//刷新主框架窗口}9. 为防止内存溢出,窗口销毁后要释放CSplashWnd对象,为此,我们重载虚拟函数PostNcDestroy,此函数在窗口销毁后调用:voidCSplashWnd::PostNcDestroy(){delete this;}10. 最后,为了显示初始画面,我们在主框架窗口的OnCreate函数最后调用ShowSplashScreen函数,当然别忘了将CSplashWnd的头文件包含进去:CSplashWnd::ShowSplashScreen(this);以上程序在VC++6.0中调试通过。
VC对话框程序添加目录菜单、工具条和状态栏为<对话框>添加工具条和状态栏前,先说说添加目录菜单栏;1,在Insert下拉菜单中选择Resorce,新建一个MENU,2,在CDialog::OnInitDialog();后面添加代码:CMenu menu;menu.LoadMenu(IDR_MENU1); // 红色部分为你新建MENU的ID索引SetMenu(&menu);为对话框程序添加工具条和状态栏摘要:本文介绍了在对话框程序基础上通过程序控制来动态添加工具条和状态条的实现过程和方法。
一、引言对于不需要文档/视图结构支持的程序一般都采用对话框做为程序的基础框架。
虽然在对话框程序上可以通过修改其属性来添加系统菜单,但对比SDI和MDI程序的工具条和状态栏未免使界面显得简单、单调。
虽然在Visual Basic 中提供有独立的工具条和状态栏标准控件可以直接在对话框上使用,但Visual C++ 6.0所提供的26种基本Windows标准控件却没有将它们包含其中。
因此要在对话框程序中实现工具条和状态栏只能通过编程来动态实现。
二、工具条的实现过程MFC对于工具条和状态栏分别提供了CToolBar和CStatusBar两个基本类库,但由于在实现时MFC 对其做了过多的封装,以至无法了解内部的一些核心技术。
因此本文在实现过程中放弃了相对比较方便的CToolBar和CStatusBar类的使用,而是通过SDK(Software Developers Kit,软件开发工具箱)式的WinAPI 应用程序接口来实现的。
在API函数中经常需要用到对话框的窗口句柄和当前的实例句柄,在SDK程序设计中以上两个句柄可以直接从入口函数WinMain()中引出,而在MFC下也对其做了封装,不能直接获取。
但MFC也为其留有接口:CWnd窗口类提供的GetSafeHwnd()可以返回对话框的窗口句柄;函数AfxGetInstanceHandle()则可以获取当前应用程序的实例句柄。
创建漂亮的应用程序界面刘汇丹facteur@1. 首先在VC里面建立基于对话框的可执行应用程序工程,命名为demo。
2. 在主窗体对话框属性里取消Title bar属性,去掉对话框标题栏。
在对话框窗体里面添加如下图所示的各个控件实例。
靠右侧的那个Edit控件设置了只读属性。
3. 为两个Edit、Slider和进度条设置相应的映射变量。
在CDemoDlg::OnInitDialog()函数中设置初始值。
4. 使用位图作为窗体的背景。
使用绘图软件制作出喜欢的图片,保存为位图文件back.bmp,如下图所示。
注意制作的图片要和对话框窗体大小一致,本例中图片的大小为(380px,260px),背景色为RGB(127, 169, 255)。
将此位图文件拷贝到res文件夹下,并导入到工程里面,设置ID为IDB_BACKBMP,为CDemoDlg类添加保护成员变量CBitmapm_back,并在CDemoDlg::OnInitDialog()函数里面添加如下代码:在CDemoDlg::OnPaint()函数里面,以如下代码替换原来自动生成的代码:经过以上步骤以后,编译运行应用程序,可以看到如下图所示的效果:可以看到,窗体中各个控件的背景颜色和背景图片的颜色不一致。
我们需要做进一步的调整。
5. 统一设置控件的背景颜色:在CDemoApp::InitInstance()函数中int nResponse = dlg.DoModal()语句前插入如下代码:运行应用程序,效果如下图所示:此时,大部分控件的背景颜色已经和背景图片的颜色一致,已经基本形成了比较漂亮的图形界面。
但是我们要做得完美一些。
6.这一步,我们实现漂亮的按钮。
制作三个图片分别表示“确定”按钮正常、获取焦点和鼠标按下时的状态,如下面各图所示:将此三个图片保存为bmp格式的文件并导入到工程中,设置ID分别为IDB_OKUP,IDB_OKFOCUS,IDB_OKDOWN。
vc基于对话框的应用程序添加启动画面(2009-05-10 16:26:36)转载▼标签: it 分类: VC
1、利用组件库中的Splash Screen组件生成Splash1.cpp 和Splash1.h 这两个文件(也就是
基于框架类的应用程序添加启动画面的步骤)
(1)用Photoshop等制作启动画面图像,保存为bmp格式。
(2)用Appwizard建一个基于单文档的工程Splash。
(3)在资源中插入位图资源 打开VC++的资源编辑器,用鼠标右键单击Resources文件
夹,选择Import命令,插入所制作的位图。如果位图超过256色,VC会弹出一个对话框,
提示位图已经插入但不能在位图编辑器中显示,确定即可。将位图ID改为IDB_SPLASH。
(4)添加Splash Screen控件
①选择菜单“project”/“Add To Project”/“Conponents and Controls”打开对话框,在列表框中
双击“Visual C++ Conponents”选项,选择“Splash Screen”控件,然后单击“Insert”。
②确认或修改类名和位图资源ID,单击OK确认。
③编译、连接,漂亮的启动画面就显示出来了。
(5)如果需要改变启动画面的停留时间,就修改SetTimer()函数的第二个参数,默认是750 毫
秒。该函数所在位置:
int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
// Set a timer to destroy the splash screen.
SetTimer(1, 2000, NULL); //修改第二个参数以调整画面停留时间
return 0;
}
这样就生成了Splash1.cpp 和Splash1.h 这两个文件
2、制作基于对话框的应用程序启动画面
(1)建立基于对话框的工程Cover。
(2)文件移植
①将Splash1.cpp 和Splash1.h 两个文件从步骤一建立的工程拷贝到Cover工程中,并且
分别加入到Source Files和Header Files中;
②导入位图文件到工程的资源中,改ID为IDB_SPLASH。
(3)修改代码,实现启动画面的调用
①添加CCoverApp 的InitInstance() 函数代码
#include "Splash1.h" //加在Cover.cpp文件的头文件调用部位
BOOL CCoverApp::InitInstance()
{
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
CSplashWnd::EnableSplashScreen(cmdInfo.m_bShowSplash);
...
}
②使用ClassWizard 添加OnCreate() 函数到对话框类CCoverDlg中,并修改代码#include
"Splash1.h" //加在CoverDlg.cpp文件的头文件调用部位
int CCoverDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
CSplashWnd::ShowSplashScreen(this); //显示启动画面
...
}
3.使得启动画面消失后再显示主程序
①在CCoverDlg类中添加WM_TIMER消息响应函数
void CCoverDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
this->MoveWindow(300,300,600,400);
CDialog::OnTimer(nIDEvent);
}
② 在intCCoverDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加如下代码:
CSplashWnd::ShowSplashScreen(this);
this->MoveWindow(0,0,0,0);
this->SetTimer(1,2000,NULL);//注意这个2000一点要等于步骤1中的2000
return 0;
③在void CCoverDlg::OnPaint()的末尾添加如下代码:
this->KillTimer(1);