中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
MFC tips
作者:未知 时间:2005-09-13 23:33 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:MFC tips
好久没有写GUI的程序了,最近在写一个基于MFC框架的程序,找了些资料记一记。

日历控件的使用
2004年 07月31日
 

 首先,定义一个该类的一个 控件变量m_calendar;
 
     在该控件的包容器里即对话框的 初始化函数里 初始化她
            
 CTime time;
 time = CTime::GetCurrentTime();//获取系统时间

 //初始化日历控件的显示
 m_Calendar.SetYear(time.GetYear());
 m_Calendar.SetMonth(time.GetMonth());
 m_Calendar.SetDay(time.GetDay());

        UpdateData(FALSE);
   第二步如何实现 单击事件 变量的传递:
        // TODO: Add your control notification handler code here
 // 使用日历控件的方法获取日期
 int year = m_Calendar.GetYear();
 int month = m_Calendar.GetMonth();
 int day   = m_Calendar.GetDay();

 // 将获得的日期写入于编辑框对应的成员变量中
 m_sDate.Format("公元%4d年%2d月%2d日", year, month, day);
  
 // 将日期显示在编辑框中这种格式比较好的。我比较喜欢的
 UpdateData(FALSE);

 

 

                                                                                                                      作者:  马敬发

                                                                                                                     网名: 清浪冲天    QQ: 283989349

马敬发 于13 : 23 发表 已被浏览245次 评论(0) / 引用(43)
 
如何实现退出程序时进行提醒
2004年 07月31日
 


        就是点击退出那个图标 时:进行提醒的程序
