MFC知识收集

1.状态栏上显示时间 void CMainFrame::OnUpdateTime(CCmdUI* pCmdUI) { CTime timeCur=CTime::GetCurrentTime(); char szOut[20]; sprintf( szOut,"%02d:%02d:%02d",timeCur.GetHour(),timeCur.GetMinute(),timeCur.GetSecond()); pCmdUI->SetText(szOut); } CTime time;//构建了一个CTime对象time time=CTime::GetCurrentTime();//获得当前的系统时间 CString s=time.Format("%H:%M:%S");//返回一个按时:分:秒的格式表示的字符串

 

2. 更新时间窗格显示的正文 //SetPaneText的第一个参数是窗格的索引,对于某一个窗格ID,可调用CStatusBar::CommandToIndex来获得索引。 m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s); CFrameWnd::OnTimer(nIDEvent); -----------------------------------------------------------------------------------------

 

3. 生成和销除一个静态对话框 void CYourView::OnOpenDlg(void) { /*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/ CTestDlg *dlg=new CTestDlg; dlg->Create(IDD_TEST_DLG,NULL); dlg->ShowWindows(SW_SHOW); /*不要调用 delete dlg;*/ } void CTestDlg1::OnOK() { CDialog::OnOK(); DestroyWindow(); } void CTestDlg1::OnCancel() { CDialog::OnCancel(); DestroyWindow(); } void CTestDlg1::OnDestroy() { CDialog::OnDestroy(); AfxMessageBox("call delete this"); delete this; } -----------------------------------------------------------------------------------------

 

