⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9927.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:

public:
BOOL Create(CWnd* pParentWnd=NULL);
HANDLE hBitsSrc;
LPSTR pBitsSrc;
UINT iW,iH;

----四、建立启动封页窗口:在splash.cpp中增加Create函数,建立显示位
图的弹出窗口:

#include "windowsx.h"//增加扩展窗口建立
......
struct{//位图文件头结构
BITMAPINFOHEADER Header;
}Info;
BOOL CSplashWnd::Create(CWnd* pParentWnd)
{ //建立显示位图的弹出窗口
return CreateEx(0,AfxRegisterWndClass(0,
AfxGetApp()- >LoadStandardCursor(IDC_ARROW)),
NULL,WS_POPUP|WS_VISIBLE,0,0,672,480,
pParentWnd- >GetSafeHwnd(),NULL);
}
int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ ......
// TODO: Add your specialized creation code here
CenterWindow();//使弹出窗口居中
return 0;
}

----五、完善析构函数:在splash.cpp中完善析构函数,为显示位图作准备: 

CSplashWnd::CSplashWnd()//完善析构函数
{ iW=672;iH=480;//位图的宽度和高度
Info.Header.biSize=sizeof(BITMAPINFOHEADER);
Info.Header.biWidth=iW;
Info.Header.biHeight=iH;
Info.Header.biPlanes=1L;
Info.Header.biBitCount=24L;
hBitsSrc=::GlobalAlloc(GHND,(long)(iW*iH*3));//分配内存
pBitsSrc=(LPSTR)::GlobalLock(hBitsSrc);//加锁内存
}
CSplashWnd::~CSplashWnd()
{ ::GlobalUnlock(hBitsSrc);//解锁内存
::GlobalFree(hBitsSrc);//释放内存
}

----六、显示真彩位图:在splash.cpp中完善Onpaint函数,实现真彩位图
的显示: 

void CSplashWnd::OnPaint()
{......// TODO: Add your message handler code here
CFile fbmp;
fbmp.Open("c:\\windows\\EMC1.BMP",CFile::modeRead|
CFile::typeBinary|CFile::shareExclusive);//打开文件
fbmp.Seek(54,CFile::begin);//位图文件头为54字节
fbmp.ReadHuge(pBitsSrc,(long)(iW*iH*3));//读文件
fbmp.Close();//关闭文件
HBITMAP hBitmap=::CreateDIBitmap(dc.m_hDC,
(BITMAPINFOHEADER FAR*)&(Info.Header),CBM_INIT,
pBitsSrc,(LPBITMAPINFO)&Info,DIB_RGB_COLORS);//建立位图
HDC hMemDC=::CreateCompatibleDC(dc.m_hDC);//建立内存
HBITMAP hBitmapOld=SelectBitmap(hMemDC,hBitmap);//选择对象
::StretchBlt(dc.m_hDC,0,0,iW,iH,hMemDC,
0,0,iW,iH,SRCCOPY);//显示真彩位图
::DeleteObject(SelectObject(hMemDC,hBitmapOld));//删除位图
}

----七、弹出窗口类声明:在Mainfrm.h中增加代码,为显示和撤销弹
出窗口作准备:

class CsplashWnd;//闪烁窗口类
......
class CMainFrame : public CMDIFrameWnd
{......
public:
CSplashWnd SplashWnd;//声明类

----八、真彩封页的实现:在Mainfrm.cpp中增加显示弹出窗口、播放音乐、
延时功能和撤销弹出窗口的代码,以实现真彩封页的整个处理过程:

#include "splash.h" //新类支持
#include "mmsystem.h"//多媒体支持
#pragma comment(lib,"WINMM.LIB")//多媒体支持
......
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
SplashWnd.Create(this);//创建弹出窗口
SplashWnd.ShowWindow(SW_SHOW);//显示弹出窗口
SplashWnd.UpdateWindow();//更新弹出窗口
int dd=sndPlaySound("c:\\windows\\reminder.wav",
SND_ASYNC|SND_LOOP);//异步播放WAV文件
if (dd==FALSE){//参数SND_ASYNC|SND_LOOP可循环播放
AfxMessageBox("播放WAV文件错误~");
}
::Sleep(2000);//进程休眠2秒
......//应用程序初始化工作
dd=sndPlaySound("",SND_ASYNC);//终止播放.WAV文件
SplashWnd.DestroyWindow();//撤消弹出窗口
return 0;
}

----经过上述八个步骤的处理,整个多媒体真彩启动封页制作完毕。读者还可
根据需要增加动画和移动字幕等其它多媒体效果。 