创造如下函数 ;通过 类的向导
void CMainFrame::OnClose()
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
  if(MessageBox("真的要退出系统吗?","退出询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
  CMDIFrameWnd::OnClose();
}

                                                                                                                      作者:  马敬发

                                                                                                                     网名: 清浪冲天    QQ: 283989349

马敬发 于12 : 28 发表 已被浏览201次 评论(1) / 引用(16)
 
文档类中变量的使用
2004年 07月31日
 

定义在文档中的变量的初始化过程:
   1 现在文档中某某DoC .h中的public中定义 所需变量
   2 再在相应的实现文件中某某DoC .cpp文件中通过类的向导生成 CDocument::OnNewDocument ()函数, this function is to initialized every varveies;函数原形是
             virtual BOOL OnNewDocument( );

             Return Value

             Nonzero if the document was successfully initialized; otherwise 0.

   3在其他类中使用:首先要获取文档类的指针方法  (1)定义一个文档类的指针,然后让它等于=GetDocument();
      (2)这样之后就可以通过该定义的指针来访问文档类的成员 数据和成员函数;

           例如:  在视图类中 的OnDraw函数中调用文档类中的变量
     void CEx3_3View::OnDraw(CDC* pDC)
{
 CEx3_3Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 CString stuinfo; 
 stuinfo.Format("%d::%s",pDoc->recno,pDoc->stuname);  
 pDC->TextOut(250,200,stuinfo);
}

作者:马敬发

马敬发 于12 : 30 发表 已被浏览181次 评论(0) / 引用(7)
 
自定义函数的几点说明
2004年 07月31日
 


          字定义的函数时首先要先确定他所属的的类的范围就是说它在哪个范围内,然后就先在那个类的头文件中进行函数声明

    比如 要在一个对话框 类 CMyDlg中定义一个函数 ,那么就应该在其对应当  CMyDlg.h的头文件中进行函数生命,也就是定义成其成语函数,与C ++相比,所不同的就是还要加上域的限定,即使在自己类中定义,
    另外, 一般定义的函数都放在public的范围内的  如;
        class CMyDlg : public CDialog
{
// Construction
public:
 CMyDlg(CWnd* pParent = NULL); // standard constructor

 void CMyDlg::SizeWindow(int ReduceHeight, bool bflag);///该函数是自定义的
  bool m_flag;
  

   然后再在相应的实现文件中进行编写具体的函数实现代码

           写在对应的实现文件 当中就可以拉,在本例中写在CMyDlg。cpp中


                                                                                                                      作者:  马敬发

                                                                                                                     网名: 清浪冲天    QQ: 283989349

马敬发 于12 : 28 发表 已被浏览167次 评论(0) / 引用(4)
 
各类之间的指针
2004年 07月31日
 


可是如果需要向其它类(如主框架、子窗口、视类、对话框、状态条、工具条或其他控件等)发送消息时,上述方法显得无能为力,而在编程过程中往往需要获取其它类中的某个识别信号,MFC框架给我们造成了种种限制,但是可以通过获取某个类的指针而向这个类发送消息,而自定义消息的各种动作则在这个类中定义,这样就可以自由自在的向其它类发送消息了。

  下面举的例子叙述了向视类和框架类发送消息的方法:

  在主框架类中向视类发送消息:

  视类中定义消息:

ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //定义消息映射
视类定义消息处理函数:

// 消息处理函数
LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}

//发送消息的测试函数
void CMainFrame::OnTest()
{
CView * active = GetActiveView();//获取当前视类指针
if(active != NULL)
active->PostMessage(WM_MY_MESSAGE,0,0);
}
 


  在其它类中向视类发送消息:

//发送消息的测试函数
void CMainFrame::OnTest()
{
CMDIFrameWnd *pFrame;
CMDIChildWnd *pChild;
CView *pView;
//获取主窗口指针
pFrame =(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
// 获取子窗口指针
pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
//获取视类指针
pView = pChild->GetActiveView();
if(pView != NULL)
pView->PostMessage(WM_MY_MESSAGE,0,0);//发送消息
}
 


  其余步骤同上。

在视类中向主框架发送消息:

  首先在主框架中定义相关的消息,方法同上,然后在发送消息的函数中添加代码如下

//发送消息的测试函数
void CMessageView::OnTest()
{
CFrameWnd * active = GetActiveFrame();//获取当前主窗口框架指针
if(active != this)
active->PostMessage(WM_MY_MESSAGE,0,0);
return 0;
}
 


  在其它类中向不同的类发送消息可依次方法类推,这样我们的程序就可以的不受限制向其它类和进程发送消息,而避免了种种意想不到的风险。

作者:马敬发

马敬发 于12 : 30 发表 已被浏览176次 评论(0) / 引用(18)
 
如何让窗口和 MDI窗口一启动就最大化和最小化?
2004年 07月31日
 


如何让窗口和 MDI窗口一启动就最大化和最小化?

   先说窗口。

   在 InitStance 函数中设定 m_nCmdShow的 取值.

     m_nCmdShow=SW_SHOWMAXMIZED ; //最大化

     m_nCmdShow=SW_SHOWMINMIZED ; //最小化

     m_nCmdShow=SW_SHOWNORMAL ; //正常方式

     MDI窗口:

作者:马敬

马敬发 于12 : 30 发表 已被浏览215次 评论(1) / 引用(22)
 
了解文档/视结构
2004年 07月31日
 

  一)、了解文档/视结构
MFC应用程序模型历经多年以有了相当大的发展。有一个时期,它只是个使用应用程序对象和主窗口对象的简单模型。在这个模型中,应用程序的数据作为成员变量保持在框架窗口类中,在框架窗口的客户区中,该数据被提交显示器。随着MFC2。0的问世,一种应用程序结构的新方式----MFC文档/视结构出现了。在这种结构中,CFrameWnd繁重的任务被委派给几个不同类,实现了数据存储和显示的分离。一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:
。应用程序是一个CwinApp派生对象,它充当全部应用程序的容器。应用程序沿消息映射网络分配消息给它的所有子程序。
。框架窗口是一CfrmeWnd派生对象。
。文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分。
。视窗是Cview派生对象,它与其父框架窗口用户区对齐。视窗接受用户对应用程序的输入并显示相关联的文档数据。
通常,应用程序数据存在于简单模型中的框架窗口中。在文档/视方式中,该数据移入称为document的独立数据对象。当然,文档不一定是文字,文档是可以表现应用程序使用的数据集的抽象术语。而用户输入处理及图形输出功能从框架窗口转向视图。单独的视窗完全遮蔽框架窗口的客户区,这意味着即使程序员直接绘画至框架窗口的客户区,视图仍遮蔽绘画,在屏幕上不出现任何信息。所以输出必须通过视图。框架窗口仅仅是个视图容器。
CDocument类对文档的建立及归档提供支持并提供应用程序用于控制其数据的接口。MDI应用程序可以处理多个类型的文档,每个类型的文档拥有一个相关联的文档模板对象。文档对象驻留在场景后面,提供由视图对象显示的信息。文档至少有一个相关联的视图。视图只能与一个文档相关联。
在文档/视方式中,对象的建立是由文档模板来管理的,它是CDocTemplate派生对象,建立并维护框架窗口,文档及视。
MFC调用命令处理程序以响应发生在应用程序中的事件。命令发送的优先级是:
  活动的视图->框架窗口->文档->应用程序->默认窗口过程(DefWindowsProc)
总之,在文档/视方式中,文档和视是分离的,即:文档用于保存数据,而视是用来显示这些数据。文档模板维护它们之间的关西。这种文档/视结构在开发大型软件项目时特别有用。
(二)、了解与文档/视结构有关的各种类之间的关系。
在文档/视应用程序中,CWinApp对象拥有并控制文档模板,后者产生文档、框架窗口及视窗。
角度来看,“视”实际上是一个普通的窗口。象其他基于Widnows应用的窗口一样,人们可以改变它的尺寸,对它进行移动,也可以随时关闭它。若从程序员的角度来看,视实际上是一个从MFC类库中的Cview类所派生出的类的对象。文档对象是用来保存数据的,而视对象是用来显示数据的,并且允许对数据进行编辑。SDI或MDI的文档类是由Cdocument类派生出来的,它可以有一个或多个视类,而这些视类最终都是由Cview类派生出来的。视对象只有一个与之相联系的文档对象,它所包含的CView::GetDocument函数允许应用在视中得到与之相联系的文档,据此,应用程序可以对文档类成员函数及公共数据成员进行访问。如果视对象接受到了一条消息,表示用户在编辑控制中输入了新的数据,此时,视就必须通知文档对象对其内部数据进行相应的更新。
如果文档数据发生了变化,则所有的视都必须被通知到,以便它们能够对所显示的数据进行相应的更新。Cdocument::UpdateAllViews函数即可完成此功能。当该函数被调用时,派生视类的CView::OnUpdate函数被触发。通常OnUpdate函数要对文档进行访问,读取文档数据,然后再对视的数据成员或控制进行更新,以便反映出文档的变化。另外,还可以利用OnUpdate函数使视的部分客户区无效,以便触发Cview::OnDraw函数,利用文档数据来重新对窗口进行绘制。
 在MDI应用程序中,可以处理多个文档类型,即多个文档模板,每个模板又可以有多个文档,每个文档又可以多视显示。为管理方便,上一级往往保留了下一级的指针列表。               

解释如下:
(1)、每个应用程序类(CwinApp的派生类)都保留并维护了一份所有文档模板的指针列表,这是一个链表结构。应用程序为所要支持的每个文档类型动态分配一个CMultiDocTemplate 对象,
   CmultiDocTemplate(UINT nIDResource,
CruntimeClass * pDocClass,
       CruntimeClass * pFrameClass,
       CruntimeClass * pViewClass );
并在应用程序类的CWinApp::InitInstance成员函数中将每个CMultiDocTemplate对象传递给CWinApp::AddDocTemplate。 该函数将一个文档模板加入到应用程序可用文档模板的列表中。函数原形为:
    void AddDocTemplate(CdocTemplate * pTemplate);
 应用程序可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板的位置,利用该值来调用CWinApp::GetNextDocTemplate函数,获得第一个CDocTemplate对象指针。函数原形如下:
    POSITION GetFirstDocTemplate( ) const;
    CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;
第二个函数返回由pos 标识的文档模板。POSITION是MFC定义的一个用于迭代或对象指针检索的值。通过这两个函数,应用程序可以遍历整个文档模板列表。如果被检索的文档模板是模板列表中的最后一个,则pos参数被置为NULL。
(2)、一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文档的指针列表。应用程序可以用CDocTemplate::GetFirstDocPosition函数获得与文档模板相关的文档集合中第一个文档的位置,并用POSITION值作为CDocTemplate::GetNextDoc的参数来重复遍历与模板相关的文档列表。函数原形为:
   viaual  POSITION  GetFirstDocPosition( ) const = 0;
    visual  Cdocument *GetNextDoc(POSITION & rPos) const = 0;
如果列表为空,则rPos被置为NULL.
 (3)、在文档中可以调用CDocument::GetDocTemplate获得指向该文档模板的指针。函数原形如下:
    CDocTemplate * GetDocTemplate ( ) const;
如果该文档不属于文档模板管理,则返回值为NULL。
 (4)、一个文档可以有多个视。每一个文档都保留并维护一个所有相关视的列表。CDocument::AddView将一个视连接到文档上,将该视加入到文档相联系的视的列表中,并将视的文档指针指向该文档。当有File/New、File/Open、Windows/New或Window/Split的命令而将一个新创建的视的对象连接到文档上时, MFC会自动调用该函数,框架通过文档/视的结构将文档和视联系起来。当然,程序员也可以根据自己的需要调用该函数。
    Virtual POSITION GetFirstViewPosition( ) const;
    Virtual CViw * GetNextView( POSITION &rPosition) cosnt;
 应用程序可以调用CDocument::GetFirstViewPosition返回与调用文档相联系的视的列表中的第一个视的位置,并调用CDocument::GetNextView返回指定位置的视,并将rPositon的值置为列表中下一个视的POSITION值。如果找到的视为列表中的最后一个视,则将rPosition置为NULL.
 当在文档上新增一个视或删除一个视时,MFC会调用OnChangeViewList函数。如果被删除的视是该文档的最后一个视,则删除该文档。 
 (5)、一个视只能有一个文档。在视中,调用CView::GetDocument可以获得一个指向视的文档的指针。函数原形如下:
    CDocument *GetDocument ( ) const;
如果该视不与任何文档相,则返回NULL.
(6)、MDI框架窗口通过调用CFrameWnd::GetActiveDocument 可以获得与当前活动的视相连的CDocument 指针。函数原形如下:
   virtual CDocument * GetActiveDocument( );
(7)、通过调用CFrameWnd::GetActiveView 可以获得指向与CFrameWnd框架窗口连接的活动视的指针,如果是被CMDIFrameWnd框架窗口调用,则返回NULL。MDI框架窗口可以首先调用MDIGetActive找到活动的MDI子窗口,然后找到该子窗口的活动视。函数原形如下:
   virtual Cdocument * GetActiveDocument( );
(8)、MDI框架窗口通过调用CFrameWnd::GetActiveFrame, 可以获得一个指向MDI框架窗口的活动多文档界面子窗口的指针。
(9)、CMDIChildWnd调用GetMDIFrame获得MDI框架窗口(CMDIFrameWnd)。
(10)、CWinApp 调用AfxGetMainWnd得到指向应用程序的活动主窗口的指针。

下面一段代码,就是利用CDocTemplate、CDocument和CView之间的存取关系,遍历整个文档模板、文档以及视。
CMyApp * pMyApp = (CMyApp *)AfxGetApp();
 POSITION  p = pMyApp->GetFirstDocTemplatePosition();
 while(p!= NULL) {
  CDocTemplate * pDocTemplate = pMyApp->GetNextDocTemplate(p);
  POSITION p1 = pDocTemplate->GetFirstDocPosition();
  while(p1 != NULL) {
   CDocument * pDocument = pDocTemplate->GetNextDoc(p1);
   POSITION p2 = pDocument->GetFirstViewPosition();
   while(p2 != NULL) {
    CView * pView = pDocument->GetNextView(p2);
   }
  }
 }
     (图4)、遍历整个文档模板、文档和视

 在应用程序的任何地方,程序员都可以调用AfxGetApp( )获得应用程序的对象指针。由于本文着重介绍文档/视的关系,至于框架窗口之间的关系没能列全,读者可以查相应的文档。
(三)、了解CwinApp::OnFileNew、CwinApp::OnFileOpen和Window/New的程序流程。
(1)、CwinApp::OnFileNew和CwinApp::OnFileOpen函数的简单流程。
在CWinApp::OnFile/new 或CwinApp::OnFileOpen函数中,核心操作是CDocTemplate::OpenDocument函数。其函数原型为:
virtual CDocument* CDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName, BOOL bMakeVisible = TRUE ) = 0;
图(4)中星号标注之后即是该函数的流程,简要介绍如下:
(1)、CDocTemplate::CreateNewDocument函数创建一个新文档,其类型与文档模板相关,并通过函数CDocTemplate::AddDocument加入该文档模板的文档指针列表中。此时,文档类的构造函数被执行,程序可以在此进行文档的初始化。
(2)、函数CDocTemplate::CreateNewFrame调用MDI子窗口类(CMDIChildWnd)的构造函数,生成MDI子窗口对象。接着调用CMDIChildWnd::PreCreateWindow。然后,生成一个CCreateContext对象,(CcreateContext是MFC框架所使用的一种结构,它将构成文档和视的组件联系起来。后文将详细介绍之。)并将该对象值传给CMDIChildWnd::OnCreateClient函数。MFC调用此函数,用CCreateContext对象提供的信息创建一个或多个CView对象。此时,各视的构造函数被依次调用。
(3)、接着,判断lpszPathName是否为空。分为两种情况:
(a)、若为空,则表明要创建一个新文档:调用SetDefaultTitle函数装载文档的缺省标题,并显示在文档的标题栏中;然后执行CDocument::OnNewDocument。该函数调用DeleteContents以保证文档为空,然后置新文档为清洁。可以重载该函数。
(b)、否则,表明要打开一个已存在的文档:调用CDocument::OnOpenDocument打开指定的文件;执行DeleteContext,保证文档为空;调用CObject::Serialize读入该文件的内容。(程序员可在此进行文件的读入操作。当然,也可以在CDocument::OnOpenDocument中读入文件)。然后置文档为清洁;最后,调用CDocTemplate::SetPathName,并把文件名加入到最近文件列表中。
(4)、调用CDocTemplate::InitialUpdateFrame函数,使框架窗口中的各个视收到OnInitialUpdate调用。框架窗口的主视(子窗ID等于AFX_IDW_PANE_FIRST的视)被激活。程序员可以在此对视对象进行初始化。

(2)、Window/New命令的程序流程
当主框架窗口上有子窗口时,选择Window/New命令可以生成该活动子窗口的影象。它们有相同的文档模板、相同的文档。其流程如下:
执行Window/New的过程与File/New的过程差不多。所不同的是,File/New须要创建一个新文档,而Window/New则是获得已存在的MDI子窗口的文档。因此以前存在的视和New以后生成的视均为该文档的视,都是该文档的内容的显示。当调用CDocument::UpdateAllViews函数时,它们(视)的OnUpdate函数都将被激活。此时,在该文档的视指针列表中,将有多于一个的视(具体数目视Window/New执行的次数而定)。读者可以利用(图3)中的代码跟踪程序结果。

(四)、几种情况的讨论
上面,笔者就MFC中文档/视的关系进行了分析,下面,笔者将结合具体情况进行讨论:

(1)、如何根据自己的要求来选择文档模板,及相应的视和文档。

 在通常的MDI应用程序中,只有一个文档模板,程序员只能打开一种类型的文档。因此,程序员只要调用File/New或者File/Open创建或者打开文档即可,至于文档、视和框架窗口之间的关系,由文档模板在幕后控制,不须要对文档模板进行操作。但是,如果应用程序需要处理多种类型的文档,并且何时打开何种文档均需程序员手工控制,此时,程序员必须对文档模板进行编程。
