博文

用VC++制作最简单的文本编辑器(2006-12-22 16:50:00)

摘要:1,新建,工程,MFC AppWizard(exe),(名字定一个,例如:TextEdit)。2,工程选择采用对话框模式。3,在对话框上添加一个RICHEDIT控件和一个按钮控件(Open)。4,打开TextEdit.cpp文件,在“BOOL CTextEditApp::InitInstance()”函数的第一行添加一行:“::AfxInitRichEdit();”5,运行一下,可以看到界面了。6,打开MFC ClassWizard 的 MemberVariables,为IDC_RICHEDIT1添加一个控件名“m_MyRichEdit”7,为Open按钮的单击函数添加以下代码:void CTextEditDlg::OnButtonOpen() {//显示文件打开对话框CFileDialog dlg(TRUE, "SQL", "*.txt",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|SQL Files(*.sql)|*.sql|All Files(*.*)|*.*||"); if ( dlg.DoModal()!=IDOK ) return;//获取文件的绝对路径CString sFileName=dlg.GetPathName();//打开文件CStdioFile out;out.Open(sFileName, CFile::modeRead);CString sSql="",s;//读取文件do{out.ReadString(s);sSql=sSql+s+(char)10;}while (out.GetPosition()!=out.GetLength());out.Close(); m_MyRichEdit.SetWindowText(sSql);}8,记得把RICHEDIT的属性中构选Multiline。9,再运行一次,文本编辑器做完..........

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

一些有用的VC++技术网页连接(2006-12-22 14:45:00)

摘要:开一个页面来收集一些比较好的VC++主页,免得老翻搜索引擎: http://wdswei.spaces.live.com/有不少VC的常用功能的代码介绍 http://blog.programfan.com/article.asp?id=10690VC++ 的串口通讯,包括使用window控件和直接用VC++访问两种方法的介绍 http://www.is.pku.edu.cn/~qzy/books/cppl/index_all.htm《C++程序设计语言》索引(全部)......

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

[ZT]常用C#函数表(2006-12-20 17:17:00)

摘要:查找VC++的常用函数真是麻烦,干脆找个C#的来顶替一下...(以下内容为转载) 记得看Stanley的C# primer的时候,这个大牛说学C#就是记住.net里面三千过函数怎么用就可以了:)果然是大牛,说的话都这么牛. 1、DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=System.DateTime.Now; 1.2 取当前年 int 年=currentTime.Year; 1.3 取当前月 int 月=currentTime.Month; 1.4 取当前日 int 日=currentTime.Day; 1.5 取当前时 int 时=currentTime.Hour; 1.6 取当前分 int 分=currentTime.Minute; 1.7 取当前秒 int 秒=currentTime.Second; 1.8 取当前毫秒 int 毫秒=currentTime.Millisecond; (变量可用中文)2、Int32.Parse(变量) Int32.Parse("常量") 字符型转换 转为32位数字型 3、 变量.ToString() 字符型转换 转为字符串 12345.ToString("n"); //生成 12,345.00 12345.ToString("C"); //生成 ¥12,345.00 12345.ToString("e"); //生成 1.234500e+004 12345.ToString("f4"); //生成 12345.0000 12345.ToString("x"); //生成 3039 (16进制) 12345.ToString("p"); //生成 1,234,500.00% 4、变量.Length 数字型 取字串长度: 如: string str="中国"; int Len = str.Length ; //Len是自定义变量, str是求测的字串的变量名 5、System.Text.Encoding.Default.GetBytes(变量) 字码转换 转为比特码 如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str......

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

VC++编程打开一个文本文件的例子(2006-12-20 17:09:00)

摘要:vc++的编程不容易,有时候想实现打开一个文本文件这么简单的功能都挺麻烦的(相对DELPHI),在网上找到一个例子,经修正后列出来。 void CMainFrame::OnFileOpen() {//显示文件打开对话框CFileDialog dlg(TRUE, "SQL", "*.txt",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|SQL Files(*.sql)|*.sql|All Files(*.*)|*.*||"); if ( dlg.DoModal()!=IDOK ) return;//获取文件的绝对路径CString sFileName=dlg.GetPathName();//打开文件CStdioFile out;out.Open(sFileName, CFile::modeRead);CString sSql="",s;//读取文件do{out.ReadString(s);sSql=sSql+s+(char)10;}while (out.GetPosition()!=out.GetLength());out.Close(); AfxMessageBox(sSql); } 另有一个方法如下: CStdioFile myFile;    CString ReadFileString;  if(myFile.Open("C:\\Readme.txt", Cfile::modeRead) == TRUE)  {   while(myFile.ReadString(ReadFileString) != FALSE)   {      //... 处理代码   }  } 另外还有一个保存的例子,不过还没经过亲自测试: /************************************************** 写文本文件**************************************************///显示文件保存对话框CFileDialog......

阅读全文(13121) | 评论:9

Winsock控件的属性及其描述(2006-12-05 08:59:00)

摘要:Winsock控件建立在TCP、UDP协议的基础上,完成与远程计算机的通信。即使对TCP/IP不太熟悉的用户,使用该控件也可以在十几分钟内创建一个简单的客户机/服务器程序。下面我们对Winsock控件的事件、方法、属性按其在程序中出现的顺序分别作详细的介绍,以便更好地理解程序源代码。   服务器程序的实现过程是:   (1)服务器程序必须设置好LocalPort属性,作为侦听端口,该值为一个整数(只要是一个其它TCP/IP应用程序没有使用过的值即可)。   (2)使用Listen方法进入侦听状态,等待客户机程序的连接请求。   (3)客户机程序发出连接请求,使服务器程序产生ConnectionRequest事件,该事件得到一个参数requestID。   (4)服务器程序用Accept方法接受客户机程序的requestID请求。这样,服务器程序就可以用SendData方法发送数据了。Accept方法必须用上一步得到的requestID作为其参数。   (5)当服务器程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。   (6)如果接受到Close事件,则用Close方法关闭TCP/IP连接。   客户机程序的实现过程是:   (1) 客户程序设置Remotehost属性,以便指定运行服务器程序的主机 名,该字符串可在"控制面板|网络|标识|计算机名"中查到。   (2) 设置RemotePort属性,以便指定服务器程序的侦听端口。   (3)使用Connect方法,向服务器提出连接请求。   (4)服务器接受客户机程序的请求,客户机程序产生Connect事件,就可以用SendData方法发送数据了。   (5)当客户机程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。   (6)如果接受到Close事件,则用Close方法关闭连接。   Winsock控件还有两个重要的属性,即Protocol和State。Protocol设定使用的协议是TCP还是UDP:取值sckTCPProtocol表示TCP, 取值sckUDPPro......

阅读全文(5405) | 评论:1

[ZT]VC++的网上教程(2006-11-30 09:53:00)

摘要:VC++教程 第一课 Windows编程和面向对象技术(2005-9-30) 1 2 3 VC++教程 第二课 使用Visual C++ 5.0(2005-9-30)1 2 3 4 VC++教程 第三课 窗口、菜单与消息框(2005-10-1)1 2 3 4 5 6 7  VC++教程 第四课 工具条和状态栏(2005-10-1)1 2 3 VC++教程 第五课 对话框(2005-10-3)1 2 3 4 转贴自:http://xz7.2000y.net/mb/2/smallclass.asp?typeid=11382&bigclassid=78495&smallclassid=0 『C程序设计』读书笔记:http://www.vczx.com/minute/c.php......

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

[ZT]VC小技巧(1)(2006-11-30 09:12:00)

摘要:(1) 如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED)//使程序最大化. (2) 确定应用程序的路径Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。Example:TCHARexeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,好象是128GetModuleFileName(NULL,exeFullPath,MAX_PATH)   (3) 如何在程序中获得其他程序的 图标?两种方法:(1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle,(2) SDK函数 SHGetFileInfo 获得有关文件的很多信息,如大小图标,属性, 类型等.Example(1):在程序窗口左上角显示 NotePad图标.void CSampleView:OnDraw(CDC * pDC){if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,&stFileInfo,sizeof(stFileInfo),SHGFI_ICON)){pDC ->DrawIcon(10,10,stFileInfo.hIcon)}}Example(2):同样功能,Use ExtractIcon Functionvoid CSampleView:: OnDraw(CDC *pDC){HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0)if (hIcon &&hIcon!=(HICON)-1)pDC->DrawIcon(10,10,hIcon)}    说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点. (4) 获得各种目录信息W......

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

[ZT]VC小技巧(2)(2006-11-30 09:12:00)

摘要:(26) 如何编程结束应用程序?这是个很简单又是编程中经常要遇到的问题.向窗口发送 WM_CLOSE消息,调用 CWnd::OnClose成员函数.允许对用户提示是否保存修改过的数据.Example: AfxGetMainWindow()->SendMessage(WM_CLOSE) 还可以创建一个自定义的函数 Terminate Windowvoid Terminate Window(LPCSTR pCaption){CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption) if (pWnd) pWnd ->SendMessage(WM_CLOSE)}     说明: FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测 Notepad是不是已运行而事先不知道Notepad的标题栏,这时FindWindow就无能为力了,可以通过枚举 windows任务列表的办法来实现。在机械出版社"Windows 95 API开发人员指南"一书有比较详细的介绍,这里就不再多说乐。 (27) 如何创建和使用无模式对话框MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的:模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用CWnd: : DestroyWindow来中止的,函数CDialog : : OnOK和CDialog : : OnCancel调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。void CSampleDialog : : OnOK ( ){// Retrieve and validate dialog data .if (! UpdateData (TRUE) ){// the UpdateData rountinewill set focus to correct item TRACEO (" UpdateData failed during dialog termination .\n")return} //Ca......

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

[ZT]VC小技巧(3)(2006-11-30 09:12:00)

摘要:(51) 如何访问预定义的GDI对象可以通过调用CDC:: SlectStockObject使用Windows的几个预定义的对象,诸如刷子、笔以及字体。下例使用了Windows预定义的笔和刷子GDI对象在视窗中画一个椭圆。//Draw ellipse using stock black pen and gray brush.void CSampleView:: OnDraw (CDC* pDC){//Determine size of view.CRect rcViewGetClientRect (rcView) //Use stock black pen and stock gray brush to draw ellipse.pDC->SelectStockObject (BLACK_PEN)pDC->SelectStockObject (GRAY_BRUSH)//Draw the ellipse.pDC->Ellipse (reView)} 也可以调用新的SDK函数GetSysColorBrush获取一个系统颜色刷子,下例用背景色在视窗中画一个椭圆:void CsampleView:: OnDraw (CDC* pDC){//Determine size of view.CRect rcViewGetClientRect (rcView) //Use background color for tooltips brush.CBrush * pOrgBrush=pDC->SelectObject ( CBrush ::FromHandle( ::GetSysColorBrush (COLOR_INFOBK))) //Draw the ellipse.pDC->Ellipse (rcView) //Restore original brush.pDC->SelectObject (pOrgBrush)} (52) 如何获取GDI对象的属性信息可以调用GDIObject:: GetObject。这个函数将指定图表设备的消息写入到缓冲区。下例创建了几个有用的辅助函数。//Determine if font is bold.BOOL IsFontBold (const CFont&font){LOGFONT stF......

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

[ZT]VC小技巧(4)(2006-11-30 09:08:00)

摘要:(76) 我在我的程序中是了CDWordArray。我向它添加了约10,000个整数,这使得它变得非常非常慢。为什么会这么糟?CDWordArray 是 很 好 用 的,只 是 因 为 你 没 有 指 定 数 组 的最大尺寸。因 此,当 你 添 加 新 元 素 时,该 类 会 从 堆 中 重 新 分 配 空 间。不 幸 的 是,该 类 会 在 每 次 插 入 新 元 素 时 都 为 数 组 重 新 分 配 空 间。如 果 你 向 它 添 加 了 很 多 新 元 素,所 有 这 些 分 配 和 复 制 数 组 的 操 作 会 就 会 使 它 变 慢。解 决 该 问 题 的 方 法 是,你 可 以 使 用 SetSize 函 数 的 第 二 个 参 数 来 改 变 这 种 重 新 分 配 的 频 率。例 如,如 果 你 把 该 参 数 设 置 为 500,则 每 次 数 组 空 间 超 出 时 它 才 重 新 分 配 并 添 加 500 个 新 空 间,而 不 是 1 个。这 样 一 来,你 就 可 以 不 用 重 新 分 配 而 添 加 了 另 外 499 个 元 素 空 间,这 也 会 大 大 提 高 程 序 的 运 行 速 度。 (77) 我该如何改变MDI框架窗口的子窗口的大小以使在窗口以一定的大小打开?在 视 中 的 OnInitialUpdate 函 数 中 调 用 GetParentFrame 函 数。GetParentFrame 会 返 回 一 指 向 一 保 存 有 该 视 的 框 架 窗 口 的 指 针。然 后 调 用 在 框 架 窗 口 上 调 用 MoveWindow。 (78) 在我的程序的某些部分,我可以调用 MessageBox 函数来建立一个信息对话框,例如在视类中。但是,在其它部分我却不能,如文档类中。为什么?我怎样才能在我的应用程序类中建立一个信息对话框?MessageBox 函 数 来 自 CWnd 类,所 以 你 只 能 在 从 CWnd 继 承 的 类 ( 如 CView ) 中 调 用 它。但 是,MFC 也 提 供 了 AfxMessageBox 函 数,你 可 以 在 任 何 地 方 调 用 它。 (79) 我需要在我的程序中设置全局变量,以使文档中的所有类都能访问。我应该吧它放到哪儿?把 该 变 量 放 到 该 应......

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