不同的线程之间关闭CSocket的问题?

uaiia 2003-04-11 03:06:49
在主线程里建立CSocket,用次线程对CSocket进行通讯操作,当完成的时候用次线程关闭CSocket的时候会发生错误,不知如何解决?
TestSocket::TEST()
{
Create(0,SOCK_DGRAM,0);
AfxBeginThread((AFX_THREADPROC)thread,this);
}
static DWORD TestSocket::thread(TestSocket *pSock)
{
pSock->ReceiveFrom(.......)
...
...
//以上一切正常!

pSock->Close();//发生错误!!!不知怎样解决
}
...全文
58 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yongdu 2003-04-14
  • 打赏
  • 举报
回复
原来如此
fbmsf 2003-04-12
  • 打赏
  • 举报
回复
哈哈,怪不得,我用sdk来作的都没有问题。
verybigbug 2003-04-11
  • 打赏
  • 举报
回复
这是MFC的Bug。就是scoket不能在别的线程中delete!!不用MFC就没有这个问题。

这是MSDN上的解决方案:

PRB: Assertion Failed on Line 837 - Sockcore.cpp

--------------------------------------------------------------------------------
The information in this article applies to:

The Microsoft Foundation Classes (MFC), used with:
Microsoft Visual C++, 32-bit Editions, versions 2.1, 2.2, 4.0, 4.1, 4.2, 5.0, 6.0

--------------------------------------------------------------------------------


SYMPTOMS
A multi-threaded application that uses MFC's socket classes encounters a message box or debug output line that contains an error message similar to the following:

For Visual C++ 2.x:

Assertion failed - <app name>:File sockcore.cpp, Line 837
For Visual C++ 4.0:
Assertion failed - <app name>:File sockcore.cpp, Line 1041



CAUSE
Most frequently, this problem is due to the sharing of CSocket objects between multiple threads.

A CSocket object should be used only in the context of a single thread because the SOCKET handle encapsulated by a CAsyncSocket object is stored in a per-thread handle map. (CSocket is derived from CAsyncSocket.) Other information is stored on a per-thread basis, including a hidden notification window that MFC uses for socket notifications.

The assertion failure line, which can be found in Sockcore.cpp in the \Msvc20\Mfc\Src directory, is:


ASSERT(pThreadState->m_hSocketWindow != NULL);
This assertion failure occurs because the CSocket object was either created or accepted in the context of another thread. The socket notification window was created in a different thread, and the m_hSocketWindow for the current thread is NULL, thus the assertion failure.



RESOLUTION
As already mentioned, a CAsyncSocket object should be used only in the context of a single thread. If you need to switch the thread that is accessing a SOCKET connection with another thread, then you should use a separate CAsyncSocket object in each thread, and use the Detach and Attach functions to attach the CAsyncSocket object to the SOCKET handle in the thread that is about to use the socket. Use this sequence:



Use Detach() to detach the CAsyncSocket object from the SOCKET handle in the thread that is currently using the CAsyncSocket object.


Use Attach() to attach a different CAsyncSocket object to the SOCKET handle while in the context of the MFC UI thread in which you wish to begin accessing the SOCKET connection.


The code shown in the "Code Sample" section of this article shows how to handle the moment when a listening socket accepts a connection request and then begins a new thread to handle the new connection.

NOTE: One concern often arises that socket notification messages might be lost between the time the call to Detach() is made and the subsequent call to Attach() is made. This is not a concern because of the way socket notifications are handled. The implementation of CAsyncSocket::Attach() makes a call to WSAAsyncSelect to enable notifications. As mentioned in the documentation for WSAAsyncSelect, if any socket noficiations were already pending for the SOCKET, they will be re-posted.



MORE INFORMATION
To Accept a socket in the context of one thread and then begin using it in the context of another thread, you need to be sure to detach the CAsyncSocket object in the first thread and attach a different CAsyncSocket object in the second thread. The following code snippet shows how to do it.

Code Sample

// ...
class CSockThread : public CWinThread
{
// ... Other function and member declarations
protected:
CSocket m_sConnected;
};

SOCKET hConnected;

BOOL CSockThread::InitInstance()
{
// Attach the socket object to the socket handle
// in the context of this thread.
//
m_sConnected.Attach(hConnected);

return TRUE;
}

// This listening socket has been constructed
// in the primary thread.
//
void CListeningSocket::OnAccept(int nErrorCode)
{
// This CSocket object is used just temporarily
// to Accept the incoming connection.
//
CSocket sConnected;
Accept(sConnected);

// Detach the newly accepted socket and save
// the SOCKET handle
hConnected = sConnected.Detach();

// After Detaching it, it should no longer be
// used in the context of this thread

// Start the other thread
AfxBeginThread(RUNTIME_CLASS(CSockThread));
}



REFERENCES
MFC Technical Note #2 - Although this technical note does not directly address the CAsyncSocket class, it does discuss the mapping of handles to objects. The relationship between a SOCKET handle and a CAsyncSocket object is maintained in much the same way.

Bind 2003-04-11
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1321/1321959.xml?temp=.6496088
yins 2003-04-11
  • 打赏
  • 举报
回复
up
yongdu 2003-04-11
  • 打赏
  • 举报
回复
应该能直接操作其它线程的 CSocket对象。套间字是内核对象,和在什么线程中是没关系的。

close前ShutDown一下试试。另外,发生什么错,返回什么错误代码
yydyqy 2003-04-11
  • 打赏
  • 举报
回复
试试下面的..........
TestSocket::TEST()
{
Create(0,SOCK_DGRAM,0);
AfxBeginThread((AFX_THREADPROC)thread,this->m_hSocket);
Detach();
}
UINT TestSocket::thread(LPVOID pParam)
{
SOCKET hSock = (SOCKET)pParam;
TestSocket testSock;
testSock.Attach(hSock);
// 对testSock进行操作
。。。。。。。
//退出前别忘了testSock.Detach();
}
ksyou 2003-04-11
  • 打赏
  • 举报
回复
学习
用户 昵称 2003-04-11
  • 打赏
  • 举报
回复
TestSock是你的主线程,thread是你的子线程,最要不要这样。
用户 昵称 2003-04-11
  • 打赏
  • 举报
回复
在次线程中不能直接操作主线程的 CSocket对象(或者有办法,不知道)。
应该把主线程的Socket handle 在次线程启动之前传递给次线程。
Alvin_huai 2003-04-11
  • 打赏
  • 举报
回复
gz
Alvin_huai 2003-04-11
  • 打赏
  • 举报