4.GetDlgItem 返回对话框控件句柄======================= ((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->AddString("开关状态"); ((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->AddString("开关状态抽查"); ((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->SetCurSel(0); ((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->AddString("开关状态抽查"); ((CComboBox *)GetDlgItem(IDC_COMBO_TYPE))->SetCurSel(0); -----------------------------------------------------------------------------------------

 

5. 如何进行文件操作=======================取得文件名打开文件 移动文件指针 读写文件 关闭文件 取得文件名 { CString FilePathName; CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框 if(dlg.DoModal()==IDOK) FilePathName=dlg.GetPathName(); } 相关信息:CFileDialog 用于取文件名的几个成员函数:假如选择的文件是C:/WINDOWS/TEST.EXE 则: (1)GetPathName();取文件名全称,包括完整路径。取回C:/WINDOWS/TEST.EXE (2)GetFileTitle();取文件全名:TEST.EXE (3)GetFileName();取回TEST (4)GetFileExt();取扩展名EXE 打开文件 CFile file("C:/HELLO.TXT",CFile::modeRead);///只读方式打开 ///CFile::modeRead可改为 CFile::modeWrite(只写),CFile::modeReadWrite(读写),CFile::modeCreate(新建) 例子: { CFile file; file.Open("C:/HELLO.TXT",CFile::modeCreate|Cfile::modeWrite); ... ... } 移动文件指针 file.Seek(100,CFile::begin);///从文件头开始往下移动100字节 file.Seek(-50,CFile::end);///从文件末尾往上移动50字节 file.Seek(-30,CFile::current);///从当前位置往上移动30字节 file.SeekToBegin();///移到文件头 file.SeekToEnd();///移到文件尾读写文件读文件: char buffer[1000]; file.Read(buffer,1000); 写文件: CString string("这个世界只有偏执狂才能成功"); file.Write(string,8); 关闭文件 file.Close(); -----------------------------------------------------------------------------------------

 

6. CWnd::IsDlgButtonChecked函数,=======================用来判断单选按钮或检查框是否被选择,该函数的声明为 UINT IsDlgButtonChecked(int nIDButton) const; 参数nIDButton为按钮的ID。若按钮被选择,则函数返回1,否则返回0,若按钮处于不确定状态,则返回值为2。

 

7. CWnd::GetDlgItem函数,=======================用来获得指向某一控件的指针,该函数的声明为 CWnd* GetDlgItem(int nID) const; 参数nID为控件的ID。该函数返回一个指定控件的CWnd对象指针,通过该指针,程序可以对控件进行控制。

 

8. CWnd::EnableWindow函数,=======================该函数使窗口允许或禁止,禁止的窗口呈灰色显示,不能接收键盘和鼠标的输入。该函数的声明是 BOOL EnableWindow( BOOL bEnable = TRUE ); 若参数bEnable的值为TRUE,则窗口被允许,若bEnable的值为FALSE,则窗口被禁止。

 

 9. CListBox::SetCurSel和CComboBox::SetCurSel函数功能类似,=======================用来使列表中的某一项被选中,选中的项呈高亮度显示。函数的声明是 int SetCurSel(int nSelect); 参数nSelect指定了新选项的索引,第一项的索引值为0,若nSelect的值为-1,那么函数将清除以前的选择,使列表处于未选择状态。 -----------------------------------------------------------------------------------------

 

10. 用来管理对话框控件的CWnd成员函数=======================函数名功能 CheckDlgButton 选中或不选中按钮控件。 CheckRadioButton 选择一个指定的单选按钮并使同组内的其它单选按钮不被选择。 DlgDirList 往一个列表框中添加文件、目录或驱动器的列表。 DlgDirListComboBox 往一个组合框中的列表框内添加文件、目录或驱动器的列表。 DlgDirSelect 从一个列表框中获得当前选择的文件、目录或驱动器。 DlgDirSelectBomboBox 从一个组合框中获得当前选择的文件、目录或驱动器。 GetCheckedRadioButton 返回指定的单选按钮组中被选择的单选按钮的ID。 GetDlgItem 返回一个指向一给定的控件的临时对象的指针。 GetDlgItemInt 返回在一个指定的控件中由正文表示的数字值。 GetDlgItemText 获得在一个控件内显示的正文。 GetNextDlgGroupItem 返回一个指向一组控件内的下一个或上一个控件的临时对象的指针。 GetNextDlgTabItem 返回下一个tab顺序的控件的临时对象的指针。 IsDlgButtonChecked 返回一个按钮控件的状态。 SendDlgItemMessage 把一个消息传送给一个控件。 SetDlgItemInt 将一个整数转换为正文,并将此正文赋给控件。 SetDlgItemText 设置一个控件显示的正文。 -----------------------------------------------------------------------------------------

 

11.公用对话框类======================= CColorDialog 选择颜色 CFileDialog 选择文件名,用于打开和保存文件 CFindReplaceDialog 正文查找和替换 CFontDialog 选择字体 CPrintDialog 打印和打印设置 -----------------------------------------------------------------------------------------

 

12. 常用于控件的CWnd成员函数=======================函数名用途 ShowWindow 调用ShowWindow(SW_SHOW)显示窗口,调用ShowWindow(SW_HIDE)则隐藏窗口. EnableWindow 调用EnableWindow(TRUE)允许窗口,调用EnableWindow(FALSE)则禁止窗口.一个禁止的窗口呈灰色显示且不能接受用户输入. DestroyWindow 删除窗口. MoveWindow 改变窗口的位置和尺寸. SetFocus 使窗口具有输入焦点. m_MyEdit.ShowWindow(SW_HIDE);

 

13. 访问控件的方法=======================控件是一种交互的工具,应用程序需要通过某种方法来访问控件以对其进行查询和设置.访问控件有四种方法:法一:利用对话框的数据交换功能访问控件. -------------------------------------- 这种方法适用于自动创建的控件.先用ClassWizard为对话框类加入与控件对应的数据成员变量,然后在适当的时侯调用UpdateData,就可以实现对话框和控件的数据交换.这种方法只能交换数据,不能对控件进行全面的查询和设置,而且该方法不是针对某个控件,而是针对所有参与数据交换的控件.另外,对于新型的Win32控件,不能用ClassWizard创建数据成员变量.因此,该方法有较大的局限性.法二:通过控件对象来访问控件. -------------------------------------- 控件对象对控件进行了封装,它拥有功能齐全的成员函数,用来查询和设置控件的各种属性.通过控件对象来访问控件无疑是最能发挥控件功能的一种方法,但这要求程序必需创建控件对象并使该对象与某一控件相连.对于自动创建的控件,可利用ClassWizard方便地创建与控件对应的控件对象.对于手工创建的控件,因为控件本身就是通过控件对象创建的,所以不存在这一问题.法三:利用CWnd类的一些用于管理控件的成员函数来访问控件. -------------------------------------- 只要向这些函数提供控件的ID,就可以对该控件进行访问.使用这些函数的好处是无需创建控件对象,就可以对控件的某些常用属性进行查询和设置.该方法对自动和手工创建的控件均适用.法四:用CWnd::GetDlgItem访问控件. -------------------------------------- 该函数根据参数说明的控件ID,返回指定控件的一个CWnd型指针,程序可以把该指针强制转换成相应的控件类指针,然后通过该指针来访问控件.该方法对自动和手工创建的控件均适用.其实该方法与通过控件对象来访问控件的方法在本质上是一样的. (CEdit*)GetDlgItem(IDC_EDIT1) = --------------------------------------------------------------------------------------

 

14. 视图======视图类从CView派生,它是数据的用户窗口如果文档需要卷滚,需要从CScrollView派生出视图类。如果希望视图按一个对话框模板资源来布置用户界面,可以从CFormView派生。 --------------------------------------------------------------------------------------

 

 15. 设备上下文====== MFC中与GDI有关的类为了支持GDI绘图,MFC提供了两种重要的类:设备上下文类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。设备上下文类设备上下文类包括CDC和它的派生类CClientDC、CPaintDC、CWindowDC、CMetaFileDC。 CDC是设备上下文类的基类,除了一般的窗口显示外,还用于基于桌面的全屏幕绘制和非屏幕显示的打印机输出。 CDC类封装了所有图形输出函数,包括矢量、光栅和文本输出。 CClientDC(客户区设备上下文)用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。用法是: CClientDC dc(this);//this一般指向本窗口或当前活动视图 //利用dc输出文本,如果是在CScrollView中使用,还要注意调用OnPrepareDC(&dc)调整设备上下文的坐标。 dc.TextOut(10,10,str,str.GetLength()); CPaintDC用于响应窗口重绘消息(WM_PAINT)是的绘图输出。 CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。 EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。 CWindowDC用于窗口客户区和非客户区(包括窗口边框、标题栏、控制按钮等)的绘制。除非要自己绘制窗口边框和按钮(如一些CD播放程序等),否则一般不用它。 CMetaFileDC专门用于图元文件的绘制。图元文件记录一组GDI命令,可以通过这一组GDI命令重建图形输出。使用CMetaFileDC时,所有的图形输出命令会自动记录到一个与CMetaFileDC相关的图元文件中 -------------------------------------------------------------------------------------- /

 

16 .绘图工具栏的显示与隐藏 void CMainFrame::OnViewToolbar1() { // TODO: Add your command handler code here m_wndToolBar1.ShowWindow(m_wndToolBar1.IsWindowVisible()? SW_HIDE:SW_SHOW); RecalcLayout();//窗口重新布局 } //检查工具栏按钮是否被选中 void CMainFrame::OnUpdateViewToolbar1(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_wndToolBar1.IsWindowVisible()); } --------------------------------------------------------------------------------------

 

17. 创建一个状态栏需要以下几个步骤:构建一个CStatusBar对象。调用CStatusBar::Create创建状态栏窗口。调用CStatusBar::SetIndicators函数分配窗格,并将状态栏的每一个窗格与一个字符串ID相联系。 --------------------------------------------------------------------------------------

 

18. 位图====== CBitmap bitmap;//生成一个对象 CDC dcMemory; bitmap.LoadBitmap(IDB_BITMAP1);//加载 dcMemory.CreateCompatibleDC(pDC);//为位图创建一个特殊的内存设备环境。 dcMemory.SelectObject(&bitmap); pDC->BitBlt(100,100,54,96,&dcMemory,0,0,SRCCOPY); -------------------------------------------------------------------------------

 

19. 颜色对话框的使用============注:  m_ncolor保存当前选择的颜色 void CCommandDialogView::OnTestColor() { // TODO: Add your command handler code here CColorDialog dlg(this->m_color); if (dlg.DoModal()==IDOK) { this->m_color=dlg.GetColor(); } } -----------------------------------------------------------------------------------

 

20. 设备环境与位图========== (1)DC(Device Context),有的称之为设备上下文,有的称之为设备环境,还有的称之为设备描述表。 DC比较像一组绘图工具,有画布(绘图表面)、画笔、画刷、调色板等。 MFC中CDC是设备环境类的基类直接由CObject派生。 (2)"设备DC"和"内存DC" "设备DC"通常代表显示器和打印机等物理设备,它的绘图表面可以是显示器的屏幕或打印机中的纸张。 "内存DC"隐藏在内存中,不可显示,而且通常要向内存DC中选入位图来作为内存DC的绘图表面,这个绘图表面我们也是看不到的。但向内存DC所发的绘图命令与发往窗口DC与打印机DC的命令基本上是相同的。通过virtual BOOL CDC::CreateCompatibleDC(CDC* pDC)来创建"内存DC"。 (3)DC中GDI对象的选入与分离,以画刷为例方法1: CDC dc; CBrush* pOldBrush = dc.SelectObject(&newBrush); ...... dc.SelectObject(pOldBrush);//恢复旧对象方法2: CDC dc; dc.SelectObject(&newBrush); ...... dc.SelectStrockObject(BLACK_BRUSH)//用系统存储的对象来替换 (4)设备相关位图(DDB)的编程 DDB很少存于磁盘上,应用程序是在内存中创建与处理DDB的。因为DDB不含调色板,其颜色由显示它的设备(通常是屏幕)决定,所以DDB是设备相关的。在使用DDB过程中要遵循以下几个步骤: ◎创建一个CBitmap对象。 CBitmap m_pBitmap; ◎使用与当前设备环境相兼容的位图初始化CBitmap对象。 CClientDC dc(this);//当前设备环境(或称设备DC) m_bitmap.CreateCompatibleBitmap(&dc,800,600); ◎创建与当前设备DC相兼容的内存DC。 CClientDC dc(this);//当前设备环境(或称设备DC) CDC mdc;//内存DC mdc.CreateCompatibleDC(&dc);//创建与当前设备DC相容的内存DC ◎将位图选取到内存DC中。 CBitmap* pOldBmp = mdc.SelectObject(&this->m_bitmap);//将位图选进内存DC 将位图选取到内存DC后,位图就变成了内存DC的绘图表面。通常,用户首先需要完成的工作就是要将位图清除为一种颜色,做法如下: CRect rect(0,0,799,699); CBrush* pWhiteBrush = new CBrush(RGB(255,255,255));//新建白色刷子 mdc.FillRect(&rect,pWhiteBrush); mdc.SelectObject(pOldBmp);//分离出已选入的GDI对象(这里是位图) delete pWhiteBrush;//释放内存 ◎通过内存DC在位图上绘图。 mdc.TextOut(0,0,"可以通过内存DC在位图上画图了"); mdc.Ellipse(10,10,100,100); mdc.Rectangle(10,10,100,100); ...... ◎将位图显示到显示设备上(可以说是一个图片拷贝过程)。 void CBitmapView::OnDraw(CDC* pDC) { CBitmapDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CDC mdc; mdc.CreateCompatibleDC(pDC); CBitmap* pOldBmp = mdc.SelectObject(&this->m_bitmap); pDC->BitBlt(0,0,800,600,&mdc,0,0,SRCCOPY);//位图拷贝(有关该函数参看MSDN) mdc.SelectObject(pOldBmp);//分离出已选入的GDI对象 } ----------------------------------------------------------------------------------- 用CWinApp的LoadStandardCursor函数获取使用系统内部已准备好的鼠标光标的句柄,如十字、箭头等: m_HCross = AfxGetApp()->LoadStandardCursor(IDC_CROSS); m_HArrow = AfxGetApp()->LoadStandardCursor(IDC_Arrow); -----------------------------------------------------------------------------------

 

21、如何实现双缓冲首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中: CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 ^_^ //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 //你也可以用自己应该用的颜色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图 MemDC.MoveTo(......); MemDC.LineTo(......); //将内存中的图拷贝到屏幕上进行显示 pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); 禁止系统擦掉原来的图象可以重载OnEraseBkgnd()函数,让其直接返回TRUE就可以了。如 BOOL CMyWin::OnEraseBkgnd(CDC* pDC) {   return TRUE;   //return CWnd::OnEraseBkgnd(pDC);//把系统原来的这条语句注释掉。 }

 

 22 引用头文件的区别用 #include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。用 #include "filename.h" 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。 -----------------------------------------------------

 

23 预编译头文件所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。 -----------------------------------------------------

 

24 MFC是C++类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C++对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。 ------------------------------------------------------

 

25 数据字典创建数据字典,数据字典是对系统用到的所有数据项和结构的定义,以确保开发人员使用统一的数据定义。在需求阶段,数据字典至少应定义客户数据项以确保客户与开发小组是使用一致的定义和术语。分析和设计工具通常包括数据字典组件。 ------------------------------------------------------

 

 26 系统分析与设计:系统分析:  理解并详细说明信息系统应该做什么的过程。系统设计:  详细说明信息系统的许多组件在物理上是怎样实施的过程。系统分析员:  使用信息技术的商业专业人员,利用分析与设计技术解决商业问题。项目:  一个有始有终计划的任务,它产生预先确定的结果或产品。系统开发生命周期(SDLC):    一种系统开发的方法,由计划,分析,设计,实施和支持五个阶段组成。  计划阶段:   规划项目范围并出项目计划。分析阶段:  分析活动就是要全面了解商业需求,分析的重点是需求,而不是任何特定计算机技术。设计活动:   就是定义一个新系统的体系结构和构造以满足那些需求。在设计阶段,分析员开始构思一个计算机系统解决方案。实施阶段:   实施是实际建立,测试和安装信息系统。 -----------------------------------------------------

 

28 内存分配与指针 int a=10;//定义一个整型变量 int *p;//定义一个指向整型的指针 p=&a;//a的内存地址付给p *p=10; 指针的主作用是管理和操作动态分配的内存。静态与动态内存分配的两个主要区别是: 1.静态对象是有名字的变量,我们直接对其进行操作。而动态对象是没有名字的变量,我们通过指针间接地对它进行操作。 2.静态对象的分配与释放由编译器自动处理。程序员需要理解这一点,但不需要做任何事情,相反,动态对象的分配与释放,必须由程序员显式地管理,相对来说比较容易出错,它通过New和Delete两个表达式完成。分配特定类型的单个对象: int *pint=new int(1024);  分配了一个没有名字的int类型的对象,对象的初始化为1024,然后,表达式返回对象在内存中的地址。接着,这个地址被用来初始化指针对象pint。动态分配的内存,惟一的访问方式是通过指针间接地访问。 delete pint;//删除单个对象。 分配特定类型和维数的数组。 int *pia=new int[4]; 分配了一个含有四个整数元素的数组。返回指针只有一个,即首个元素的地址。  delete [] pia;//删除一个对象数组。如果忘了删除动态分配的内存,程序会在结束时出现内存泄漏(memory leak)问题 -------------------------------------------------------

 

29 const 与 #define的比较 C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。【规则】在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

 

 30 常量定义规则【规则】需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。【规则】如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值 --------------------------------------------------------

 

31 C++内置基本数据类型 1字(word) = 4字节(byte) 1字节(byte) = 8位(bit) 1字(word) = 4字节(byte) = 32位(bit) 字符型char: ----------- 通常用来表示单个字符或小整数。用一个字节来表示。整型int;短整型short;长整型long; ------------------------------ 分别代表不同长度的整数值。int表示一个字。 short表示半个字;long表示两个字。(在Win32中int和long通常长度相同)浮点型float;双精度double;长双精度long double;

 

 

初学罗云彬的那本win32汇编程序设计, 前些天听从朋友的建议, 读书就该做个学习笔记, 可以加强理解, 的确, 呵呵, 所以不才就拿上来和大家分享下学习的过程, 希望大家可以给我多提提意见, 让我进步快些... 呵呵... 这个程序在第13章的过程控制里... 为 Process.asm

程序从start开始执行, 调用GetModuleHandle函数获取程序模块句柄, 存入hInstance, 调用DialogBoxParam函数创建一个对话框… 对话框过程为 : _ProcDlgMain…
程序进入对话框过程执行….
_ProcDlgMain函数传递四个参数 hWnd, wMsg, wParam, lParam, 定义了两个局部变量
@dwThreadID 和 @stOF ; 其中@stOF参数的结构为OPENFILENAME(This structure contains information the operating system uses to initialize the system-defined Open or Save As dialog box. After the user closes the dialog box, the system returns information about the user's selection in this structure.)函数首先处理WM_INITDIALOG消息, 将对话框句柄存入hWinMain中, 调用SendDlgItemMessage函数给”文件名”窗口发送消息, 扩展编辑框的长度; 调用SendDlgItemMessage函数给”命令行”窗口发送消息, 扩展编辑框的长度. 当用户按下浏览按钮的时候, 对话框过程处理IDC_BROWSE消息, 调用RtlZeroMemory函数将@stOF参数初始化, 
mov       @stOF.lStructSize, sizeof @stOF
(@stOF.lStructSize  : Specifies the length, in bytes, of the structure.)
push      hWinMain
pop       @stOF.hWndOwner
(hWndOwner: Handle to the window that owns the dialog box.)
mov       @stOF.lpstrFilter, offset szFileExt
(lpstrFilter : Long pointer to a buffer that contains pairs of null-terminated filter strings)
mov       @stOF.lpstrFile, offset szFileName
(lpstrFile : Long pointer to a buffer that contains a file name used to initialize the File Name edit control.)
mov       @stOF.nMaxFile, MAX_PATH
(nMaxFile : Specifies the size, in bytes (ANSI version) or 16-bit characters (Unicode version), of the buffer pointed to by lpstrFile.)
mov       @stOF.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXI
(OFN_FILEMUSTEXIST 打开的文件必须存在, OFN_PATHMUSTEXIST打开的路径必须存在)
调用GetOpenFileName函数创建一个寻找文件对话框
(
This function creates a system-defined dialog box that enables the user to select a file to open.
BOOL GetOpenFileName( 
  LPOPENFILENAME lpofn
);
lpofn  [in] Long pointer to an OPENFILENAME structure that contains information used to initialize the dialog box. When GetOpenFileName returns, this structure contains information about the user's file selection. 
Flags : If this member is set to the OFN_PROJECT value, the GetOpenFileName function opens the Folder dialog box. Otherwise, the function opens the Open dialog box.
lpstrFile : When GetOpenFileName returns successfully, this member is used to retrieve full path of the selected file name.
lpstrFileTitle : When GetOpenFileName returns successfully, this member is used to retrieve the project folder name only.
lpstrInitialDir : Pointer to a string that receives the initial folder name, but not the full path name.
)
如果找到文件, 则调用SetDlgItemText函数将”文件名”编辑框的内容设置为 找到的文件名…
当用户在”文件名”编辑框输入的时候, 调用GetWindowTextLength函数取得文本长度.
(This function retrieves the length, in characters, of the specified window's title bar text — if the window has a title bar. If the specified window is a control, the function retrieves the length of the text within the control.
Return Values : The length, in characters, of the text indicates success. Under certain conditions, this value may actually be greater than the length of the text. For more information, see the following Remarks section. Zero indicates that the window has no text. To get extended error information, call GetLastError.
)
将返回值存入ebx, 调用GetDlgItem函数获得”执行窗口句柄”, 如果输入了文件名则是执行窗口有效… 
当用户按下”执行”按钮的时候, 函数处理IDOK消息
调用CreateThread函数创建一个线程, 线程函数为_ProcExec, 函数返回, 调用CloseHandle函数将线程句柄关闭, 释放线程对象…
线程开始执行… 参数格式 : _ProcExec          proc      uses ebx esi edi _lParam
调用GetDlgItem函数取得”文件名”编辑框的句柄, 并将编辑框灰化, 调用GetDlgItem函数取得”命令行”编辑框句柄, 并将编辑框灰化… 调用GetDlgItem函数”浏览”按钮灰化, 调用SetDlgItemText函数将”执行”按钮的文本设置为”终止”
调用GetDlgItemText函数获得”文件名”编辑框中的文件名存入szFileName; 调用GetDlgItemText函数将”命令行”编辑框中的文本存入szCmdLine中, 调用lstrcpy文件名存入@szBuffer中, 如果szCmdLine中有命令行参数, 则调用lstrcat函数先将空格加到@szBuffer中, 然后再将命令行参数加到@szBuffer后面…
调用GetStartupInfo函数初始化 stStartUP…
(GetStartupInfo : Retrieves the contents of the STARTUPINFO structure that was specified when the calling process was created.)
然后再调用CreateProcess函数创建一个进程(
invoke    CreateProcess, NULL, addr @szBuffer, NULL, NULL, NULL, /
      NORMAL_PRIORITY_CLASS, NULL, NULL, addr stStartUp, addr stProcInfo
This function is used to run a new program. It creates a new process and its primary thread. The new process executes the specified executable file.
pszImageName  [in] Pointer to a null-terminated string that specifies the module to execute. 
pszCmdLine : [in, out] Pointer to a null-terminated string that specifies the command line to execute.
psaProcess : [in] Not supported; set to NULL. 
psaThread : [in] Not supported; set to NULL.
fInheritHandles : [in] Not supported; set to FALSE.
fdwCreate : [in] Specifies additional flags that control the priority and the creation of the process.
pvEnvironment : [in] Not supported; set to NULL.
pszCurDir : [in] Not supported; set to NULL.
psiStartInfo : [in] Not supported; set to NULL.
pProcInfo : [out] Pointer to a PROCESS_INFORMATION structure that receives identification information about the new process.

Return Values : Nonzero indicates success, Zero indicates failure., To get extended error information, call GetLastError.
)
如果进程创建成功, 则调用WaitForSingleObject等待进程的执行…进程执行完毕,调用CloseHandle函数将进程句柄关闭, 释放进程对象, 调用CloseHandle将主线程句柄关闭, 释放线程对象… 如果创建失败 则调用Messagebox显示出错信息…
调用RtlZeroMemory函数初始化stProcInfo参数.. 然后调用GetDlgItem函数和EnableWindow函数使”文件名”编辑框有效, “命令行”编辑框有效, “浏览”按钮有效.. 将
终止按钮的文本设置为”执行”,…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值