****************************************************************

                   Win95通用对话框函数编制原理 

                            (广西 杨环)

  本文通过分析GetOpenFileName函数入口参数和目标代码,介绍Windows95
通用对话框函数的实现原理,详细讨论Windows95通用对话框函数的编制原理,
以求对程序编制人员有所帮助。
  编制原理
  编制一个通用对话框函数包括四个方面的内容:定义通用对话框模板、定
义函数入口参数结构、编制通用对话框处理过程和通用对话框函数。
  定义通用对话框模板
  定义通用对话框模板时,将功能相近的对话处理进行提炼,只将共用频度
高的控制件设计到对话框中,这样可以使调用函数编制起来简单一些。一般情
况下,对话框中除一些“数据输入”控制件外,还应包括IDOK、IDCANCEL按钮,
有时还有IDC—HELP帮助按钮。
  定义入口参数结构
  在Windows95通用对话框函数中,入口参数都是一个结构变量指针,这些
指针所指结构变量有许多相同含义的成员,如结构自身的长度(lStructSize)、
对话框父窗句柄(hWndOwn er)、拥有替代对话框的程序实例句柄(hInstance)、
控制标志(Flags)、用户数据指针( lCustData)、钩子函数指针(lpfnHook),
以及替代对话框模块名指针(lpTemplateName)等。因此结构定义具有如下形式:
   typedef struct tagCmDlgData{
   DWORD lStructSize;
   HWND hWndOwner;
   HINSTANCE hInstance;
   DWORD Flags;
   LPARAM lCustData;
   UINT(CALLBACK*lpfnHook)(HWND,UINT,WPARAM,LPARAM);
   LPCSTR lpTemplateName;
   /*此处可定义其它成员*/
   }CmDlgData;
  其结构成员Flags一般包括标志常量F—ENABLETEMPLATE、F—ENABLETEMPLATEHANDLE、
F—ENABLEHOOK、F—SHOWHELP等,对于特定的对话框,还需增加其它标志。这
些标志常量是32位值,它们不在相同的位上是1,这些标志常量通过|(或)操作
赋于成员Flags。设置F—ENABLETEMPLATE标志,lpTemplateName指定替代对话
框名指针,hInstance指定拥有替代对话框的程序实例句柄,它可以是WinMain
入口参数的实例句柄,或是WinExec、Load Module、LoadLibrary的返回值。设
置F—ENABLETEMPLATEHANDLE标志,使用替代对话框,但不使用lpTemplateName
成员,只使用hInstance成员,这时hInstance是指对话框模板资源的全局内存
句柄,它可以是LoadResource的返回值。设置F—ENABLEHOOK标志,使成员
lpfnHook指定的钩子函数有效。设置F—SHOWHELP标志,产生的通用对话框中显
示“帮助”按钮,由于对话框过程将发送消息到父窗,因此成员hWndOwner不能
是NULL。这里标志F—EN ABLETEMPLATE、F—ENABLETEMPLATEHANDLE和F—ENABLEHOOK
就是为处理相近对话框中的不同或扩展对话框的功能而定义。
  编制通用对话框处理过程
  在对话框处理过程中,一般都定义OKMSGSTRING和HELPMSGSTRING消息串,
OKMSGSTRIN G对应的消息是在对话框过程处理完IDOK按钮消息后,被发送到钩
子函数。HELPMSGSTRIN G对应的消息是在按“帮助”按钮后,由对话框过程发
送到对话框的父窗口。
  对话框处理过程在处理消息WM—INITDIALOG时,从Param参数中获得
DialogBoxParam()或DialogBoxIndirectParam()的最后一个参数值,即结构变
量指针,将该值放入静态变量pCDD中,接着登录自定义消息OKMSGSTRING、
HELPMSGSTRING,它们的消息标识值分别放入静态变量中。
  处理WM—INITDIALOG消息后,在“if(pCDD){…}”语句块中,调用钩子函
数。这里判别pCDD是否非零,是由于对话框处理过程获得消息WM—SETFONT在
先,消息WM—INITDIALOG在后,注意该条件实际上过滤了传向钩子函数的
WM—SETFONT消息(为了不过滤WM—SETFONT 消息,可定义pCDD为全局变量,在
通用对话框函数中赋值)。
  接下来,处理钩子函数未作处理的消息,一般是通用对话框中包含的控制
件消息。在处理IDC—HELP按钮消息时,我们可以使用PostMessage()函数传递
ELPMSGSTRING对应的消息到父窗口,不用等待消息返回,这种方法是应用程序
中“帮助”按钮的常用处理方法。
  注意在处理IDOK后调了钩子函数,相当于通过SendMessage()函数发送