回复
gz
第 1章 概述 1 1.1 网络编程相关的基本概念 1 1.1.1 网络编程与进程通信 1 1.1.2 Internet中网间进程的标识 3 1.1.3 网络协议的特征 7 1.2 三类网络编程 10 1.2.1 基于TCP/IP协议栈的网络编程 10 1.2.2 基于WWW应用的网络编程 10 1.2.3 基于.NET框架的Web Services网络编程 10 1.3 客户机/服务器交互模式 13 1.3.1 网络应用软件的地位和功能 13 1.3.2 客户机/服务器模式 14 1.3.3 客户机与服务器的特性 15 1.3.4 容易混淆的术语 16 1.3.5 客户机与服务器的通信过程 16 1.3.6 网络协议与C/S模式的关系 17 1.3.7 错综复杂的C/S交互 17 1.3.8 服务器如何同时为多个客户机服务 18 1.3.9 标识一个特定服务 20 1.4 P2P模式 21 1.4.1 P2P技术的兴起 21 1.4.2 P2P的定义和特征 21 1.4.3 P2P的发展 22 1.4.4 P2P的关键技术 22 1.4.5 P2P系统的应用与前景 22 习题 23 第 2章 套接字网络编程基础 24 2.1 套接字网络编程接口的产生与发展 24 2.1.1 问题的提出 24 2.1.2 套接字编程接口起源于UNIX操作系统 25 2.1.3 套接字编程接口在Windows和Linux操作系统中得到继承和发展 25 2.1.4 套接字编程接口的两种实现方式 25 2.1.5 套接字通信与UNIX操作系统的输入/输出的关系 26 2.2 套接字编程的基本概念 27 2.2.1 什么是套接字 27 2.2.2 套接字的特点 28 2.2.3 套接字的应用场合 30 2.2.4 套接字使用的数据类型和相关的问题 30 2.3 面向连接的套接字编程 32 2.3.1 可靠的传输控制协议 32 2.3.2 套接字的工作过程 33 2.3.3 面向连接的套接字编程实例 34 2.3.4 进程的阻塞问题和对策 40 2.4 无连接的套接字编程 43 2.4.1 高效的用户数据报协议 43 2.4.2 无连接的套接字编程的两种模式 43 2.4.3 数据报套接字的对等模式编程实例 45 2.5 原始套接字 47 2.5.1 原始套接字的创建 47 2.5.2 原始套接字的使用 48 2.5.3 原始套接字应用实例 49 习题 51 第3章 WinSock编程 53 3.1 WinSock概述 53 3.2 WinSock库函数 55 3.2.1 WinSock的注册与注销 55 3.2.2 WinSock的错误处理函数 58 3.2.3 主要的WinSock函数 61 3.2.4 WinSock的辅助函数 74 3.2.5 WinSock的信息查询函数 77 3.2.6 WSAAsyncGetXByY类型的扩展函数 79 3.3 网络应用程序的运行环境 82 习题 84 第4章 MFC编程 85 4.1 MFC概述 85 4.1.1 MFC是一个编程框架 85 4.1.2 典型的MDI应用程序的构成 87 4.2 MFC和Win32 89 4.2.1 MFC对象和Windows对象的关系 89 4.2.2 几个主要的类 91 4.3 CObject类 95 4.3.1 CObject类的定义 95 4.3.2 CObject类的特性 96 4.4 消息映射的实现 98 4.5 MFC对象的创建 102 4.5.1 MFC对象的关系 102 4.5.2 MFC提供的接口 104 4.5.3 MFC对象的创建过程 104 4.6 应用程序的退出 107 习题 107 第5章 MFC WinSock类的 编程 109 5.1 CAsyncSocket类 110 5.1.1 使用CAsyncSocket类的一般步骤 110 5.1.2 创建CAsyncSocket类对象 111 5.1.3 关于CAsyncSocket类可以接受并处理的消息事件 112 5.1.4 客户端套接字对象请求连接到服务器端套接字对象 114 5.1.5 服务器接收客户机的连接请求 115 5.1.6 发送与接收流式数据 116 5.1.7 关闭套接字 118 5.1.8 错误处理 118 5.1.9 其他成员函数 119 5.2 CSocket类 120 5.2.1 创建CSocket对象 120 5.2.2 建立连接 120 5.2.3 发送和接收数据 120 5.2.4 CSocket类、CArchive类和CSocketFile类 121 5.2.5 关闭套接字和清除相关的对象 122 5.3 CSocket类的编程模型 122 5.4 用CAsyncSocket类实现聊天室程序 123 5.4.1 实现目标 123 5.4.2 创建客户端应用程序 124 5.4.3 客户端程序的类与消息驱动 134 5.4.4 客户端程序主要功能的代码和分析 135 5.4.5 创建服务器端程序 142 5.4.6 服务器端程序的流程和消息驱动 144 5.4.7 点对点交谈的服务器端程序主要功能的代码和分析 145 5.5 用CSocket类实现聊天室程序 151 5.5.1 聊天室程序的功能 151 5.5.2 创建聊天室的服务器端程序 151 5.5.3 聊天室服务器端程序的主要实现代码和分析 154 5.5.4 创建聊天室的客户端程序 162 5.5.5 聊天室客户端程序的主要实现代码和分析 163 习题 170 实验 170 第6章 WinInet编程 172 6.1 MFC WinInet类 172 6.1.1 概述 172 6.1.2 MFC WinInet所包含的类 173 6.1.3 使用WinInet类编程的一般步骤 174 6.1.4 创建CInternetSession类对象 175 6.1.5 查询或设置Internet请求选项 176 6.1.6 创建连接类对象 177 6.1.7 使用文件检索类 178 6.1.8 重载OnStatusCallback函数 179 6.1.9 创建并使用网络文件类对象 180 6.1.10 CInternteException类 183 6.2 用MFC WinInet类实现FTP客户端 183 6.2.1 程序要实现的功能 183 6.2.2 创建应用程序的过程 184 习题 186 实验 187 第7章 WinSock的多线程 编程 188 7.1 WinSock为什么需要多线程编程 188 7.1.1 WinSock的两种I/O模式 188 7.1.2 两种模式的优缺点及解决方法 189 7.2 Win32操作系统下的多进程多线程机制 189 7.2.1 Win32 OS是单用户多任务的操作系统 189 7.2.2 Win32 OS是支持多线程的操作系统 190 7.2.3 多线程机制在网络编程中的应用 191 7.3 VC++对多线程网络编程的支持 192 7.3.1 MFC支持的两种线程 192 7.3.2 创建MFC的工作线程 193 7.3.3 创建并启动用户界面线程 195 7.3.4 终止线程 198 7.4 多线程FTP客户端实例 200 7.4.1 编写线程函数 200 7.4.2 添加事件处理函数 206 习题 208 第8章 WinSock的I/O模型 209 8.1 select模型 210 8.2 WSAAsyncSelect异步I/O模型 212 8.3 WSAEventSelect事件选择模型 216 8.4 重叠I/O模型 221 8.4.1 重叠I/O模型的优点 221 8.4.2 重叠I/O模型的基本原理 221 8.4.3 重叠I/O模型的关键函数和数据结构 222 8.4.4 使用事件通知实现重叠模型的步骤 225 8.4.5 使用完成例程实现重叠模型的步骤 227 8.5 完成端口模型 229 8.5.1 什么是完成端口模型 229 8.5.2 使用完成端口模型的方法 230 习题 238 第9章 HTTP及编程 239 9.1 HTTP 239 9.1.1 HTTP的背景 239 9.1.2 HTTP的内容 240 9.1.3 HTTP消息的一般格式 242 9.1.4 HTTP请求的格式 243 9.1.5 HTTP响应的格式 245 9.1.6 访问认证 248 9.1.7 URL编码 249 9.1.8 HTTP的应用 250 9.2 利用CHtmlView类创建Web浏览器型的应用程序 250 9.2.1 CHtmlView类与WebBrowser控件 250 9.2.2 CHtmlView类的成员函数 251 9.2.3 创建一个Web浏览器型的应用程序的一般步骤 256 9.3 Web浏览器应用程序实例 261 9.3.1 程序实现的目标 261 9.3.2 创建实例程序 262 习题 265 实验 265 第 10章 电子邮件协议与编程 267 10.1 电子邮件系统的工作原理 267 10.1.1 电子邮件的特点 267 10.1.2 电子邮件系统的构成 267 10.1.3 电子邮件系统的实现 268 10.2 简单邮件传送协议 270 10.2.1 概述 270 10.2.2 SMTP客户机与SMTP服务器之间的会话 270 10.2.3 常用的SMTP命令 271 10.2.4 常用的SMTP响应码 273 10.2.5 SMTP的会话过程 274 10.2.6 使用WinSock来实现电子邮件客户机与服务器的会话 274 10.3 电子邮件信件结构详述 275 10.3.1 Internet文本信件的格式标准——RFC 822 275 10.3.2 信件的头部 276 10.3.3 构造和分析符合RFC 822标准的电子信件 281 10.4 MIME编码解码与发送附件 281 10.4.1 MIME概述 281 10.4.2 MIME定义的新的信头字段 282 10.4.3 MIME邮件的内容类型 283 10.4.4 MIME邮件的编码方式 292 10.5 POP3与接收电子邮件 294 10.5.1 POP3 294 10.5.2 POP3的会话过程 294 10.5.3 POP3会话的3个状态 295 10.5.4 POP3标准命令 296 10.5.5 接收电子邮件的一般步骤 298 10.6 接收电子邮件的程序实例 299 10.6.1 实例程序的目的和实现的技术要点 299 10.6.2 创建应用程序的过程 301 10.7 发送电子邮件的程序实例 302 10.7.1 实例程序的目的和实现的技术要点 302 10.7.2 创建应用程序的过程 303 习题 305 参考文献 307
第1章 MFC概述 1 1.1 MFC是一个编程框架 1 1.1.1 封装 1 1.1.2 继承 2 1.1.3 虚拟函数和动态约束 2 1.1.4 MFC的宏观框架体系 2 1.2 MDI应用程序的构成 3 1.2.1 构成应用程序的对象 3 1.2.2 构成应用程序的对象之间的关系 5 1.2.3 构成应用程序的文件 5 第2章 MFC和Win32 9 2.1 MFC Object和Windows Object的关系 9 2.2 Windows Object 12 2.2.1 Windows的注册 12 2.2.2 MFC窗口类CWnd 15 2.2.3 在MFC下创建一个窗口对象 17 2.2.4 MFC窗口的使用 18 2.2.5 在MFC下窗口的销毁 19 2.3 设备描述表 20 2.3.1 设备描述表概述 20 2.3.2 设备描述表在MFC中的实现 22 2.3.3 MFC设备描述表类的使用 24 2.4 GDI对象 25 第3章 CObject类 28 3.1 CObject的结构 28 3.2 CObject类的特性 30 3.3 实现CObject特性的机制 32 3.3.1 DECLARE_DYNAMIC等宏的定义 32 3.3.2 CruntimeClass类的结构与功能 35 3.3.3 动态类信息、动态创建的原理 38 3.3.4 序列化的机制 39 第4章 消息映射的实现 42 4.1 Windows消息概述 42 4.1.1 消息的分类 42 4.1.2 消息结构和消息处理 42 4.2 消息映射的定义和实现 44 4.2.1 MFC处理的三类消息 44 4.2.2 MFC消息映射的实现方法 45 4.2.3 在声明与实现的内部 46 4.2.3.1 消息映射声明的解释 47 4.2.3.2 消息映射实现的解释 49 4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC窗口过程 55 4.4.1 MFC窗口过程的指定 56 4.4.2 对Windows消息的接收和处理 58 4.4.2.1 从窗口过程到消息映射 59 4.4.2.2 Windows消息的查找和匹配 60 4.4.2.3 Windows消息处理函数的调用 62 4.4.2.4 消息映射机制完成虚拟函数功能的原理 63 4.4.3 对命令消息的接收和处理 64 4.4.3.1 MFC标准命令消息的发送 64 4.4.3.2 命令消息的派发和消息的多次处理 67 4.4.3.3 一些消息处理类的OnCmdMsg的实现 69 4.4.3.4 一些消息处理类的OnCommand的实现 71 4.4.4 对控制通知消息的接收和处理 72 4.4.4.1 WM_COMMAND控制通知消息的处理 72 4.4.4.2 WM_NOTIFY消息及其处理: 73 4.4.4.3 消息反射 74 4.4.5 对更新命令的接收和处理 77 4.4.5.1 实现方法 77 4.4.5.2 状态更新命令消息 78 4.4.5.3 类CCmdUI 79 4.4.5.4 自动更新用户接口对象状态的机制 80 4.5 消息的预处理 82 4.6 MFC消息映射的回顾 83 第5章 MFC对象的创建 85 5.1 MFC对象的关系 85 5.1.1 创建关系 85 5.1.2 交互作用关系 86 5.2 MFC提供的接口 87 5.2.1 虚拟函数接口 87 5.2.2 消息映射方法和标准命令消息 91 5.3 MFC对象的创建过程 94 5.3.1 应用程序中典型对象的结构 94 5.3.1.1 应用程序类的成员变量 95 5.3.1.2 CDocument的成员变量 97 5.3.1.3 文档模板的属性 97 5.3.2 WinMain入口函数 99 5.3.2.1 WinMain流程 99 5.3.2.2 MFC空闲处理 101 5.3.3 SDI应用程序的对象创建 102 5.3.3.1 文档模板的创建 102 5.3.3.2 文件的创建或者打开 103 5.3.3.3 SDI边框窗口的创建 112 5.3.3.4 视的创建 115 5.3.3.5 窗口初始化 116 5.3.3.6 视的初始化 120 5.3.3.7 激活边框窗口(处理WM_ACTIVE) 121 5.3.3.8 SDI流程的回顾 122 5.3.4 MDI程序的对象创建 123 5.3.4.1 有别于SDI的主窗口加载过程 124 5.3.4.2 MDI子窗口、视、文档的创建 125 5.3.4.3 MDI子窗口的初始化和窗口的激活 127 第6章 应用程序的退出 131 6.1 边框窗口对WM_CLOSE的处理 131 6.2 窗口的销毁过程 135 6.2.1 DestroyWindow 135 6.2.2 处理WM_DESTROY消息 136 6.2.3 处理WM_NCDESTROY消息 136 6.3 SDI窗口、MDI主、子窗口的关闭 137 第7章 MFC的DLL 139 7.1 DLL的背景知识 139 7.2 调用约定 141 7.2.1 MFC的DLL应用程序的类型 142 7.3 DLL的几点说明 143 7.4 输出函数的方法 145 第8章 MFC的进程和线程 148 8.1 Win32的进程和线程概念 148 8.2 Win32的进程处理简介 148 8.2.1 进程的创建 148 8.2.2 进程的终止 149 8.3 Win32的线程 150 8.3.1 线程的创建 150 8.3.2 线程的终止 150 8.3.3 线程局部存储 151 8.4 线程同步 152 8.4.1 同步对象 152 8.4.2 等待函数 153 8.5 MFC的线程处理 154 8.5.1 创建用户界面线程 155 8.5.2 创建工作者线程 155 8.5.3 AfxBeginThread 155 8.5.4 CreateThread和_AfxThreadEntry 157 8.5.5 线程的结束 160 8.5.6 实现线程的消息循环 161 第9章 MFC的状态 163 9.1 模块状态 163 9.2 模块、进程和线程状态的数据结构 164 9.2.1 层次关系 164 9.2.2 CNoTrackObject类 166 9.2.3 AFX_MODULE_STATE类 166 9.2.4 _AFX_BASE_MODULE_STATE 169 9.2.5 _AFX_THREAD_STATE 169 9.2.6 AFX_MODULE_THREAD_STATE 171 9.3 线程局部存储机制和状态的实现 172 9.3.1 CThreadSlotData和_afxThreadData 173 9.3.1.1 CThreadSlotData的定义 173 9.3.1.2 CThreadSlotData的一些数据成员 174 9.3.1.3 _afxThreadData 175 9.3.2 线程状态_afxThreadState 176 9.3.3 进程模块状态afxBaseModuleState 178 9.3.4 状态对象的创建 180 9.3.4.1 状态对象的创建过程 180 9.3.4.2 创建过程所涉及的几个重要函数的算法 183 9.4 管理状态 184 9.4.1 模块状态切换 184 9.4.2 扩展DLL的模块状态 186 9.4.2.1 _AFX_EXTENSION_MODULE 187 9.4.2.2 扩展DLL的初始化函数 188 9.4.3 核心MFC DLL 190 9.4.4 动态链接的规则DLL的模块状态的实现 190 9.5 状态信息的作用 192 9.5.1.1 模块信息的保存和管理 192 9.5.2 MFC资源、运行类信息的查找 193 9.5.3 模块信息的显示 194 9.5.4 模块-线程状态的作用 196 9.5.4.1 只能访问本线程MFC对象的原因 196 9.5.4.2 实现MFC对象和Windows对象之间的映射 196 9.5.4.3 临时对象的处理 199 9.6 状态对象的删除和销毁 199 第10章 内存分配方式和调试机制 202 10.1 M内存分配 202 10.1.1 内存分配函数 202 10.1.2 C++的new 和 delete操作符 204 10.2 调试手段 204 10.2.1 C运行库提供和支持的调试功能 204 10.2.2 MFC提供的调试手段 205 10.2.3 内存诊断 208 第11章 MFC下的文件类 210 11.1 文件操作的方法 210 11.2 MFC的文件类 210 11.2.1 CFile的结构 211 11.2.1.1 CFile定义的枚举类型 211 11.2.1.2 CFile的其他一些成员变量 212 11.2.1.3 CFile的成员函数 212 11.2.2 CFile的部分实现 213 11.2.3 CFile的派生类 215 第12章 对话框和对话框类CDialog 217 12.1 模式和无模式对话框 217 12.1.1 模式对话框 217 12.1.2 无模式对话框 218 12.2 对话框的MFC实现 219 12.2.1 CDialog的设计和实现 219 12.2.1.1 CDialog的成员变量 219 12.2.1.2 CDialog的成员函数: 219 12.2.2 MFC模式对话框的实现 220 12.2.2.1 MFC对话框过程 220 12.2.2.2 模式对话框窗口过程 221 12.2.2.3 使用原对话框窗口过程作消息的缺省处理 225 12.2.2.4 Dialog命令消息和控制通知消息的处理 226 12.2.2.5 消息预处理和Dialog消息 228 12.2.2.6 模式对话框的消息循环 229 12.2.3 对话框的数据交换 233 12.2.3.1 数据交换的方法 233 12.2.3.2 CDataExchange 234 12.2.3.3 数据交换和验证函数 236 12.2.3.4 UpdateData函数 239 12.3 无模式对话框 240 12.3.1 CScrollView 240 12.3.2 CFormView 242 12.3.2.1 CFormView的创建 243 12.3.2.2 CFormView的消息预处理 245 12.3.2.3 CFormView的输入焦点 247 第13章 MFC工具条和状态栏 248 13.1 Windows控制窗口 248 13.2 MFC的工具条和状态栏类 249 13.2.1 控制窗口的创建 251 13.2.1.1 PreCreateWindow 251 13.2.1.2 控制条的窗口创建 253 13.2.2 控制条的销毁 259 13.2.3 处理控制条的位置 259 13.2.3.1 计算控制条位置的过程和算法 259 13.2.3.2 CFrameWnd的虚拟函数RecalcLayout 260 13.2.3.3 CWnd的成员函数RepositionBars 262 13.2.4 工具条、状态栏和边框窗口的接口 265 13.2.4.1 应用程序在状态栏中显示信息 265 13.2.4.2 状态栏显示菜单项的提示信息 268 13.2.4.3 控制条的消息分发处理 270 13.2.4.4 Tooltip 275 13.2.4.5 禁止和允许 279 13.2.4.6 显示或者隐藏工具栏和状态栏 285 13.2.5 泊位和漂浮 286 第14章 SOCKET类的设计和实现 288 14.1 WinSock基本知识 288 14.1.1 WinSock API 288 14.1.2 Socket的使用 290 14.2 MFC对WinSockt API的封装 291 14.2.1 CAsyncSocket 291 14.2.2 socket对象的创建和捆绑 292 14.2.3 异步网络事件的处理 296 14.3 CSocket 297 14.4 CSocketFile 299
MFC 李进九的电子书籍 第1章 MFC概述 1 1.1 MFC是一个编程框架 1 1.1.1 封装 1 1.1.2 继承 2 1.1.3 虚拟函数和动态约束 2 1.1.4 MFC的宏观框架体系 2 1.2 MDI应用程序的构成 3 1.2.1 构成应用程序的对象 3 1.2.2 构成应用程序的对象之间的关系 5 1.2.3 构成应用程序的文件 5 第2章 MFC和Win32 9 2.1 MFC Object和Windows Object的关系 9 2.2 Windows Object 12 2.2.1 Windows的注册 12 2.2.2 MFC窗口类CWnd 15 2.2.3 在MFC下创建一个窗口对象 17 2.2.4 MFC窗口的使用 18 2.2.5 在MFC下窗口的销毁 19 2.3 设备描述表 20 2.3.1 设备描述表概述 20 2.3.2 设备描述表在MFC中的实现 22 2.3.3 MFC设备描述表类的使用 24 2.4 GDI对象 25 第3章 CObject类 28 3.1 CObject的结构 28 3.2 CObject类的特性 30 3.3 实现CObject特性的机制 32 3.3.1 DECLARE_DYNAMIC等宏的定义 32 3.3.2 CruntimeClass类的结构与功能 35 3.3.3 动态类信息、动态创建的原理 38 3.3.4 序列化的机制 39 第4章 消息映射的实现 42 4.1 Windows消息概述 42 4.1.1 消息的分类 42 4.1.2 消息结构和消息处理 42 4.2 消息映射的定义和实现 44 4.2.1 MFC处理的三类消息 44 4.2.2 MFC消息映射的实现方法 45 4.2.3 在声明与实现的内部 46 4.2.3.1 消息映射声明的解释 47 4.2.3.2 消息映射实现的解释 49 4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC窗口过程 55 4.4.1 MFC窗口过程的指定 56 4.4.2 对Windows消息的接收和处理 58 4.4.2.1 从窗口过程到消息映射 59 4.4.2.2 Windows消息的查找和匹配 60 4.4.2.3 Windows消息处理函数的调用 62 4.4.2.4 消息映射机制完成虚拟函数功能的原理 63 4.4.3 对命令消息的接收和处理 64 4.4.3.1 MFC标准命令消息的发送 64 4.4.3.2 命令消息的派发和消息的多次处理 67 4.4.3.3 一些消息处理类的OnCmdMsg的实现 69 4.4.3.4 一些消息处理类的OnCommand的实现 71 4.4.4 对控制通知消息的接收和处理 72 4.4.4.1 WM_COMMAND控制通知消息的处理 72 4.4.4.2 WM_NOTIFY消息及其处理: 73 4.4.4.3 消息反射 74 4.4.5 对更新命令的接收和处理 77 4.4.5.1 实现方法 77 4.4.5.2 状态更新命令消息 78 4.4.5.3 类CCmdUI 79 4.4.5.4 自动更新用户接口对象状态的机制 80 4.5 消息的预处理 82 4.6 MFC消息映射的回顾 83 第5章 MFC对象的创建 85 5.1 MFC对象的关系 85 5.1.1 创建关系 85 5.1.2 交互作用关系 86 5.2 MFC提供的接口 87 5.2.1 虚拟函数接口 87 5.2.2 消息映射方法和标准命令消息 91 5.3 MFC对象的创建过程 94 5.3.1 应用程序中典型对象的结构 94 5.3.1.1 应用程序类的成员变量 95 5.3.1.2 CDocument的成员变量 97 5.3.1.3 文档模板的属性 97 5.3.2 WinMain入口函数 99 5.3.2.1 WinMain流程 99 5.3.2.2 MFC空闲处理 101 5.3.3 SDI应用程序的对象创建 102 5.3.3.1 文档模板的创建 102 5.3.3.2 文件的创建或者打开 103 5.3.3.3 SDI边框窗口的创建 112 5.3.3.4 视的创建 115 5.3.3.5 窗口初始化 116 5.3.3.6 视的初始化 120 5.3.3.7 激活边框窗口(处理WM_ACTIVE) 121 5.3.3.8 SDI流程的回顾 122 5.3.4 MDI程序的对象创建 123 5.3.4.1 有别于SDI的主窗口加载过程 124 5.3.4.2 MDI子窗口、视、文档的创建 125 5.3.4.3 MDI子窗口的初始化和窗口的激活 127 第6章 应用程序的退出 131 6.1 边框窗口对WM_CLOSE的处理 131 6.2 窗口的销毁过程 135 6.2.1 DestroyWindow 135 6.2.2 处理WM_DESTROY消息 136 6.2.3 处理WM_NCDESTROY消息 136 6.3 SDI窗口、MDI主、子窗口的关闭 137 第7章 MFC的DLL 139 7.1 DLL的背景知识 139 7.2 调用约定 141 7.2.1 MFC的DLL应用程序的类型 142 7.3 DLL的几点说明 143 7.4 输出函数的方法 145 第8章 MFC的进程和线程 148 8.1 Win32的进程和线程概念 148 8.2 Win32的进程处理简介 148 8.2.1 进程的创建 148 8.2.2 进程的终止 149 8.3 Win32的线程 150 8.3.1 线程的创建 150 8.3.2 线程的终止 150 8.3.3 线程局部存储 151 8.4 线程同步 152 8.4.1 同步对象 152 8.4.2 等待函数 153 8.5 MFC的线程处理 154 8.5.1 创建用户界面线程 155 8.5.2 创建工作者线程 155 8.5.3 AfxBeginThread 155 8.5.4 CreateThread和_AfxThreadEntry 157 8.5.5 线程的结束 160 8.5.6 实现线程的消息循环 161 第9章 MFC的状态 163 9.1 模块状态 163 9.2 模块、进程和线程状态的数据结构 164 9.2.1 层次关系 164 9.2.2 CNoTrackObject类 166 9.2.3 AFX_MODULE_STATE类 166 9.2.4 _AFX_BASE_MODULE_STATE 169 9.2.5 _AFX_THREAD_STATE 169 9.2.6 AFX_MODULE_THREAD_STATE 171 9.3 线程局部存储机制和状态的实现 172 9.3.1 CThreadSlotData和_afxThreadData 173 9.3.1.1 CThreadSlotData的定义 173 9.3.1.2 CThreadSlotData的一些数据成员 174 9.3.1.3 _afxThreadData 175 9.3.2 线程状态_afxThreadState 176 9.3.3 进程模块状态afxBaseModuleState 178 9.3.4 状态对象的创建 180 9.3.4.1 状态对象的创建过程 180 9.3.4.2 创建过程所涉及的几个重要函数的算法 183 9.4 管理状态 184 9.4.1 模块状态切换 184 9.4.2 扩展DLL的模块状态 186 9.4.2.1 _AFX_EXTENSION_MODULE 187 9.4.2.2 扩展DLL的初始化函数 188 9.4.3 核心MFC DLL 190 9.4.4 动态链接的规则DLL的模块状态的实现 190 9.5 状态信息的作用 192 9.5.1.1 模块信息的保存和管理 192 9.5.2 MFC资源、运行类信息的查找 193 9.5.3 模块信息的显示 194 9.5.4 模块-线程状态的作用 196 9.5.4.1 只能访问本线程MFC对象的原因 196 9.5.4.2 实现MFC对象和Windows对象之间的映射 196 9.5.4.3 临时对象的处理 199 9.6 状态对象的删除和销毁 199 第10章 内存分配方式和调试机制 202 10.1 M内存分配 202 10.1.1 内存分配函数 202 10.1.2 C++的new 和 delete操作符 204 10.2 调试手段 204 10.2.1 C运行库提供和支持的调试功能 204 10.2.2 MFC提供的调试手段 205 10.2.3 内存诊断 208 第11章 MFC下的文件类 210 11.1 文件操作的方法 210 11.2 MFC的文件类 210 11.2.1 CFile的结构 211 11.2.1.1 CFile定义的枚举类型 211 11.2.1.2 CFile的其他一些成员变量 212 11.2.1.3 CFile的成员函数 212 11.2.2 CFile的部分实现 213 11.2.3 CFile的派生类 215 第12章 对话框和对话框类CDialog 217 12.1 模式和无模式对话框 217 12.1.1 模式对话框 217 12.1.2 无模式对话框 218 12.2 对话框的MFC实现 219 12.2.1 CDialog的设计和实现 219 12.2.1.1 CDialog的成员变量 219 12.2.1.2 CDialog的成员函数: 219 12.2.2 MFC模式对话框的实现 220 12.2.2.1 MFC对话框过程 220 12.2.2.2 模式对话框窗口过程 221 12.2.2.3 使用原对话框窗口过程作消息的缺省处理 225 12.2.2.4 Dialog命令消息和控制通知消息的处理 226 12.2.2.5 消息预处理和Dialog消息 228 12.2.2.6 模式对话框的消息循环 229 12.2.3 对话框的数据交换 233 12.2.3.1 数据交换的方法 233 12.2.3.2 CDataExchange 234 12.2.3.3 数据交换和验证函数 236 12.2.3.4 UpdateData函数 239 12.3 无模式对话框 240 12.3.1 CScrollView 240 12.3.2 CFormView 242 12.3.2.1 CFormView的创建 243 12.3.2.2 CFormView的消息预处理 245 12.3.2.3 CFormView的输入焦点 247 第13章 MFC工具条和状态栏 248 13.1 Windows控制窗口 248 13.2 MFC的工具条和状态栏类 249 13.2.1 控制窗口的创建 251 13.2.1.1 PreCreateWindow 251 13.2.1.2 控制条的窗口创建 253 13.2.2 控制条的销毁 259 13.2.3 处理控制条的位置 259 13.2.3.1 计算控制条位置的过程和算法 259 13.2.3.2 CFrameWnd的虚拟函数RecalcLayout 260 13.2.3.3 CWnd的成员函数RepositionBars 262 13.2.4 工具条、状态栏和边框窗口的接口 265 13.2.4.1 应用程序在状态栏中显示信息 265 13.2.4.2 状态栏显示菜单项的提示信息 268 13.2.4.3 控制条的消息分发处理 270 13.2.4.4 Tooltip 275 13.2.4.5 禁止和允许 279 13.2.4.6 显示或者隐藏工具栏和状态栏 285 13.2.5 泊位和漂浮 286 第14章 SOCKET类的设计和实现 288 14.1 WinSock基本知识 288 14.1.1 WinSock API 288 14.1.2 Socket的使用 290 14.2 MFC对WinSockt API的封装 291 14.2.1 CAsyncSocket 291 14.2.2 socket对象的创建和捆绑 292 14.2.3 异步网络事件的处理 296 14.3 CSocket 297 14.4 CSocketFile 299
第一部分 Visual C++ 2010开发与新特性 第1章 Visual C++ 2010开发环境简介 1 1.1 Visual C++ 2010简介 1 1.2 Visual C++ 2010下载安装指南 1 1.3 Visual C++ 2010主要特点与新特性 3 1.4 Visual C++ 2010开发环境操作指南 6 1.4.1 创建Visual C++应用程序 6 1.4.2 Visual C++ 2010菜单介绍 9 1.5 Visual C++ 2010 MFC简介 12 1.6 Visual C++ 2010 clr简介 13 1.7 Visual C++ 2010 64位编程 14 1.8 支持新的C++语言标准 14 1.8.1 支持新的C++语言标准(C++ 0x) 14 1.8.2 Lambda表达式 15 1.8.3 静态断言static_assert 17 1.8.4 auto关键字 18 1.8.5 右值引用 19 1.8.6 安全数据类型 22 1.8.7 移动构造 23 1.9 支持开发并行程序 26 1.9.1 运行库支持native代码 26 1.9.2 调试和分析工具 29 1.10 对MFC的增强 31 1.10.1 任务对话框CTaskDialog 31 1.10.2 重启管理器(Restart Manager)支持 33 1.10.3 支持新的用户界面风格 34 第2章 MFC应用程序框架 37 2.1 用MFC向导生成应用程序 37 2.1.1 生成的程序框架 37 2.1.2 生成的应用程序类型 43 2.1.3 向导生成工程文件简介 46 2.2 应用程序框架分析 46 2.2.1 框架简介 47 2.2.2 MFC应用程序运行流程 50 2.2.3 应用程序窗口 51 2.2.4 消息机制与消息循环 59 2.3 文档与视图 65 2.3.1 文档类结构分析 65 2.3.2 视图类结构分析 65 2.3.3 文档与视图的关系 67 2.3.4 sdi应用程序分析 69 2.3.5 mdi应用程序分析 69 2.4 工具栏与状态栏 69 2.4.1 工具栏 70 2.4.2 状态栏 78 2.5 MFC新功能——Office 2007风格程序分析 85 2.6 MFC新功能——Visual Studio风格程序分析 90 2.7 MFC新功能——Windows资源管理器风格程序分析 98 2.8 应用程序框架类对象分析 100 2.8.1 视图类对文档类的调用 100 2.8.2 在框架类中获得当前的文档类和视图类对象指针 101 2.8.3 获得应用程序类对象的指针 101 2.8.4 从应用类对象中获得主框架类对象的指针 101 2.9 小结 102 第3章 Visual C++ 2010 MFC菜单编程 103 3.1 菜单编程 103 3.1.1 创建菜单 104 3.1.2 创建菜单热键 115 3.1.3 标记菜单 115 3.1.4 给菜单加入图标 119 3.1.5 禁用菜单 121 3.1.6 移除与加载菜单 127 3.2 菜单消息的传输机制 129 3.2.1 菜单消息的分类 129 3.2.2 菜单消息的传输路由 129 3.3 动态菜单操作 131 3.3.1 添加菜单 131 3.3.2 插入菜单 133 3.3.3 删除菜单 135 3.3.4 插入菜单的命令响应 136 3.3.5 修改菜单 137 3.4 小结 140 第4章 Visual C++ 2010 MFC对话框编程 141 4.1 对话框简介 141 4.1.1 对话框的控件简介 141 4.1.2 对话框的种类简介 149 4.1.3 设计对话框 150 4.2 创建与销毁对话框 153 4.2.1 模态对话框 153 4.2.2 非模式对话框 159 4.2.3 属性页对话框 163 4.3 消息对话框 173 4.4 通用对话框 175 4.4.1 文件打开对话框 176 4.4.2 文件保存对话框 178 4.4.3 颜色对话框 179 4.4.4 字体对话框 181 4.4.5 查找对话框 183 4.4.6 页面设置对话框 185 4.4.7 打印对话框 186 4.5 小结 187 第5章 Visual C++ 2010 MFC对话框控件 188 5.1 Visual C++ 2010 Button控件简介与开发 191 5.2 Visual C++ 2010 List Box控件简介与开发 193 5.3 Visual C++ 2010 Com boBox控件简介与开发 195 5.3.1 创建扩展组合框控件 196 5.3.2 在扩展组合框控件中使用 5.3.2 图像列表 197 5.3.3 设置各项的图像 197 5.3.4 处理扩展组合框控件中的通知消息 198 5.4 Visual C++ 2010 List控件简介与开发 198 5.4.1 列表控件和列表视图 199 5.4.2 列表项和图像列表 199 5.4.3 回调项和回调屏蔽 200 5.4.4 创建列表控件 200 5.4.5 创建图像列表 201 5.4.6 向控件添加列(报表视图) 204 5.4.7 向控件添加项 205 5.4.8 在列表控件中滚动、排列、排序和查找 205 5.4.9 在列表控件中实现工作区 205 5.4.10 处理列表控件中的通知消息 206 5.4.11 更改列表控件样式 206 5.4.12 虚拟列表控件 207 5.4.13 列表控件的消息映射 209 5.4.14 列表控件的风格选项及表头设置 210 5.4.15 销毁列表控件 210 5.5 Visual C++ 2010 Edit控件简介与开发 211 5.6 Visual C++ 2010 Rich Edit控件简介与开发 213 5.6.1 Rich Edit控件中的字符格式 215 5.6.2 Rich Edit控件中的段落格式 215 5.6.3 Rich Edit控件中的当前选定内容 215 5.6.4 Rich Edit控件中的分词 216 5.6.5 Rich Edit控件中的剪贴板操作 216 5.6.6 Rich Edit控件中的流操作 216 5.6.7 Rich Edit控件中的打印操作 216 5.6.8 无底的Rich Edit控件 217 5.6.9 来自Rich Edit控件的通知 217 5.7 Visual C++ 2010 Progress控件简介与开发 219 5.7.1 进度控件的样式 219 5.7.2 进度控件的设置 219 5.7.3 操作进度控件 220 5.8 Visual C++ 2010 Tree控件简介与开发 220 5.8.1 树控件样式 221 5.8.2 树控件父项和子项 221 5.8.3 树控件项位置 222 5.8.4 树控件项标签 222 5.8.5 树控件标签编辑 223 5.8.6 树控件项的状态 223 5.8.7 树控件图像列表 224 5.8.8 树控件项选择 224 5.8.9 树控件拖放操作 224 5.8.10 树控件项信息 225 5.8.11 树控件通知消息 225 5.9 Visual C++ 2010 DBgrid控件简介与开发 226 5.9.1 示例程序1 226 5.9.2 示例程序2 227 5.10 Visual C++ 2010 Rebar控件简介与开发 228 5.10.1 在Rebar控件中使用图像列表 230 5.10.2 在Rebar控件中使用对话栏 231 5.10.3 处理Rebar控件中的通知消息 231 5.11 Visual C++ 2010 Timer控件简介与开发 232 5.12 Visual C++ 2010 Tab控件简介与开发 234 5.12.1 选项卡和选项卡控件属性 235 5.12.2 选项卡控件的使用方法 235 5.12.3 创建选项卡控件的方法 235 5.12.4 处理选项卡控件通知消息 236 5.12.5 ctabctrl类简介 236 5.13 Visual C++ 2010 IP控件简介与开发 241 5.14 Visual C++ 2010 Picture控件简介与开发 241 5.15 Visual C++ 2010 Slider控件简介与开发 244 5.15.1 滑块控件样式 244 5.15.2 滑块控件成员函数 245 5.15.3 滑块控件通知消息 246 5.16 Visual C++ 2010 Scroll Bar控件简介与开发 246 5.17 Visual C++ 2010 Hot Key控件简介与开发 248 5.17.1 使用热键控件 248 5.17.2 设置热键 249 5.18 Visual C++ 2010 Animation控件简介与开发 249 5.18.1 使用动画控件 249 5.18.2 动画控件发送的通知 250 5.19 Visual C++ 2010 Spin控件简介与开发 250 5.19.1 数值调节钮的样式 250 5.19.2 数值调节钮成员函数 251 5.20 Visual C++ 2010 GroupBox控件简介与开发 251 5.21 Visual C++ 2010 Data Time Picker控件简介与开发 252 5.21.1 创建日期和时间选择器控件 253 5.21.2 访问嵌入的月历控件 253 5.21.3 在日期和时间选择器控件中使用自定义格式字符串 254 5.21.4 在日期和时间选择器控件中使用回调字段 254 5.21.5 处理日期和时间选择器控件中的通知消息 256 5.22 Visual C++ 2010 Month Canlendar控件简介与开发 256 5.22.1 创建月历控件 257 5.22.2 处理月历控件中的通知消息 257 5.22.3 设置月历控件的日状态 257 5.23 Visual C++ 2010 Custom控件简介与开发 258 5.23.1 使用MFC方法定制控件必备的几个基本概念 259 5.23.2 定制自定义控件的3种常见方法 260 5.24 Visual C++ 2010 SysLink控件简介与开发 260 5.25 Visual C++ 2010 Split Button控件简介与开发 261 5.26 Visual C++ 2010 Network Address控件简介与开发 262 5.27 Visual C++ 2010 Check Box控件简介与开发 262 5.28 Visual C++ 2010 Radio Button控件简介与开发 264 5.28.1 为单选按钮控件分组 264 5.28.2 获得被选中的单选按钮的文本 264 5.29 Visual C++ 2010 Mediaplayer控件简介与开发 265 5.30 小结 266 第二部分 Visual C++ 2010下MFC开发 第6章 计算机测控系统概述 267 6.1 Visual C++ 2010 SDI开发简介 267 6.1.1 建立应用程序基本框架 267 6.1.2 处理视图 267 6.1.3 处理文档 271 6.1.4 串行化处理 274 6.1.5 sdi应用程序编程思路 275 6.2 Visual C++ 2010 MDI开发简介 277 6.2.1 多文档接口 277 6.2.2 生成程序 278 6.2.3 程序类、文件和代码 279 6.2.4 自定义资源 281 6.3 Visual C++ 2010 View开发 282 6.3.1 生成源文件 283 6.3.2 初始化视图类数据成员 283 6.3.3 加入消息处理功能 285 6.3.4 设计程序资源 290 6.3.5 定制miniDraw窗口 292 6.3.6 程序清单 293 6.4 Visual C++ 2010 EditView开发 298 6.4.1 生成MiniEdit程序 299 6.4.2 修改程序菜单 300 6.4.3 编辑加速键 301 6.4.4 程序清单 303 6.5 Visual C++ 2010 FormView开发 306 6.5.1 自定义FormDemo程序 307 6.5.2 程序清单 314 6.6 Visual C++ 2010 ScrollView开发 319 6.6.1 加入滚动功能 319 6.6.2 坐标换算 319 6.6.3 限制图形大小 322 6.6.4 改变鼠标光标 325 6.7 Visual C++ 2010 HtmlEditView开发 328 6.8 Visual C++ 2010 HtmlView开发 331 6.9 Visual C++ 2010 ListView开发 335 6.10 Visual C++ 2010 RichEditView开发 335 6.11 VisualC++ 2010 TreeView开发 336 6.12 Visual C++ 2010 Office 2007风格文档视图开发框架 337 6.13 Visual C++ 2010 Visual Studio 2008风格文档视图开发框架 342 6.14 Visual C++ 2010 Windows资源管理器风格文档视图开发框架 346 6.15 小结 350 第7章 Visual C++ 2010 MFC应用程序界面与美化 351 7.1 应用程序窗口风格美化 351 7.1.1 借助ActiveSkin美化窗口 351 7.1.2 修改窗口外观 352 7.2 应用程序窗口图标与背景修改 359 7.2.1 修改窗口图标 359 7.2.2 修改背景 360 7.3 工具栏编程与美化 365 7.3.1 创建工具栏 365 7.3.2 在工具栏中添加、删除按钮 366 7.3.3 从对话框创建工具栏 368 7.4 状态栏编程与美化 370 7.4.1 创建状态栏 370 7.4.2 在状态栏中插入进度条 370 7.5 鼠标光标编程 371 7.5.1 鼠标光标编程步骤 371 7.5.2 鼠标的消息处理机制 373 7.5.3 示例 374 7.6 创建启动界面 376 7.7 创建特效窗口启动应用程序 378 7.8 创建特效窗口关闭应用程序 378 7.9 小结 383 第8章 Visual C++ 2010 MFC文本与字体 384 8.1 CFont字体类简介 384 8.1.1 CFont字体类成员介绍 384 8.1.2 CFont字体类初始化函数 385 8.1.3 其他成员介绍 390 8.2 创建文本插入符与图片插入符 391 8.2.1 创建文本插入符 391 8.2.2 创建图片插入符 394 8.2.3 创建随鼠标移动的插入符 396 8.3 输出文字与字体格式 397 8.3.1 输出固定文字 397 8.3.2 设定输出字体的格式 398 8.3.3 字符输入 399 8.4 输出彩色文字与变色文字 404 8.4.1 DrawText()函数和字符串资源 404 8.4.2 定时器和变色文字 408 8.5 小结 410 第9章 Visual C++ 2010 MFC图形图像编程 411 9.1 Windows绘图简介 411 9.1.1 设备描述表 411 9.1.2 绘图属性 412 9.1.3 元文件和路径 412 9.1.4 颜色和调色板 412 9.1.5 图形设备接口函数 413 9.2 Windows屏幕绘图简介 414 9.2.1 窗口客户区 414 9.2.2 映射模式 414 9.2.3 图形刷新 416 9.3 微软GDI绘图简介 416 9.3.1 GDI基础 416 9.3.2 GDI结构 417 9.3.3 GDI函数调用 417 9.3.4 GDI基本图形 418 9.4 GDI笔绘图 419 9.4.1 CPen类简介 419 9.4.2 使用GDI绘制线条 419 9.4.3 使用CPen类绘制指定的线条 422 9.4.4 绘制连续的线条 424 9.5 GDI画刷绘图 425 9.5.1 CBrush类介绍 426 9.5.2 CBrush类简单画刷的实现 429 9.5.3 CBrush类位图画刷的实现 430 9.5.4 透明画刷的实现 431 9.6 小结 433 第10章 Visual C++ 2010 MFC动态函数链接库 434 10.1 动态函数链接库简介 434 10.1.1 什么是动态函数链接库 434 10.1.2 动态函数链接库的优点 435 10.1.3 动态函数链接库的起源 436 10.1.4 动态函数链接库的原理 436 10.2 调用动态函数链接库 436 10.2.1 静态链接 436 10.2.2 动态链接 438 10.3 Dll的框架简介 439 10.3.1 DllMain()函数简介 439 10.3.2 Dll的导出函数 439 10.4 创建MFC Dll范例 440 10.4.1 建立MFC Dll工程 440 10.4.2 添加实现代码 442 10.4.3 编译并调用 443 10.5 创建Win32 Dll范例 443 10.5.1 建立Win32工程 443 10.5.2 添加动态链接库代码 444 10.5.3 编译工程 444 10.6 创建资源Dll范例 445 10.6.1 建立MFC Application工程 445 10.6.2 建立中文资源Dll 445 10.6.3 加载资源Dll 446 10.7 hook技术 446 10.7.1 hook函数类型 446 10.7.2 使用hook函数 449 10.7.3 hook鼠标 449 10.7.4 hook键盘 450 10.8 小结 452 第11章 Visual C++ 2010 MFC Activex控件 454 11.1 Activex控件简介 454 11.2 Activex控件测试与注册 455 11.2.1 Activex控件的测试 455 11.2.2 Activex控件的注册 457 11.3 MFC Activex控件向导 458 11.4 Activex控件属性开发 458 11.4.1 添加常用属性 459 11.4.2 添加自定义属性 460 11.4.3 高级属性实现 460 11.4.4 访问环境属性 461 11.5 Activex控件事件开发 461 11.5.1 添加常用事件 462 11.5.2 添加自定义事件 463 11.6 Activex控件方法开发 464 11.6.1 添加常用方法 465 11.6.2 添加自定义方法 465 11.6.3 从方法返回错误代码 466 11.7 完整Activex控件范例 467 11.7.1 创建工程 467 11.7.2 clock控件的实现 469 11.7.3 添加常用属性 470 11.7.4 添加自定义属性 473 11.7.5 添加方法 474 11.7.6 添加常用事件 475 11.7.7 添加自定义事件 476 11.8 调用Activex控件 477 11.9 小结 478 第12章 Visual C++ 2010 MFC文件与注册表操作 479 12.1 文本操作串行化 479 12.1.1 文档类serialize()函数 479 12.1.2 CArchive对文件进行读写 482 12.1.3 文档操作串行化代码分析 485 12.2 CFile类 492 12.2.1 打开文件操作 493 12.2.2 读写文件操作 494 12.2.3 定位文件操作 496 12.2.4 关闭文件操作 497 12.2.5 异常操作 497 12.2.6 文件管理操作 498 12.3 .ini文件读写操作 500 12.4 注册表读写操作 502 12.4.1 注册表简介 502 12.4.2 注册表API 504 12.4.3 访问并修改注册表 507 12.5 小结 509 第13章 Visual C++ 2010 MFC数据库开发 510 13.1 数据库基本知识 510 13.2 SQL语言的基础知识 511 13.3 ODBC访问数据库 512 13.3.1 注册ODBC数据库 512 13.3.2 创建一个MFC的ODBC程序 514 13.3.3 程序结构分析 515 13.3.4 在视图上显示数据库查询结果 520 13.3.5 对查询结果排序及设置查询条件 524 13.3.6 动态设置查询条件并更新查询结果 527 13.4 ODBC更新数据库 532 13.5 ODBC访问SQL server 540 13.6 ado数据库访问 543 13.6.1 ado数据库访问概述 543 13.6.2 在Visual C++中使用ado编程 546 13.7 ado访问SQL server数据库 556 13.8 小结 556 第14章 Visual C++2010 MFC多线程程序设计 557 14.1 进程和多线程的概念 557 14.2 线程的创建 558 14.2.1 创建工作者线程 558 14.2.2 创建用户界面线程 559 14.3 线程的终止 560 14.4 设置线程的优先级 562 14.5 暂停及重新启动线程 563 14.6 线程间的通信 571 14.7 线程的同步 572 14.7.1 临界区 572 14.7.2 互斥量 573 14.7.3 事件 573 14.7.4 信号量 574 14.8 小结 579 第15章 Visual C++ 2010 MFC网络程序设计 580 15.1 计算机网络的基础知识 580 15.1.1 TCP/IP协议模型 580 15.1.2 ip地址 582 15.1.3 端口 582 15.1.4 数据封装 582 15.2 Winsock简介 583 15.3 MFC对Windows Sockets的支持 583 15.3.1 Socket的定义 584 15.3.2 casyncSocket类介绍 584 15.3.3 cSocket类介绍 592 15.4 一个基于udp的聊天室示例 593 15.4.1 MFC对Windows Sockets的初始化 593 15.4.2 服务器端的实现 595 15.4.3 客户端的实现 599 15.5 一个基于TCP的聊天室示例 605 15.5.1 服务器端的实现 606 15.5.2 客户端的实现 609 15.6 小结 612 第16章 Visual C++ 2010 MFC进程通信 613 16.1 剪贴板通信 613 16.1.1 Openclipboard()函数 613 16.1.2 Closeclipboard()函数 614 16.1.3 emptyclipboard()函数 614 16.1.4 Setclipboarddata()函数 614 16.1.5 globalalloc()函数 615 16.1.6 globallock()函数 616 16.1.7 globalunlock()函数 616 16.1.8 Getclipboarddata()函数 616 16.1.9 一个利用剪贴板在不同进程之间交换数据的示例 616 16.2 邮槽通信 619 16.2.1 Createmailslot()函数 619 16.2.2 Getmailslotinfo()函数 620 16.2.3 Setmailslotinfo()函数 621 16.2.4 ReadFile()函数 621 16.2.5 GetFiletime()函数和SetFiletime()函数 621 16.2.6 CreateFile()函数 622 16.2.7 WriteFile()函数 623 16.2.8 Closehandle()函数 623 16.2.9 一个利用邮槽在不同进程间通信的示例 623 16.3 匿名管道通信 628 16.3.1 Createpipe()函数 628 16.3.2 Createprocess()函数 629 16.3.3 Getstdhandle()函数 631 16.3.4 ReadFile()和WriteFile()函数 632 16.3.5 一个利用匿名管道在父子进程间通信的示例 632 16.4 命名管道通信 637 16.4.1 Createnamedpipe()函数 637 16.4.2 connectnamedpipe()函数 639 16.4.3 disconnectnamedpipe()函数 640 16.4.4 waitnamedpipe()函数 640 16.4.5 利用命名管道通信的基本流程 640 16.4.6 一个利用命名管道在不同进程间通信的示例 641 16.5 共享内存通信 647 16.5.1 CreateFilemApping()函数 647 16.5.2 mapViewofFile()函数 648 16.5.3 unmapViewofFile()函数 649 16.5.4 OpenFilemApping()函数 649 16.5.5 利用共享内存通信的基本流程 649 16.5.6 一个利用共享内存在不同进程间通信的示例 650 16.6 小结 655 第三部分 Visual C++ 2010下MFC与clr进行开发 第17章 Visual C++ 2010 clr开发基础 656 17.1 什么是.net 656 17.2 .net框架 656 17.3 公共语言运行时(clr) 657 17.3.1 托管代码 659 17.3.2 代码验证 659 17.3.3 代码访问验证 659 17.3.4 垃圾回收 659 17.3.5 语言的互操作性 660 17.3.6 实时编译(jit) 660 17.4 通用类型系统(cts) 661 17.5 通用语言规范(cls) 663 17.6 程序集 664 17.6.1 元数据 664 17.6.2 程序集版本管理 665 17.6.3 微软中间语言(msil) 665 17.6.4 资源 666 17.7 .net开发应用程序的范畴 666 17.8 .net框架类库 667 17.9 C++/clr开发语法简介 668 17.10 小结 670 第18章 Visual C++ 2010 clr Windows窗口编程 671 18.1 创建Windows应用程序 671 18.2 类层次结构 677 18.3 control类 677 18.3.1 大小与位置 678 18.3.2 外观 679 18.3.3 用户交互操作 679 18.3.4 Windows功能 680 18.4 标准Windows控件使用指南 681 18.4.1 Button控件 681 18.4.2 checkBox控件 681 18.4.3 radioButton控件 682 18.4.4 comboBox控件、ListBox控件和checkedListBox控件 682 18.4.5 datetimepicker控件 684 18.4.6 errorprovider组件 685 18.4.7 helpprovider组件 686 18.4.8 imageList组件 686 18.4.9 label控件 686 18.4.10 ListView控件 687 18.4.11 pictureBox控件 688 18.4.12 progressbar控件 689 18.4.13 TextBox控件、RichTextBox控件与maskedTextBox 18.4.13 控件 689 18.4.14 panel控件 690 18.4.15 flowlayoutpanel控件和tablelayoutpanel控件 690 18.4.16 splitcontainer控件 691 18.4.17 tabcontrol控件和tabpage控件 691 18.4.18 toolstrip控件 692 18.4.19 menustrip控件 694 18.4.20 conTextmenustrip控件 694 18.4.21 toolstripmenuitem控件 694 18.4.22 toolstripmanager类 695 18.4.23 toolstripcontainer控件 695 18.5 窗体Winform 695 18.5.1 form类 695 18.5.2 多文档界面 700 18.5.3 定制控件 700 18.6 小结 707 第19章 Visual C++ 2010 MFC与.net交互编程 708 19.1 编写托管扩展应用程序 708 19.2 编写访问.net的MFC程序 709 19.3 混合模式编程问题 711 19.4 运用.net类型 713 19.4.1 定义和使用托管类型 713 19.4.2 将非托管对象作为托管类的成员 715 19.4.3 装箱和拆箱 716 19.4.4 指针 717 19.4.5 在非托管代码中使用托管数组 719 19.5 小结 720 第四部分 发布Visual C++ 2010程序 第20章 Visual C++ 2010应用程序部署 721 20.1 Windows installer介绍 722 20.2 一个简单的Windows应用程序 723 20.3 使用安装向导快速创建安装包 726 20.4 手动创建安装程序 728 20.5 使用安装编辑器 731 20.5.1 File system(文件系统编辑器) 731 20.5.2 registry编辑器 732 20.5.3 File types编辑器 733 20.5.4 user interface编辑器 734 20.5.5 custom actions编辑器 735 20.5.6 launch conditions编辑器 736 20.6 小结 736 第五部分 基于Windows 7平台用Visual C++ 2010开发 第21章 Visual C++ 2010基于Windows 7新特性开发 737 21.1 实现C++兼容开发 737 21.1.1 实现uac数据重定向 737 21.1.2 实现高dpi 741 21.1.3 实现安装程序检测 742 21.1.4 会话0隔离 743 21.1.5 用户界面特权隔离(uipi) 746 21.1.6 版本检查 748 21.2 Windows 7系统专题 750 21.2.1 实现超级任务栏 750 21.2.2 实现shell库 759 21.2.3 实现后台服务 762 21.2.4 开发基于Windows 7的 21.1.5 设备与性能应用 763 21.3 开发基于Windows 7的新特性 769 21.3.1 实现多点触摸 769 21.3.2 实现获取传感器与位置 771 21.3.3 实现Windows 7 ribbon界面开发 774 21.3.4 基于Visual C++ 2010开发基于Windows 7的语音识别与语音合成 776 21.3.5 基于Visual C++ 2010与Windows sdk for Windows 7开发Windows 7平台的tablet pc应用 787 21.3.6 开发Windows 7的安全体验cryptoAPI加密 804

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