博文

获取主机名和IP地址(2007-09-01 15:49:00)

摘要:    使用gethostname和gethostbyname这两个winsock库函数实现获得主机名和IP地址,其中Gethostname获得主机名,Gethostbyname获得主机地址。
这两个函数的原型为:
int gethostname (
  char FAR * name, 
  int namelen      
);
获得主机名
char FAR * name          指针变量,存放主机名的数组
int namelen              字符串长度 struct hostent FAR * gethostbyname (
  const char FAR * name 
);
通过主机名获取主机地址,此函数返回hostent结构体变量
const char FAR * name    就是主机名 hostent结构体
struct hostent {
    char FAR *       h_name;
    char FAR * FAR * h_aliases;
    short            h_addrtype;
    short            h_length;
    c......

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

设置透明画刷(2007-04-24 23:56:00)

摘要:             设置透明画刷
我们在VC中画图时,如
CClientDC dc(this);       //首先定义DC
dc.Ellipse(point1.x,point1.y,point2.x,point2.y);  //画椭圆
画出来的效果就是一块椭圆,但有时我们不需要画刷,只需要一个图形框架就可以了,此时就要设置透明画刷,下面介绍一个设置透明画刷的方法:
CClientDC dc(this);
CBrush *brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(brush);
dc.Ellipse(point1.x,point1.y,point2.x,point2.y);  //画椭圆
这样画出来的就不会是一块了。......

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

VC++技术内幕(第四版)笔记(7)(转)(2006-05-11 17:03:00)

摘要:第八章:使用ActiveX控件
1,ActiveX控件是一个直接插入到C++程序中的软件模块,以前常称OLE控件(OCX),是基于MS-COM技术。 2,ActiveX控件与普通Windows控件比较:
相同点:ActiveX控件也可看成是一个子窗口(可以看成这样的)。
如果想在对话框上加入ActiveX控件,则只要在对话框编辑器中,把ActiveX控件放在适当的位置上,并在资源模板中标识该控件。如果要在运行的过程中建立ActiveX控件,则可以调用响应控件类的Create成员函数,而且通常在父窗口的WM_CREATE消息控制函数中调用。
不同点:属性和方法。
ActiveX控件不像普通控件那样发送以WM_打头的通知消息给它的包容器窗口,而是激发事件。事件实际上是由控件调用包容器函数。像普通的控件通知消息一样,事件并没有返回值传给ActiveX控件。事件如lick,KeyDown。但对于客户来说时间与控件的通知消息是一样的。 3,在MFC库中,ActiveX控件就像子窗口一样,但在控件窗口和包容器窗口之间有一层重要代码。实际上,ActiveX控件可能没有窗口。当调用Create函数时,并不是直接建立控件窗口,而是把控件代码载入进来,并激发一个“实地激活”(in-place activation)命令。然后ActiveX控件再建立它自己的窗口,通过MFC的CWnd类指针我们可以访问该窗口。不过客户程序最好不要使用ActiveX控件的hWnd句柄。 4,通常ActiveX控件会保存在扩展名为OCX的动态连接库中。包容器程序回根据Windows注册表利用COM技术在需要的时候装入动态连接库。
说明:
1)暂时可以这样认为,如果使用了ActiveX控件,那么在运行时候要装入该ActiveX控件代码。显然在发布含有ActiveX控件的程序时候,必须要包含相应的OCX文件,而且还得提供一个合适的安装程序。 5,安装ActiveX控件:
1)把找到的ActiveX控件动态连接库拷到硬盘上。
2)在WINDOWS注册表中登记注册。(可使用Regsvr32命令行命令)
3)在使用该控件的项目中安装该控件。(选择Project菜单,再选择Add To Project,再选择Components And Contro......

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

VC++技术内幕(第四版)笔记(6)(转)(2006-05-11 17:02:00)

摘要:第七章:无模式对话框 和 Windows通用对话框类
1,[无模式对话框]在它处于激活状态下还允许用户在(同一个应用程序中)其它地方工作。
   [通用对话框]则是C++和一组Windows的实用对话框之间的程序设计借口,包括File Open,Page Setup,Color等等,它们都是通过COMDLG32.DLL来实现的。 2,两种发送Windows消息:
CWnd::SendMessage//立刻导致对窗口控制函数的调用
CWnd::PostMessage//将消息放进Windows消息队列。对消息的处理可能被滞后。
具体:
1)LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
//Sends the specified message to this window. The SendMessage member function calls the window procedure directly and does not return until that window procedure has processed the message. This is in contrast to the PostMessage member function, which places the message into the window’s message queue and returns immediately. 2)BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
//Places a message in the window’s message queue and then returns without waiting for the corresponding window to process the message. Messages in a message queue are retrieved by calls to the GetMessage or PeekMe......

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

VC++技术内幕(第四版)笔记(5)(转)(2006-05-11 17:01:00)