OKMSGSTRING标识的消息到钩子函数,不同点是前者能够获得钩子函数的返回
值,这是对话框处理过程需要的,以便确定是否退出对话框。按一次IDOK按钮,
给钩子函数两个不同消息,第一个是W M—COMMAND消息(wParam参数是IDOK),
第二个是OKMSGSTRING所标识的消息(lParam参数是pCDD)。但是,在应用程序定
义的钩子函数中,一般不处理第一次获得的消息,而只处理第二次获得的消息。
  下面列出对话框处理过程源程序:
   BOOL CALLBACK —export
   CommDlgProc(HWND hDl,UINT
   iMessage,WPARAM wParam,L
   PARAM lParam)
   {static CommDlgData *pCDD=NULL;
   static UINT OkMsg,HelpMsg;
   UINT retHook;
   if(iMessage==WM-INITDIALOG)
   {pCDD=(CommDlgData*)lParam;
   OkMsg=RegisterWindowMessage(OKMSGSTRING);
   HelpMsg=RegisterWindowMessage(HELPMSGSTRING);
   if(pCDD->Flags & F-SHOWHELP)
   ShowWindow(GetDlgItem(hDlg,IDC—HELP),SW—SHOW);
   else
   ShowWindow(GetDlgItem(hDlg,IDC—HELP),SW—HIDE);
   /*此处加入对通用对话框及其控制件作其它初始化处理程序段*/
   (pCDD->lpfnHook)(hDlg,iMessage,wParam,lParam);
   return(TRUE);
   }
   if(pCDD)
   {if(pCDD->Flage & F—ENABLEHOOK)
   retHook=(pCDD->lpfnHook)(hDlg,iMessage,
   wParam,lParam);
   else
   retHook=0;
   if(retHook)
   return retHook;
   }
   switch(iMessage)
   {
   case WM—CLOSE:
   EndDialog(hDlg,FALSE);
   pCDD=NULL;
   return TRUE;
   case WM—COMMAND:
   switch(wParam)
   {case IDOK:
   //此处加入IDOK按钮功能程序段
   //如:检查对话框控制件数据的合法性
   //给结构成员赋结果值
   retHook=(pCDD->lpfnHook)(hDlg,OkMsg,0,
   (LPARAM)pCDD);
   if(retHook==0)
   {EndDialog(hDlg,TRUE);
   pCDD=NULL;
   }
   return TRUE;
   case IDCANCEL:
   EndDialog(hDlg,FALSE);
   pCDD=NULL;
   return TRUE;
   case IDC—HELP:
   PostMessage(pCDD->hWndOwner,HelpMsg,0,01);
   return TRUE;
   //此处加入其它控制件消息处理
   //程序段
   default:
   return FALSE;
   }
   default:
   return(FALSE);
   }
   }
  编制通用对话框函数
  编制通用对话框函数时,考虑通用对话框模板可能来自不同的程序,因此
在该函数体中调用了外部函数GetCommDlgHinst,它的功能是获得包含通用对话
框模板的程序实例句柄,它的返回值可以是WinMain入口参数的实例句柄,或是
WinExec、LoadModule、LoadLi brary的返回值。通用对话框函数的功能主要是
产生指定对话框。如果成员Flags设置了F—ENABLETEMPLATE或F—ENABLETEMPLATEHANDLE
标志,则产生替代对话框,否则,产生通用对话框,由于需要将该函数的入口
参数(结构变量指针)传递给对话框处理过程,因此在函数中使用Windows API的
DialogBoxParam()和DialogBoxIndirectParam()函数产生对话框,这两个函数参
数hWndOwner是否为NULL,只有退出对话框后,它们才返回到调用函数,因此,
lCustData这样的指针成员可以指向局部变量。下面列出通用对话框函数源程序:
   int GetDataFromCommDlg(CommDlgData *pCDD)
   {extern HINSTANCE GetCommDlgHinst(void);
   DLGPROC lpfnDlgProc;int st;
   HINSTANCE hInstCommDlg;
   hInstCommDlg=GetCommDlgHinst();
   lpfnDlgProc=(DLGPROC)MakeProcInstance
   ((FARPROC)CommDlgProc,hInstCommDlg);
   if(pCDD->Flags & F—ENABLETEMPLATE)
   st=DialogBoxParam(pCDD->hInstance,pCDD->
   lpTemplateName,
   pCDD->hWndOwner,lpfnDlgProc,(LPARAM)
   pCDD);
   else if(pCDD->Flags &
   F—ENABLETEMPLATEHANDLE)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -