博文

第十六课:网络编程(2007-09-26 19:00:00)

摘要:第十六课:网络编程 一、UDP发送端: 建一个windows控制台工程,在main函数中加入: 1.  初始化DLL:          WSADATA wsaData;            WSAStartup(MAKEWORD(1,1),&wsaData);     Windows socket编程用到了微软提供的DLL,在使用前要对它进行初始化,Socket编程用到的DLL也分为不同的几个版本,WSAStartup函数的第一个参数就是用户所请求的版本号。 2.  生成socket:     SOCKET s= socket(AF_INET,SOCK_DGRAM,0); 3.  Bind:   SOCKADDR_IN sockSrc;        sockSrc.sin_family =AF_INET;        sockSrc.sin_port =htons(3000);        sockSrc.sin_addr .S_un .S_addr =htonl(INADDR_ANY);        bind (s,(SOCKADDR *)&sockSrc,sizeof(SOCKADDR)); 说明: a.bind函数要指定IP地址和端口号: IP地址:必须是执行这个程序所在计算机的IP地址,将其设定为INADDR_ANY,系统会自动将计算机的正确IP地址填入。 端口号:由于一台计算机可以启动多个网络程序,而IP地址只能保证网络数据到达指定的计算机,所以要指定端口号以区别数据是发给哪个网络程序。端口号是一个两个字节的整数,应把它设在1024到5000之间的值。若设为0,系统会将其设定为一个适当的数值。 B.由于各种计算......

阅读全文(9097) | 评论:0

第十五课:文档系列化(2007-09-25 15:51:00)