例如,笔者需要处理AVI和BMP两种文件类型。AVI和BMP的数据存放格式不同,不能用同一的数据结构来描述,因此,把它们的数据都存入一个文档是不合适的。同时,由于AVI是图象序列,BMP仅是一幅图象,它们的显示是肯定不一样的,即它门的视不同。基于此,笔者决定分别建立两套文档模板,两套框架窗口,两套文档和两套视,分别用于AVI和BMP的数据存放和显示。程序可以根据用户选择的文件名来分别处理AVI和BMP。具体步骤如下:
(Step 1)、在应用程序类(CWinApp)的派生类中增加文档模板成员变量,以便对文档模板进行操作。
    class C3dlcsApp : public CWinApp
 {     。。。 。。。
public:
CMultiDocTemplate * m_pAVIDocTemplate;
CMultiDocTemplate * m_pBMPDocTemplate;
    }
(Step 2)、在主框架中增加菜单响应:
       void CMainFrame::OnFileOpen()  {
          CFileDialog my(true);
if(my.DoModal()==IDOK)  {
CString FileName = my.GetPathName();
CString FileExt = my.GetFileExt();
  
     if((FileExt == "AVI") || (FileExt == "avi")) {
      CMyApp * pMyApp = (CMyApp *)AfxGetApp();
      CMultiDocTemplate*pAVIDocTemplate=pMyApp->m_pAVIDocTemplate;
      pAVIDocTemplate->OpenDocumentFile(FileName);
     }
else if((FileExt == "BMP") || (FileExt == "bmp")) {   
CMyApp * p3dlcsApp = (CMyApp *)AfxGetApp();
      CMultiDocTemplate* pDATDocTemplate=pMyApp->m_pBMPDocTemplate;
   pDATDocTemplate->OpenDocumentFile(FileName);
     }
     else {
   AfxMessageBox("Yor select a file not supported!");
      return;
     }
    }
}
笔者把用户输入文件名的后缀作为分支条件,如果是AVI文件,则先获得关于AVI文件的文档模板,然后调用CDocTemplate::OpenUpdateFrame (lpszFileName)函数打开此文档。正如前面所分析,此函数将依次生成新文档,新框架,在CMDIChildWnd::OnCreateClient中创建视,最后向框架中所有的视发送初始化消息,使其显示在屏幕上。如果是BMP文件,操作类似。
当然,程序员也可以在程序的任何位置实现此操作:通过全局函数AfxGetApp 获得应用程序对象指针,从而获得相应的文档模板指针。
由于由AppWizard生成的应用程序会缺省调用CWinApp::OnFileNew,所以当程序开始执行时,会在主框架上显示一个新的空窗口。如果想去掉这个空窗口,只须重载CWinApp::OnFileNew函数,不许要任何代码,即可。


(2)、切分窗口与文档/视结构
一个文档可以有多个视,切分窗口即是表示多视的一种方法。 切分窗口是通过类CSplitterWnd来表示的,对Window来说,CSplitterWnd对象是一个真正的窗口,它完全占据了框架窗口的客户区域,而视窗口则占据了切分窗口的窗片区域。切分窗口并不参与命令传递机制,(窗片中)活动的视窗从逻辑上来看直接被连到了它的框架窗口中。
切分窗口可以分为动态和静态两种。前者较简单,本文仅讨论后者。创建切分窗口的步骤如下:
(Step 1)、在自己的框架窗口中声明成员变量,用以对切分窗口进行操作。
class CMyFrame : public CMDIChildWnd
{  。。。 。。。
   CSplitterWnd m_Splitter;
 CSplitterWnd m_Splitter2;
}
(Step 2)、重载CMDIChildWnd::OnCreateClient函数,创建切分窗口。
BOOL CMyFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
 BOOL btn = m_Splitter.CreateStatic(this,1,2);
 btn |= m_Splitter.CreateView(0,0, RUNTIME_CLASS(CAVIDispView),             CSize(100,100), pContext);
m_Splitter2.CreateStatic(&m_Splitter,
        2, 1,
        WS_CHILD | WS_VISIBLE | WS_BORDER,
        m_Splitter.IdFromRowCol(0, 1));
 btn |= m_Splitter2.CreateView(0, 0, RUNTIME_CLASS(CBMPView),
         CSize(100,100), pContext);
 btn |= m_Splitter2.CreateView(1, 0, RUNTIME_CLASS(CAVIView),
         CSize(100,100), pContext);
 return btn;
 //return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}
  
CFrameWnd::OnCreateClient函数原形为:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CcreateContext * pContext);
缺省的CMDIChildWnd::OnCreateClient函数根据pContext参数提供的信息,调用CFrameWnd::CreateView函数创建一个视。可以重载该函数,加载CCreateContext对象中传递的值,或改变框架窗口主客户区中控制的创建方式。在上面的程序中,笔者 创建了3个切分窗口。比如打开了一个名为“a.avi”的文档,此时该文档将有3个视,一个框架窗口。如果执行了Window/New操作,则此时有一个文档,6个视和2个框架窗口。若该文档调用CDocument::UpdateAllViews函数,则这6个视的CView::OnUpdate函数都会被激发。
(3)、关于CCreateContext的讨论。

CCreateContext是MFC框架所使用的一种结构,它将构成文档/视的组件联系起来。这个结构包括指向文档的指针,框架窗口,视以及文档模板,它还包含一个指向CRuntimeClass的指针,以指明所创建的视的类型。其数据成员如下:
 m_pNewViewClass:指向创建上下文的视的CRuntimeClass的指针。
 m_pCurrentDoc:指向文档对象的指针,以和新视联系起来。
 m_pNewDocTemplate:指向与框架窗口的创建相联系文档模板的指针。
 m_pLastView:指向已存在的视,它是新产生的视的模型。
 m_pCurrentFrame:指向已存在的框架窗口,它是新产生的框架窗口的模型。

                                                                                                                      作者:  马敬发

                                                                                                                     网名: 清浪冲天    QQ: 283989349

马敬发 于12 : 28 发表 已被浏览215次 评论(0) / 引用(44)
 
vc中快捷键的速查表-马敬发
2004年 07月31日
 

F1: 帮助
 
Ctrl+O   :Open
Ctrl+P   :Print
Ctrl+N   :New
Ctrl+Shift+F2 :清除所有书签
F2    :上一个书签
Shift+F2  :上一个书签
Alt+F2   :编辑书签
Ctrl+F2  :添加/删除一个书签
F12    :Goto definition
Shift+F12  :Goto reference
Ctrl+'Num+'  :Displays the next symbol definition or reference
Ctrl+'Num-'  :Displays the previous symbol definition or reference
Ctrl+J/K  :寻找上一个/下一个预编译条件
Ctrl+Shift+J/K :寻找上一个/下一个预编译条件并将这一块选定
Ctrl+End  :文档尾
Ctrl+Shift+End :选定从当前位置到文档尾
Ctrl+Home  :文档头
Ctrl+Shift+Home :选定从当前位置到文档头
Ctrl+B/Alt+F9 :编辑断点
Alt+F3/Ctrl+F :查找
F3    :查找下一个
Shift+F3  :查找上一个
Ctrl+]/Ctrl+E :寻找下一半括弧
Ctrl+Shift+] :寻找下一半括弧并选定括弧之间的部分(包括括弧)
Ctrl+Shift+E :寻找下一半括弧并选定括弧之间的部分(包括括弧)
F4    :寻找下一个错误/警告位置
Shift+F4  :寻找上一个错误/警告位置
Shift+Home  :选定从当前位置到行首
Shift+End  :选定从当前位置到行尾
Ctrl+L   :剪切当前行
Ctrl+Shift+L :删除当前行
Alt+Shift+T  :交换当前行和上一行
Ctrl+Alt+T  :Brings up the completion list box
Shift+PageDown :选定从当前位置到下一页当前位置
Shift+PageUp :选定从当前位置到上一页当前位置
Ctrl+Shift+Space:显示函数参数的Tooltip
Ctrl+Z/Alt+Backspace :Undo
Ctrl+Shift+Z/Ctrl+Y :Redo
F8    :当前位置变成选定区域的头/尾(再移动光标或者点鼠标就会选定)
Ctrl+Shift+F8 :当前位置变成矩形选定区域的头/尾(再移动光标或者点鼠标就会选定)
Alt+F8   :自动格式重排
Ctrl+G   :Goto
Ctlr+X/Shift+Del:Cut
Ctrl+C/Ctrl+Ins :Copy
Ctrl+V/Shift+Ins:Paste
Ctrl+U   :将选定区域转换成小写
Ctrl+Shift+U :将选定区域转换成大写
Ctrl+F8   :当前行变成选定区域的头/尾(再移动上下光标或者点鼠标就会选定多行)
Ctrl+Shift+L :删除从当前位置到行尾
Ctrl+Shift+8 :将所有Tab变成`或者还原
Ctrl+T   :显示变量类型
Ctrl+↑   :向上滚屏
Ctrl+↓   :向下滚屏
Ctrl+Del  :删除当前单词的后半截(以光标为分割)
Ctrl+Backspace :删除当前单词的前半截(以光标为分割)
Ctrl+←   :移到前一个单词
Ctrl+→   :移到后一个单词
Ctrl+Shift+← :选定当前位置到前一个单词
Ctrl+Shift+→ :选定当前位置到后一个单词
Ctrl+Shift+T :将本单词和上一个单词互换
 

Alt+0   :Workspace Window
Alt+2   :Output Window
Alt+3   :Watch Window
Alt+4   :Variables Window
Alt+5   :Registers Window
Alt+6   :Memory Window
Alt+7   :CallStack Window
Alt+8   :Disassembly Window
Ctrl+W   :ClassWizard
Alt+Enter  :属性
 
Alt+F7   :Project Settings
 
F7    :Build
Ctrl+F7   :Compile
Ctrl+F5   :Run
Ctrl+Break  :Stops the build
F5    :Go
Ctrl+F10  :Run to cursor
F11    :step into
Alt+F10   :Apply codes changes
Ctrl+F9   :Enable/Disable a breakpoint
Alt+F11   :将 Memory Window 切换到下一种显示模式
Alt+Shift+F11 :将 Memory Window 切换到上一种显示模式
Ctrl+Shift+F9 :去掉所有断点
Ctrl+Shift+F5 :Restarts the program
Ctrl+Shift+F10 :将当前行设为下一条指令执行的行
Alt+Num*  :滚动到当前指令
Shift+F11  :跳出当前函数
F9    :断点
F10    :step over
Shift+F5  :停止 Debugging
Ctrl+F11  :Switches between the source view and the disassembly view for this instruction
Alt+F12   :Queries on the selected object or current context
 
Alt+F6   :Toggles the docking feature for the window on/off
Shift+Esc  :隐藏窗口
 
 
 
Ctrl+Shift+G :?
Ctrl+*   :打开string table
Ctrl+Space  :?
Ctrl+F3   :向下查找下一个
Ctrl+Shift+F3 :查找上一个
Ctrl+D   :查找
Ctrl+I   :向下查找下一个
Ctrl+Shift+I :查找上一个
F6    :?Activates the next pane
Shift+F6  :?Activates the previous pane
Ctrl+M   :?Detects duplicate mnemonics in the resource
Alt +O : 头文件与cpp文件的交互显示

马敬发 于13 : 02 发表 已被浏览239次 评论(1) / 引用(49)
 
如何在一个应用工程中调用一个数据库的多个表或多个数据库
2004年 07月31日
 

  这是我一直迷惑的地方,现在 总算可以突然解决拉,高兴兴 哈哈


   3.如果你在建立了一个工程后,发现你要对一个数据源进行操作,但你又不想重新开一个工程,
即想 在一个工程中操作多个数据库,或一个数据库的多个表:::

方法如下:
  a.在菜单上点击"建立类向导"或者"MFC ClassWizard".
  b.点击Add Class按钮.
  c.输入你的数据库类名,并选择基类为CRecordset,下面的操作想必大家都会了吧。
    

     推广,同理用类是的方法可以创建其他的类 ,因为别的文件使用它,只是将该类的 头文件饮用近来马,所以这是类的 封装,和重用的 应用之一吧  。

                                                                                                                      作者:  马敬发

                                                                                                                     网名: 清浪冲天    QQ: 283989349

马敬发 于12 : 28 发表 已被浏览154次 评论(0) / 引用(11)
 
类重用的理解
2004年 07月31日
 

由于类的封装的特点,每个类的定义的头文件和类的的实现文件可以重复利用的, 如果某个工程想用的话,那么他就可以直接将这个类的头文件和类的实现文件 包含进去通过导入功能,该工程中的某一个文件中要用它,就只需 把他的类的头文件包含近来,通过#include "*.h"

马敬发 于12 : 28 发表 已被浏览149次 评论(0) / 引用(4)
 
如何改变对话或窗体视窗的背景颜色
2004年 07月31日
 

     如何改变对话或窗体视窗的背景颜色

 
    调用CWinApp : : SetDialogBkColor 可以改变所有应用程序的背景颜色。第一个参数
指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和
黄色文本。
BOOL CSampleApp : : InitInstance ( )
{

//use blue dialog with yellow text .
SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ;

}

    注意 : 该函数 只能放在应用程序类的 初始化函数里, 因为它是初始化应用程序类的一个成员函数。 作用的效果是对所有的应用程序类的窗口和对话框起作用。
             这里的应用程序类 直观的说就是 与自己刚开始建立 应用程序的时候 名称相同的.CPP类的实现文件里


       另外,该函数与 SetTextColor(RGB());函数是相互作用的,该该函数 一般可以对单个的 对话框的显示字幕的 颜色进行控制。如果 SetDialogBkColor() 函数与 SetTextColor(RGB())
函数同时存在时, 前者不可见,后者可见 .
      后者函数的使用一般为:使用ClassWizard处理 要改变颜色的对话框的WM_CTLCOLOR消息,然后再将 setTextColor();函数写在里面就可以拉,

 作者: 马敬发

 网名:清浪冲天

马敬发 于12 : 21 发表 已被浏览147次 评论(0) / 引用(13)
 
各种类和视图之间相互调用的总结
2004年 07月31日
 


1) 在View中获得Doc指 针
2) 在App中获得MainFrame指针
3) 在View中获得MainFrame指针
4) 获得View(已建立)指针
5) 获得当前文档指针
6) 获得状态栏与工具栏指针
7) 获得状态栏与工具栏变量
8) 在Mainframe获得菜单指针
9) 在任何类中获得应用程序类
10) 从文档类取得视图类的指针(1)
11) 在App中获得文档模板指针
12) 从文档模板获得文档类指针
13) 在文档类中获得文档模板指针
14) 从文档类取得视图类的指针(2)
15) 从一个视图类取得另一视图类的指针

VC中编程对于刚刚开始学习的同学,最大的障碍和问题就是消息机制和指针获取与操作。其实这些内容基本上是每本VC学习工具书上必讲的内容,而且通过MSDN很多问题都能解决。
下面文字主要是个人在编程中指针使用的一些体会,说的不当的地方请指正。
一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。
下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。

 1) 在View中获得Doc指针 CYouSDIDoc *pDoc=GetDocument();一个视只能有一个文档。
 2) 在App中获得MainFrame指针
CWinApp 中的 m_pMainWnd变量就是MainFrame的指针
也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
 3) 在View中获得MainFrame指针 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
 4) 获得View(已建立)指针 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
CyouView *pView=(CyouView *)pMain->GetActiveView();


  
 
5) 获得当前文档指针 CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();
 6) 获得状态栏与工具栏指针 CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);

 7) 如果框架中加入工具栏和状态栏变量还可以这样 (CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;

 8) 在Mainframe获得菜单指针 CMenu *pMenu=m_pMainWnd->GetMenu();
 9) 在任何类中获得应用程序类
用MFC全局函数AfxGetApp()获得。


 
 
Top
 
 回复人: Jerrylew(柳瑛) ( ) 信誉:100  2004-2-5 20:22:01  得分:15
 
 
 

 10) 从文档类取得视图类的指针
我是从http://download.cqcnc.com/soft/program/article/vc/vc405.html学到的,从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会特别是文字处理CEditView当产生多个视图类时,这个功能是非常需要的。
CDocument类提供了两个函数用于视图类的定位:
GetFirstViewPosition()和GetNextView() virtual POSITION GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;

注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变。
GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调用的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作): CTestView* pTestView;
POSITION pos=GetFirstViewPosition();
pTestView=GetNextView(pos);

这样,便可到了CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是这几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如: pView->IsKindOf(RUNTIME_CLASS(CTestView));
即可检查pView所指是否是CTestView类。

有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下: CView* CTestDoc::GetView(CRuntimeClass* pClass)
{
 CView* pView;
 POSITION pos=GetFirstViewPosition();

 while(pos!=NULL){
  pView=GetNextView(pos);
  if(!pView->IsKindOf(pClass))
  break;
 }

 if(!pView->IsKindOf(pClass)){
  AfxMessageBox("Connt Locate the View. http://www.VCKBASE.com");
  return NULL;
 }

 return pView;
}

其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:

1.pos为NULL,即已经不存在下一个视图类供操作;
2.pView已符合要求。

1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。
使用该函数应遵循如下格式(以取得CTestView指针为例):CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。
至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。

3.从一个视图类取得另一视图类的指针 综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数:
(假设要从CTestAView中取得指向其它视图类的指针)CView* CTestAView::GetView(CRuntimeClass* pClass)
{
 CTestDoc* pDoc=(CTestDoc*)GetDocument();
 CView* pView;
 POSITION pos=pDoc->GetFirstViewPosition();
 while(pos!=NULL){
  pView=pDoc->GetNextView(pos);
  if(!pView->IsKindOf(pClass))
  break;
 }
 if(!pView->IsKindOf(pClass)){
  AfxMessageBox("Connt Locate the View.");
  return NULL;
 }

 return pView;
}
这个函数和2中的GetView()相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition()和GetNextView()前加上了文档类指针,以表示它们是文档类成员函数。
有了此函数;当要从CTestAView中取得CTestBView的指针时,只需如下:CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));
 11)对于单文档中也可以加入多个文档模板,但是一般的开发就使用MDI方式开发多文档模板,其方法与上述视图的获取方法很接近,这里稍做解释,如果不清楚,请查阅MSDN,(以下四个内容(11、12、13、14)来源:http://sanjianxia.myrice.com/vc/vc45.htm

可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板的位置;
利用该值来调用CWinApp::GetNextDocTemplate函数,获得第一个CDocTemplate对象指针。 POSITION GetFirstDocTemplate( ) const;
CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;

第二个函数返回由pos 标识的文档模板。POSITION是MFC定义的一个用于迭代或对象指针检索的值。通过这两个函数,应用程序可以遍历整个文档模板列表。如果被检索的文档模板是模板列表中的最后一个,则pos参数被置为NULL。


 我会尽量用最明了,直接的语言来实现要达到的功能      

作者:马敬

马敬发 于12 : 30 发表 已被浏览199次 评论(0) / 引用(63)
 
如何在对话框中显示一个位图
2004年 07月31日
 

    31. 如何在对话框中显示一个位图
这要归功于Win 32先进的静态控件和Microsoft 的资源编辑器, 在对话框中显示位图
是很容易的, 只需将图形控件拖到对话中并选择适当属性即可,用户也可以显示图标、
位图以及增强型元文件。

 作者: 马敬发

 网名:清浪冲天

马敬发 于12 : 21 发表 已被浏览155次 评论(0) / 引用(10)
 
类重用的理解
2004年 07月31日
 

由于类的封装的特点,每个类的定义的头文件和类的的实现文件可以重复利用的, 如果某个工程想用的话,那么他就可以直接将这个类的头文件和类的实现文件 包含进去通过导入功能,该工程中的某一个文件中要用它,就只需 把他的类的头文件包含近来,通过#include "*.h"

马敬发 于12 : 28 发表 已被浏览144次 评论(0) / 引用(5)
 
MessageBox的使用方法
2004年 07月31日
 
if(MessageBox("真要删除此记录吗?","删除记录?",
  MB_YESNO | MB_ICONQUESTION) == IDYES)
马敬发 于12 : 33 发表 已被浏览309次 评论(0) / 引用(80)
 
改变任何一个控件显示文本的方法
2004年 07月31日
 

一般都是 SetWindowText("要显示的字符串")


    不同的控件用不同的 空间指针

   void CAdoDlg::SetButtonCtrl()
{//该函数用于设置对话框各按钮状态
 CButton* button;///该处是设置一个按钮类的 指针

 if(m_nModified){
  button = (CButton*)GetDlgItem(IDC_ADD);
  button->SetWindowText("确定");
  button = (CButton*)GetDlgItem(IDC_MODIFY);
  button->SetWindowText("取消");
  button = (CButton*)GetDlgItem(IDC_DELETE);
  button->ModifyStyle(0, WS_DISABLED);
  button = (CButton*)GetDlgItem(IDC_DATABASE);
  button->ModifyStyle(0, WS_DISABLED);
  button = (CButton*)GetDlgItem(IDC_TABLELIST);
  button->ModifyStyle(0, WS_DISABLED);
  button = (CButton*)GetDlgItem(IDCANCEL);
  button->ModifyStyle(0, WS_DISABLED);
 }
 else{
  button = (CButton*)GetDlgItem(IDC_ADD);
  button->SetWindowText("增加");
  button = (CButton*)GetDlgItem(IDC_MODIFY);
  button->SetWindowText("修改");
  button = (CButton*)GetDlgItem(IDC_DELETE);
  button->ModifyStyle(WS_DISABLED, 0);
  button = (CButton*)GetDlgItem(IDC_DATABASE);
  button->ModifyStyle(WS_DISABLED, 0);
  button = (CButton*)GetDlgItem(IDC_TABLELIST);
  button->ModifyStyle(WS_DISABLED, 0);
  button = (CButton*)GetDlgItem(IDCANCEL);
  button->ModifyStyle(WS_DISABLED, 0);
 }
 Invalidate(false);
}
 我会尽量用最明了,直接的语言来实现要达到的功能      

作者:马敬发

马敬发 于12 : 30 发表 已被浏览175次 评论(0) / 引用(28)
 
如何在使某个 标签显示系统时间
2004年 07月31日
 

 如何在使某个 标签显示系统时间
    1 首先 ,定义一个时间类的 对象 time,让它 获取系统时间,


        CTime time;
     time= CTime:: GetCurrentTime();//使变量 time获取系统时间,即把系统时间 存放到time变                                      //量中
    2   然后设置要显示时间控件的 变量假如 我们已经设定 一个标签的 一个CString 类型的变量

        m_label ;

        m_label.Format("公元 %4d年%2d月%2d日".time.GetYear(),time.GetMonth(),time.GetDay());///利用 时间对象的 成员函数 取出 年月日 ,然后再给 标签变量
          UpdateData(false)//更新界面 ,将数据变化传递给控件,显示出来

马敬发 于12 : 28 发表 已被浏览292次 评论(1) / 引用(94)
 
初学VC++的点点感悟与心得
2004年 07月31日
 

                如何控制鼠标的在不同位置的变化


    1,在对话框的类中定义一个窗口类的变量。如:RECT m_prectlink
    
    2   在初始化的OnInitDialog()函数中
        //将静态文本的屏幕坐标存放在m_pRectLink中
 GetDlgItem(IDC_LINK) -> GetWindowRect(&m_pRectLink);
     
      //将屏幕坐标转换为客户坐标
 ScreenToClient(&m_pRectLink);
    3 对对话框定义一个 OnMouseMove()
     void CSampleDlg::OnMouseMove(UINT nFlags, CPoint point)

 // TODO: Add your message handler code here and/or call default
 //下面设置鼠标在静态文本区时,将光标设成小手状

 if (point.x > m_pRectLink.left && point.x < m_pRectLink.right && point.y > m_pRectLink.top && point.y < m_pRectLink.bottom )
 //此处添加判断坐标算法
 {
  HCURSOR hCursor;
  hCursor = AfxGetApp() -> LoadCursor(IDC_HAND);

  //将鼠标设为小手状
  SetCursor(hCursor);

    4在某个范围内发生某事件void CSampleDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default

 if (point.x > m_pRectLink.left && point.x < m_pRectLink.right && point.y > m_pRectLink.top && point.y < m_pRectLink.bottom)

 //此处添加判断坐标算法
 {
  if (nFlags == MK_LBUTTON)   //鼠标左键按下
  {
   //为改善鼠标效果,此处加入以上变换鼠标形状的代码
   
   ShellExecute(0, NULL, "
http://202.118.197.40", NULL,NULL, SW_NORMAL);
   
   //也可以添加电子邮件的链接
  }
 }
 
 CDialog::OnLButtonDown(nFlags, point);
}


 }
                                  作者________马敬发

                                      网名:清浪冲天

12 : 01 初学VC++的点点感悟与心得

程序中常用的排序问题之一

#include <iostream.h>
#include <iomanip.h>
struct Person
{
 char name[20];
 unsigned long id;
 float salary;
};
Person allone[6]=,
      ,
      ,
      ,<

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有