摘要:第六章:模式对话框和Windows通用控件 1,对话框也是窗口,它不当可以接受消息,而且还可以被移动和关闭,甚至可以在它的客户区中进行绘图操作。 2,模式对话框在被关闭之前,用户无法在同一应用程序的其它地方进行工作。模式对话框更易于编程。
无模式对话框在它仍保留在屏幕的同时,用户还可以在应用程序的其它窗口进行工作。 3,对话框控件既可以通过CWnd指针来引用,也可以通过资源文件定义的索引值(和#define常量相关联)来引用。对话框控件本身就是一个窗口。控件通过向上级对话框发送消息来响应用户的动作。
利用ClassWizard可以帮助产生CDialog派生类,还可以使对话框类数据成员和对话框控件相联系。 4,在现存在项目中添加模式对话框步骤:
1)用对话框编辑器创建包含各种控件的对话框资源。对话框编辑器会对项目的资源文件更新,使之包含新的对话框资源,并且该项目的resource.h文件也会被更新,以便能够包含新的#define常量。
2)利用ClassWizard创建CDialog派生类,并将它和第一步所创建的资源相连接。
3)利用ClassWizard添加控件消息响应函数,并进行编辑。
4)在其它类中需要使用地方先构造该对话框类对象,再调用DoModal显示模式对话框。
说明:
1)在产生的对话框头文件中包含一个枚举类型常量IDD,用于设置该对话框资源ID。枚举常量IDD的使用减弱了CPP文件对资源ID的依赖。
2)《在其它类中显示模式对话框后,只有当模式对话框退出后,才继续执行该类显示模式对话框代码后的代码。》 5,在组合筐中Data属性页下,添加一条后按CTRL+RETURN来结束(或添加下条item)。(VC6中按?键可以获取相关帮助提示的)。组合框有Simple,Dropdown,Drop List三中风格,可以是Styles中选择。
列表筐中,用户只能用鼠标选择选择一个条目,而且在对话框编辑器中不能输入列表框的初始选择条目。
在静态文本控件中可以内置'&'符号。运行时候,&符号后面的字符下将有一个下划线。用户在按下ALT键后同时按下相应带下划线的字母,则就可以跳转到相应的控件上去。注意同一对话框中跳转字符不能重复。 6,当DoModal被调用后,实际在幕后引起一......

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

VC++技术内幕(第四版)笔记(4)(转)(2006-05-11 17:01:00)

摘要:第五章:图形设备接口(GDI)、颜色及字体
1,任何时候当程序需要直接在屏幕或打印机上绘图的时候,都需要调用GDI函数,GDI函数包含了一些用于绘制图形、位图以及文本的函数。 2,Windows的设备环境是GDI的关键元素,它代表了物理设备。每一个C++设备环境对象都有与之对应的Windows设备环境,并且通过一个32位类型的HDC句柄来标识。 3,MFC库设备环境类基类CDC包含了绘图所需要的所有成员函数,并且几乎所有派生类只有构造函数和析构函数不同(CMetaFileDC类除外)。
对于显示器来说,常用的派生类有CClientDC 和 CWindowDC,而对其它设备(如打印机或内存缓冲区),则可以构造一个基类CDC的对象。
对于显示器和打印机设备环境对象来说,应用程序框架会直接将句柄附在对象上;而对其它设备环境(如内存设备环境),为了将对象与句柄相联系,在构造完对象之后,还必须调用一个成员函数(进行初试化)。 4,CClientDC类 和 CWindowDC类
CClientDC( CWnd* pWnd );
//Constructs a CClientDC object that accesses the client area of the CWnd pointed to by pWnd. The constructor calls the Windows function GetDC. CWindowDC( CWnd* pWnd );
//Constructs a CWindowDC object that accesses the entire screen area (both client and nonclient) of the CWnd object pointed to by pWnd. The constructor calls the Windows function GetWindowDC. 如果构造CClientDC对象,则设备环境的映射区域限于客户区域,不能在客户区域外绘图。原点(0,0)在客户区左上角。
《 如果创建CWindowDC对象,则设备环境的映射区域为整个窗口(包括标题栏、状态栏、窗口边框等)。原点(0,0)在整个窗口的左上角。》
注意:
1)视图窗......

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

VC++技术内幕(第四版)笔记(3)(转)(2006-05-11 17:00:00)

摘要:第四章:基本事件处理、映射模式和滚动视图
1,消息映射:如在视窗中按下鼠标做键,会自动发送WM_LBUTTONDOWN消息,如果要对这消息有所反应的话,需 //{{AFX_MSG(CEx04aView)
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//头文件声明消息响应函数原型。
//}}AFX_MSG
DECLARE_MESSAGE_MAP()//头文件 BEGIN_MESSAGE_MAP(CDrawView, CView)//代码文件
 //{{AFX_MSG_MAP(CEx04aView)
 ON_WM_LBUTTONDOWN()//该消息映射宏将OnLButtonDown函数和应用程序框架联系在一起
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) //代码文件
{
 //event processing code here
}
说明:
为了方便ClassWizard,AppWizard生成了一些注释行。它把消息映射函数原型放在两个AFX_MSG“刮弧对”之间,在AFX_MSG_MAP“刮弧对”之间添加消息映射入口,并在代码文件中给出完整的OnLButtonDown成员函数框架。 2,视图中的OnDraw()是根据视图当前状态来绘制图象的,用户的操作可以改变这中状态。在完整的MFC库应用程序中,文档的对象掌握在应用程序(视图)的状态。 3,如果用全程变量来保存视图状态,这将在多视图情况下会遇到麻烦;(待体会) 4,CWnd::InvalidateRect函数能够触发WM_PAINT消息,该消息被窗口类如CView映射后,引起对OnDraw函数调用,从而重绘无效矩形区域。
优化窗口的绘制过程:
1)设置的无效区域越小,重画的速度就越快;
2)执行无效区域外的绘制纯属于浪费时间,OnDraw函数可以调用CDC的成员函数GetClipBox得到无效区域大小。
注意:
OnDraw函数不仅仅响应......

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

VC++技术内幕(第四版)笔记(2)(转)(2006-05-11 16:59:00)

摘要:第三章:从“Hello,world!”着手学习AppWizard
1,视图:从用户角度看,视图是一个普通的窗口;从程序员角度看,试图是一个从MFC库中CView类所派生的类的对象。视图对象的行为完全由类的成员函数和数据成员决定,其中包括派生类的特定成员和基类的继承而来的成员。 2,CEx03aView类最重要的基类是CWnd和CView。CWnd提供CEx03aView的窗口属性,而CView提供它和应用程序框架其它部分之间的联系,特别是和文档及框架窗口之间的联系。 3,视图类中OnDraw成员函数:OnDraw成员函数被设计成一个虚成员函数,每次当视窗需要被重绘时候,应用程序都要调用OnDraw函数。
当用户改变了窗口尺寸,或当前窗口恢复了先前被遮盖的部分,或当前应用程序改变了窗口的数据的时候,窗口都需要被重绘。
当用户改变了窗口尺寸,或窗口需要恢复被遮盖的部分,则应用程序自动去调用OnDraw函数。
但注意,如果程序中某个函数修改了窗口数据,则它必须通过调用视图所继承的Invalidate(InbalidateRect)成员函数来通知Windows,调用Invalidate后会触发对OnDraw函数的调用。 4,WINDOW中不允许直接访问显示硬件,必须通过和窗口相关联的“设备环境”跟显示硬件通讯。MFC中设备环境由CDC类对象来表示。 5,利用Win32 Debug模式 和 Win32 Release模式开发应用程序。
(默认情况不出现BUILD工具栏,可从TOOLS菜单选择Customize项,设置显示Build工具栏,VC6中也可在工具栏上直接点击右键选择Build工具栏)   Win32 Release模式 Win32 Debug模式  
源码调试 不能   编译器连接器都允许
MFC诊断宏 不能(定义了NDEBUG) 可以(定义了_DEBUG)
库连接  MFC Release库  MFC Debug库
编译优化 速度优化(学习版不能) 没有优化(快速编译) 我们应在Win32 Debug模式下开发应用程序,然后在发布或交付前用Win32 Release模式重建应用程序。in32 Release模式下建立的EXE......

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

VC++技术内幕(第四版)笔记(1)(转)(2006-05-11 16:57:00)

摘要:第一章:Microsoft Windows 和 Visual C++ 1,Windows应用程序中一定要有WinMain函数,用来完成某些特殊的任务,其中最主要的是创建应用次序的主窗口。 2,DOS下,所有次序的目标模块在创建过程中都被静态连接起来。而Windows允许动态连接,即一些特定结构的库(DLL)可以在运行过程中被装入和连接,并且被多个应用程序共享。 3,项目是一些相互关联的源文件的集合,这些源文件经过编译、连接,然后被组合在一起形成可执行的Wwindows应用程序或DLL。 4,几个重要Developer Studio创建的中间文件:
CLW (支持ClassWizard ) DSP (项目文件)
DSW (工作空间文件)  NCB (支持ClassView)
OPT (保持工作空间的配置) PLG (建立日志文件) 5,AppWizard是一个代码生成器,它会按照用户通过对话框指定的特性、类名、及源代码文件名来产生Windows应用程序工作架构。AppWizard所产生的代码只是一些最基本的代码,它完成的功能完全由应用程序的基类所决定。
/**************************************/
第二章:Microsoft基本类库应用程序框架
1,按照惯例,MFC库类名用大写“C”打头。 2,类CMyApp的对象theApp就代表一个应用程序。当运行该应用程序的时候,WINDOWS自动调用程序框架内部的WinMain函数,WinMain函数会去查找该应用程序的全局构造对象(theApp),该对象是有CWinApp类派生类的对象。C++中,全局对象在主程序被运行之前就已经构造好了。 3,当WinMain发现该应用程序对象(theApp)时,会自动调用虚拟成员函数CWinApp::InitInstance(),该函数会进一步调用相应的函数来完成主窗口的构造和显示工作。由于基类CWinApp中不知道我们实际需要的什么样的窗口,所以我们必须在派生出的应用程序类CMyApp中重载InitInstance()函数(CMyApp::InitInstance()),由多态性,当调用CWinApp::InitInstance()时候,会自动转向MyApp::InitInstance......

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