摘要:第十五课:文档系列化 一、在View中存取文件: 1.  用Carchive写文件:   CFileDialog dlg(false);     if (IDOK==dlg.DoModal())     {         CFile f(dlg.GetPathName(),CFile::modeCreate|CFile::modeWrite );         CArchive ar(&f,CArchive::store);         CString str("abc");         ar<<3<<'c'<<6.6f<<str;     } 2.  用Carchive读文件:     CFileDialog dlg(true);     if (IDOK==dlg.DoModal())     {         CFile f(dlg.GetPathName(),CFile::modeRead);         CArchive ar(&f,CArchive::load);           int x;         char c;         float d;    ......

阅读全文(9368) | 评论:0

第十四课:文件和注册表读写(2007-09-25 15:49:00)

摘要:第十四课:文件和注册表读写 一、文件操作: 1.  C的方式: FILE *p; p=fopen("c:\\1.txt","w"); fwrite("abc",1,4,p); fclose(p); 2.  C++的方式: ofstream f("c:\\1.txt"); f.write("hello",5); 3.  MFC的方式: I.                 写文件: CFile f("c:\\1.txt",CFile::modeWrite|CFile::modeCreate); f.Write("hello",5); a.几个标志的作用:   CFile::modeCreate:没有指定的文件就产生一个新文件,有就打开该文件,并将它裁剪到0;   CFile::modeNoTruncate :打开文件时不裁剪到0; b.写数据到文件末尾: CFile f("c:\\1.txt",CFile::modeWrite|CFile::modeCreate| CFile::modeNoTruncate);                     f.SeekToEnd(); f.Write("hello",5); II.              读文件: CFile f("c:\\1.txt",CFile::modeRead); char buf[10]; memset(buf,0,10); f.read(buf,5); MessageBox(buf); III.          文件对话框:   CFileDi......

阅读全文(9550) | 评论:0

第十三课:重绘(2007-09-25 15:47:00)

摘要:第十三课:重绘 一、基本知识: 1.  OnPaint和OnDraw函数 View的父类的OnPaint函数调用了OnDraw函数,若在子类为WM_PAINT消息添加响应函数OnPaint,OnDraw函数将不会被调用。 2.  CpaintDC和 CpaintDC的构造函数中调用了BeginPaint(),析构函数中调用了EndPaint(); CclietnDC的构造函数中调用了GetDC(),析构函数中调用了ReleaseDC()。 而BeginPaint(),EndPaint()只能用于响应WM-PAINT消息,否则将会出错。 二、利用动态数组: 1.  定义结构体LINE,用于保存线的数据。 struct LINE {        CPoint m_pt1;        CPoint m_pt2; }; 2.  在View中定义一个动态数组,保存每一根线的指针。 CPtrArray m_ptrLines;     定义两个Cpoint的成员变量,保存线的起点和终点:                CPoint m_ptOld;        CPoint m_ptNew; 3.  在View中加入WM_LBUTTONDOWN,WM_LBUTTONUP的响应函数,在OnLButtonDown中为m_ptNew赋值,              m_ptOld=point; 4.  在OnLButtonUp中加入代码:          m_ptNew=point;        CClientDC dc(this);               ......

阅读全文(4523) | 评论:0

第十二课: 对话框综合应用(2007-09-25 15:45:00)

摘要:第十二课: 对话框综合应用 在第六课的基础上,我们添加功能。增加一个用于设置笔的样式和宽度的对话框,和用于设置颜色的对话框。 一、设置笔的样式和宽度的对话框 1.  在资源面板中添加一个对话框,在上面添加一个文本框用于改变笔的宽度,三个单选框用于选择笔的样式,一个组框用于画一条演示的线。完成后的对话框如下图:    2.  为对话框生成一个从Cdialog派生的类CsetDlg,将三个单选框设置为一组,分别为文本框和这组单选框设置一个捆绑变量。    UINT    m_nWidth;    int              m_nStyle; 在对话框的构造函数中为它们赋初值:         m_nWidth  =  0;               m_nStyle  =  0; 3.  为文本框添加EN_CHANGE消息的响应函数OnChangeEdit1(),这个函数将在文本框的文字发生改变时被调用。在其中加入下列代码:            UpdateData();                      CPen newpen(m_nStyle,m_nWidth,RGB(0,0,255));                      CclinetDC dc(this);      &nbs......

阅读全文(4624) | 评论:0

第十一课:Windows样式(2007-09-24 12:19:00)

摘要:第十一课:Windows样式 一、首先回忆一下WinMain一课中的创建一个窗口的几个步骤。 二、首先回忆一下MFC一课中程序执行的顺序。 三、修改Windows样式: 1.  在CMainFrame::PreCreateWindow中修改: 在窗口产生之前,会调用它的成员函数PreCreateWindow,此时窗口还没有产生,相当于一栋大楼修建之前,在它的设计图纸上修改它的式样,然后按照修改后的图纸去修建大楼。 a.     直接修改CREATESTRUCT:(让最大化按钮不可用)   cs.style &= ~WS_MAXIMIZEBOX;   //去掉窗口的最大化按钮 b.     重新注册WNDCLASS:(修改窗口的图标及背景) 对于窗口的图标、背景等,不能直接修改。需要重新注册WNDCLASS。我们以修改图标为例,在资源面板中添加一个图标,其ID为IDI_ICON1: i.                 用AfxRegisterWndClass函数: cs.lpszClass=::AfxRegisterWndClass(NULL,NULL,NULL,                                      AfxGetApp()->LoadIcon(IDI_ICON1)); ii.              重新填写WNDCLASS WNDCLASS wndClass;......

阅读全文(4863) | 评论:0

第十课:对话框之属性单(2007-09-24 12:18:00)

摘要:第十课:对话框之属性单 一、属性单 1.  属性单就是在属性对话框中常见的标签对话框,包括一个CpropertySheet和几个CpropertyPage。ClassWizard就是一个属性单,其中ClassWizard是一个CpropertySheet,而“Message Maps”,“Member Variables”,“ Automation”,“ ActiveX Event”和“Class Info”每一项是一个CpropertyPage。 2.  生成属性单: a.       在资源面板里新建三个对话框,Caption属性改为容易区分的名字。每一个对话框对应于属性单中的一个CpropertyPage,对于CpropertyPage来说,它的样式有特殊的要求:Style是Child, Boder是Thin,确保TilteBar,Disable被选择。这些要求可以在MSDN中查“CPropertyPage, styles”得到。 b.       为每个对话框新建一个类Cpage1,Cpage2,Cpage3,基类选择CpropertyPage。 c.       将新建类的头文件加到 CxxxView的cpp中     #include "Page1.h" #include "Page2.h" #include "Page3.h" d.       在资源面板里新建一个菜单,在CxxxView中添加它的处理函数,加入代码:        CPropertySheet ps;        Cpage1 pg1;        Cpage2 pg2;        Cpage3 pg3;     &......

阅读全文(5974) | 评论:2

第九课:对话框(二)(2007-09-24 12:16:00)

摘要:第九课:对话框(二) 建立一个基于对话框的应用程序,可以看到在CXxxApp的InitInstance()函数中:     CDlgaDlg dlg;     m_pMainWnd = &dlg; 应用程序启动时,必须对CXxxApp的成员变量m_pMainWnd进行赋值,否则无法运行。在单文档的工程中,我们看不到这种赋值操作,它是在    if (!ProcessShellCommand(cmdInfo))        return FALSE; 在ProcessShellCommand函数中对m_pMainWnd赋了值。 一、return false和return ture的区别: 1.  在CXxxApp的InitInstance()函数中: return false:退出应用程序,不进入消息循环。 return ture:应用程序进入消息循环。 2.  在对话框类中的OnInitDialog()中: return false:如果在OnInitDialog()函数中设置了某控件得到焦点,如:       GetDlgItem(IDC_EDIT1))->SetFocus();       应return false,否则上一句代码不会生效。 return ture:在OnInitDialog()函数中没有设置了某控件得到焦点,应return ture。 说明:要使对话框上的某个控件在一显示对话框,就具有焦点,还可以将该控件的       Table Order设为1。 二、在对话框中响应回车键: 在对话框中回车,会执行缺省按钮(Default Button)的函数,默认的缺省按钮是IDOK。如果没有缺省按钮,会执行对话框中的OnOK()函数。所以,在一个对话框中要控制回车键,可以采用下面的方法: 1.  在OnOK()函数中添加代码: 在对话框中添加四个文本框,我们想用户按回车键时,四个文本框依次循环得到焦点: if(GetFocus()==GetDlgItem(IDC_EDIT4))    //如果第......

阅读全文(4992) | 评论:0

第八课:对话框(一)(2007-09-24 12:15:00)

摘要:第八课:对话框 一、概念 1.对话框可以在资源面板中的对话框编辑器中设计,添加各种控件,改变它们的外观,属性。对话框也用一个ID来标识,可以用ClassWizard生成类(从CDialog派生)来管理对话框。 1.  模态对话框: 模态对话框是主程序窗口打开的临时窗口,用于显示消息及取得用户数据,用户要关闭对话框才能恢复主窗口的工作。模态对话框可定义为局部变量 CMyDlg dlg;  // CMyDlg是一个管理对话框的类,从CDialog派生  dlg.DoModal();//可以想象在此函数完成了对话框的显示,销毁操作。 注意,如果对话框中我们需要将某些变量取出,不能用 GetDlgItem(ID_..)->GetWindowText(),因为当DoMadle()返回时,对话框已经不存在了。 2.非模态对话框:  对话框不返回,可以切换到其他窗口,所以非模态对话框必须定义为全局变量或用   new产生,然后 dlg.Create(IDD_DIALOG1); dlg.ShowWindow(SW_SHOW); 二、若你想在对话框上加几个控件,应在OnCreate()中加入代码,这时对话框刚刚产生,若想对控件操作,则应加在OnInitDialog()(若在OnCreate()会产生错误,因为子控件还不一定存在)。 注意:若你想改变主窗口的标题,应加在App的InitInstance()中,加在MainFrame和View中的PreCreateWindow()和OnCreate()中都不可以,因为当程序打开无标题文件时,主窗口标题被覆盖了。 三、对话框中的函数: CWnd::GetDlgItem(nID);           //得到指定控件临时对象的指针 CWnd::SetFocus();              //得到焦点 (Cedit*)GetDlgItem(IDC_EDIT1)->SetSel(0,3);//选择前4个字符 因为要用CEdit类中的SetSel()函数,所以要将得到指针进行类型转换。 使用前要得到焦点否则看不出显示效果。 CWnd::EnableWindow(false);         //使得窗口失效 也可以采用发消息的方式实现: GetDlgItem(I......

阅读全文(5028) | 评论:0

第七课:菜单(二)(2007-09-23 14:06:00)

摘要:第七课:菜单(二) 一、系统菜单: 1.  系统菜单是有鼠标点击应用程序图标弹出的菜单。点击系统菜单时,发出WM_SYSCOMMAND消息,可添加此消息的响应函数来进行控制。 2.  操作系统菜单: 在CMainFrame的OnCreate函数中加入代码: CMenu *pMenu=GetSystemMenu(false);      //得到系统菜单 pMenu->RemoveMenu(pMenu->GetMenuItemCount()-1,MF_BYPOSITION);      //移除系统菜单的最后一项      pMenu->EnableMenuItem(SC_CLOSE,MF_DISABLED | MF_BYCOMMAND|MF_GRAYED);                  //将系统菜单的“关闭”菜单项设置为失效,变灰      pMenu->AppendMenu(MF_STRING,1111,"HELLO");         //在系统菜单中添加一个菜单      GetSystemMenu(true);         //重置系统菜单到默认状态 二、运行时产生菜单:   在CMainFrame的OnCreate函数中加入代码: mnu.CreatePopupMenu();       //产生一个弹出菜单,注意:在WIN2000下mnu应定义为成员变量,否则会报红框,WINNT下可以定义为局部变量     mnu.AppendMenu(MF_STRING,1111,"HELOO");         //向刚产生的弹出菜单加入一个菜单项     GetMenu()->AppendMenu(MF_POPUP,(INT)mnu.m_hMenu,"heha");         //将弹出菜单添加到主窗口的菜单上 GetMenu()->G......

阅读全文(4235) | 评论:0