1.3  实现超链接

在网络应用过程中,特别是在Web程序中,超级链接用得非常普遍。其实使用VC技术,也可以实现超级链接功能。在本节的内容中,将介绍使用Visual C++ 6.0开发一个实现超级链接功能的应用程序。在开始之前,首先简单介绍与之相关的基础知识。

1.3.1  数据报套接字编程

流式套接字主要用于TCP协议,接下来将要学的数据报套接字主要用于UDP协议。数据报套接字(Datagram Socket)提供双向的通信,但没有可靠/有序/不重复的保证,所以UDP传送数据可能会收到无次序、重复的信息,甚至信息在传输过程中出现遗漏,但是传输效率较高,在网络上仍然有很多应用。

数据报套接字的编程模型如图1-15所示。

与流式套接字编程的主要区别在于,在数据传输过程中使用的是sendto()及recvfrom()这两个函数。其中sendto()函数的结构如下:

  1. int sendto(
  2. SOCKET s,
  3. const char FAR *buf,
  4. int len,
  5. int flags,
  6. const struct sockaddr FAR *to,
  7. int tolen
  8. );
 
(点击查看大图)图1-15  数据报套接字编程模型

recvfrom()函数的结构如下:

  1. int recvfrom(
  2. SOCKET s,
  3. char FAR *buf,
  4. int len,
  5. int flags,
  6. struct sockaddr FAR *from,
  7. int FAR *fromlen
  8. );

1.3.2  开发准备

在具体实现本实例之前,需要掌握一些与本实例有关的基础知识。

1. 超链接

超链接在本质上属于一个网页的一部分,它是一种允许我们同其他网页或站点之间进行连接的元素。各个网页链接在一起后,才能真正构成一个网站。所谓的超链接是指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页,也可以是相同网页上的不同位置,还可以是一个图片,一个电子邮件地址,一个文件,甚至是一个应用程序。而在一个网页中用来超链接的对象,可以是一段文本或者是一个图片。当浏览者单击已经链接的文字或图片后,链接目标将显示在浏览器上,并且根据目标的类型来打开或运行。

2. CStatic类

CStatic类是一个静态文本框类,此类提供了一个Windows静态控件的性能。一个静态控件用来显示一个文本字符串、框、矩形、图标、光标、位图,或增强的图元文件。它可以被用来作为标签、框,或用来分隔其他的控件。创建一个静态控件分两步。首先,调用构造函数来构造此CStatic对象,然后调用Create成员函数来创建此静态控件并将它与该CStatic对象连接。如果你是在一个对话框中创建了一个静态控件(通过一个对话框资源),则当用户关闭这个对话框时,此CStatic对象被自动销毁。如果你是在一个窗口中创建了一个CStatic对象,则必须由你来销毁它。在一个窗口的堆栈中创建的CStatic对象将自动被销毁。如果你是使用new函数在堆中创建CStatic对象,则当你使用完后,必须调用delete来销毁这个CStatic对象。

在CStatic类中,最常用的成员函数是Create,其定义格式如下:

  1. BOOL Create(LPCTSTR lpszText, DWORD dwStyle, const RECT &rect,
  2. CWnd *pParentWnd, UINT nID = 0xffff);

lpszText:指定要放置在控件中的文本。若为NULL,则表示没有文本是可见的。

dwStyle:指定静态控件的窗口风格。任何静态控件风格的组合都可用于该控件。

rect:指定静态控件的位置和大小。可以是一个RECT结构或一个CRect对象。

pParentWnd:指定CStatic父窗口,通常是一个CDialog对象,不能是NULL。

nID:指定静态控件的控件ID。

CStatic类中其他成员函数的具体说明如表1-5所示。

表1-5  CStatic类成员函数

函数名称

功能描述

SetBitmap

指定要在此静态控件中显示的位图

GetBitmap

获取先前用SetBitmap设置的位图的句柄

SetIcon

指定一个要在此静态控件中显示的图标

GetIcon

获取先前用SetIcon设置的图标的句柄

SetCursor

指定要显示在此静态控件中的光标图像

GetCursor

获取先前用SetCursor设置的光标图像的句柄

SetEnhMetaFile

指定要显示在此静态控件中的增强的图元文件

GetEnhMetaFile

获取先前用SetEnhMetaFile设置的增强图元文件的句柄

1.3.3  小试牛刀--编程实现写邮件超级链接(1)

实例功能 编程实现写邮件超级链接

源码路径 光盘\yuanma\1\Link

本实例的目的是,使用Visual C++ 6.0开发一个实现写邮件超级链接的应用程序。

1. 设计MFC窗体

使用Visual C++ 6.0创建一个MFC项目后,根据本实例的需要设计一个窗体,命名为IDD_ HLSAMPLE_DIALOG,如图1-16所示。

 
图1-16  创建的窗体

2. 具体编码

设计好窗体之后,接下来开始讲解具体的编码过程。

(1) 在文件HyperLink.h中定义继承于类CStatic的类CHyperLink,并设置与超链接相关的样式变量,例如鼠标形状、是否访问过等。具体代码如下:

  1. class CHyperLink : public CStatic
  2. {
  3. public:
  4. CHyperLink();
  5. virtual ~CHyperLink();
  6. // 属性
  7. public:
  8. public:
  9. //设定URL
  10. void SetURL(CString strURL);
  11. CString GetURL() const;
  12. //设定颜色
  13. void SetColours(COLORREF crLinkColour, COLORREF crVisitedColour,
  14. COLORREF crHoverColour=-1);
  15. //获得连接颜色
  16. COLORREF GetLinkColour() const;
  17. //获得被访问后的颜色
  18. COLORREF GetVisitedColour() const;
  19. //获得鼠标移动上以后的颜色
  20. COLORREF GetHoverColour() const;
  21. //设定是否被访问过
  22. void SetVisited(BOOL bVisited=TRUE);
  23. //获得是否被访问过
  24. BOOL GetVisited() const;
  25. //设定鼠标形状
  26. void SetLinkCursor(HCURSOR hCursor);
  27. //获得鼠标形状
  28. HCURSOR GetLinkCursor() const;
  29. //设定是否有下划线
  30. void SetUnderline(BOOL bUnderline=TRUE);
  31. //获得是否有下划线
  32. BOOL GetUnderline() const;
  33. //设定是否是自动改变大小
  34. void SetAutoSize(BOOL bAutoSize=TRUE);
  35. BOOL GetAutoSize() const;
  36. public:
  37. virtual BOOL PreTranslateMessage(MSG *pMsg);
  38. protected:
  39. virtual void PreSubclassWindow();
  40. //}}AFX_VIRTUAL
  41. protected:
  42. //连接到URL
  43. HINSTANCE GotoURL(LPCTSTR url, int showcmd);
  44. //打印错误
  45. void ReportError(int nError);
  46. //获得注册表信息
  47. LONG GetRegKey(HKEY key, LPCTSTR subkey, LPTSTR retdata);
  48. //调整位置
  49. void PositionWindow();
  50. //设定默认的鼠标形状
  51. void SetDefaultCursor();
  52. // 变量
  53. protected:
  54. COLORREF m_crLinkColour, m_crVisitedColour; // 超级链接颜色
  55. COLORREF m_crHoverColour;                           // 鼠标停留颜色
  56. BOOL     m_bOverControl;                            // 是否鼠标移到控件上
  57. BOOL     m_bVisited;                                // 是否被访问
  58. BOOL     m_bUnderline;                              // 是否有下划线
  59. BOOL     m_bAdjustToFit;                            // 是否自动调整控件大小
  60. CString  m_strURL;                                  // URL
  61. CFont    m_Font;                                        // 设定字体
  62. HCURSOR  m_hLinkCursor;                             // 光标
  63. CToolTipCtrl m_ToolTip;                             // 提示文字
  64. protected:
  65. afx_msg HBRUSH CtlColor(CDC *pDC, UINT nCtlColor);
  66. afx_msg BOOL OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message);
  67. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  68. //}}AFX_MSG
  69. afx_msg void OnClicked();
  70. DECLARE_MESSAGE_MAP()
  71. };

1.3.3  小试牛刀--编程实现写邮件超级链接(2)

(2) 在文件HyperLink.cpp中定义类成员函数的具体实现,接下来开始讲解此文件的具体实现过程。

① 定义函数OnMouseMove和OnSetCursor实现鼠标移动事件,具体代码如下:

  1. //鼠标移动事件
  2. void CHyperLink::OnMouseMove(UINT nFlags, CPoint point)
  3. {
  4. CStatic::OnMouseMove(nFlags, point);
  5. //判断鼠标是否在控件上方
  6. if (m_bOverControl)
  7. {
  8. CRect rect;
  9. GetClientRect(rect);
  10. if (!rect.PtInRect(point))
  11. {
  12. m_bOverControl = FALSE;
  13. ReleaseCapture();
  14. RedrawWindow();
  15. return;
  16. }
  17. }
  18. else                      // 鼠标移过控件
  19. {
  20. m_bOverControl = TRUE;
  21. RedrawWindow();
  22. SetCapture();
  23. }
  24. }
  25. BOOL CHyperLink::OnSetCursor(
  26. CWnd* /*pWnd*/,
  27. UINT /*nHitTest*/,
  28. UINT /*message*/)
  29. {
  30. if (m_hLinkCursor)
  31. {
  32. ::SetCursor(m_hLinkCursor);
  33. return TRUE;
  34. }
  35. return FALSE;
  36. }

② 定义函数PreSubclassWindow()实现鼠标移动事件,具体代码如下:

  1. void CHyperLink::PreSubclassWindow()
  2. {
  3. // 获得鼠标单击事件
  4. DWORD dwStyle = GetStyle();
  5. ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);
  6. // 如果URL为空,设定为窗体名称
  7. if (m_strURL.IsEmpty())
  8. GetWindowText(m_strURL);
  9. // 同时检查窗体标题是否为空,如果为空则设定为URL
  10. CString strWndText;
  11. GetWindowText(strWndText);
  12. if (strWndText.IsEmpty()) {
  13. ASSERT(!m_strURL.IsEmpty());
  14. SetWindowText(m_strURL);
  15. }
  16. // 创建字体
  17. LOGFONT lf;
  18. GetFont()->GetLogFont(&lf);
  19. lf.lfUnderline = m_bUnderline;
  20. m_Font.CreateFontIndirect(&lf);
  21. SetFont(&m_Font);
  22. PositionWindow();               // 调整窗体大小
  23. SetDefaultCursor();             // 设定默认鼠标形状
  24. //创建提示信息
  25. CRect rect;
  26. GetClientRect(rect);
  27. m_ToolTip.Create(this);
  28. m_ToolTip.AddTool(this, m_strURL, rect, TOOLTIP_ID);
  29. CStatic::PreSubclassWindow();
  30. }

1.3.3  小试牛刀--编程实现写邮件超级链接(3)

③ 定义函数SetURL()和GetURL(),分别设置链接的URL地址并获取URL。具体代码如下:

  1. //设定URL
  2. void CHyperLink::SetURL(CString strURL)
  3. {
  4. m_strURL = strURL;
  5. if (::IsWindow(GetSafeHwnd())) {
  6. PositionWindow();
  7. m_ToolTip.UpdateTipText(strURL, this, TOOLTIP_ID);
  8. }
  9. }
  10. CString CHyperLink::GetURL() const
  11. {
  12. return m_strURL;
  13. }

④ 定义SetColours()、GetLinkColour()、GetVisitedColour()和GetHoverColour()函数,用于设置链接的不同访问状态下的颜色,具体代码如下:

  1. //设定颜色
  2. void CHyperLink::SetColours(COLORREF crLinkColour, COLORREF crVisitedColour,
  3. COLORREF crHoverColour /* = -1 */)
  4. {
  5. m_crLinkColour = crLinkColour;
  6. m_crVisitedColour = crVisitedColour;
  7. if (crHoverColour == -1)
  8. m_crHoverColour = ::GetSysColor(COLOR_HIGHLIGHT);
  9. else
  10. m_crHoverColour = crHoverColour;
  11. if (::IsWindow(m_hWnd))
  12. Invalidate();
  13. }
  14. COLORREF CHyperLink::GetLinkColour() const
  15. {
  16. return m_crLinkColour;
  17. }
  18. COLORREF CHyperLink::GetVisitedColour() const
  19. {
  20. return m_crVisitedColour;
  21. }
  22. COLORREF CHyperLink::GetHoverColour() const
  23. {
  24. return m_crHoverColour;
  25. }

⑤ 定义函数SetVisited()和GetVisited(),用于设置是否被访问过,具体代码如下:

  1. void CHyperLink::SetVisited(BOOL bVisited /* = TRUE */)
  2. {
  3. m_bVisited = bVisited;
  4. if (::IsWindow(GetSafeHwnd()))
  5. Invalidate();
  6. }
  7. BOOL CHyperLink::GetVisited() const
  8. {
  9. return m_bVisited;
  10. }

1.3.3  小试牛刀--编程实现写邮件超级链接(4)

⑥ 定义函数SetLinkCursor()和GetLinkCursor(),用于分别设定鼠标的形状和获取鼠标的形状,具体代码如下:

  1. void CHyperLink::SetLinkCursor(HCURSOR hCursor)
  2. {
  3. m_hLinkCursor = hCursor;
  4. if (m_hLinkCursor == NULL)
  5. SetDefaultCursor();
  6. }
  7. HCURSOR CHyperLink::GetLinkCursor() const
  8. {
  9. return m_hLinkCursor;
  10. }

⑦ 定义函数SetUnderline()和GetUnderline(),分别用于设置是否有下划线和获取是否具有下划线,具体代码如下:

  1. //设置下划线
  2. void CHyperLink::SetUnderline(BOOL bUnderline /* = TRUE */)
  3. {
  4. m_bUnderline = bUnderline;
  5. if (::IsWindow(GetSafeHwnd()))
  6. {
  7. LOGFONT lf;
  8. GetFont()->GetLogFont(&lf);
  9. lf.lfUnderline = m_bUnderline;
  10. m_Font.DeleteObject();
  11. m_Font.CreateFontIndirect(&lf);
  12. SetFont(&m_Font);
  13. Invalidate();
  14. }
  15. }
  16. BOOL CHyperLink::GetUnderline() const
  17. {
  18. return m_bUnderline;
  19. }

⑧ 定义函数SetAutoSize()和GetAutoSize(),分别用于设置和获取是否是自动改变大小,具体代码如下:

  1. void CHyperLink::SetAutoSize(BOOL bAutoSize /* = TRUE */)
  2. {
  3. m_bAdjustToFit = bAutoSize;
  4. if (::IsWindow(GetSafeHwnd()))
  5. PositionWindow();
  6. }
  7. BOOL CHyperLink::GetAutoSize() const
  8. {
  9. return m_bAdjustToFit;
  10. }

⑨ 定义函数PositionWindow(),用于调整窗体的大小,具体代码如下:

  1. void CHyperLink::PositionWindow()
  2. {
  3. if (!::IsWindow(GetSafeHwnd()) || !m_bAdjustToFit)
  4. return;
  5. CRect rect;
  6. GetWindowRect(rect);
  7. CWnd *pParent = GetParent();
  8. if (pParent)
  9. pParent->ScreenToClient(rect);
  10. CString strWndText;
  11. GetWindowText(strWndText);
  12. CDC *pDC = GetDC();
  13. CFont *pOldFont = pDC->SelectObject(&m_Font);
  14. CSize Extent = pDC->GetTextExtent(strWndText);
  15. pDC->SelectObject(pOldFont);
  16. ReleaseDC(pDC);
  17. DWORD dwStyle = GetStyle();
  18. if (dwStyle & SS_CENTERIMAGE)
  19. rect.DeflateRect(0, (rect.Height() - Extent.cy)/2);
  20. else
  21. rectrect.bottom = rect.top + Extent.cy;
  22. if (dwStyle & SS_CENTER)
  23. rect.DeflateRect((rect.Width() - Extent.cx)/2, 0);
  24. else if (dwStyle & SS_RIGHT)
  25. rectrect.left  = rect.right - Extent.cx;
  26. else
  27. rectrect.right = rect.left + Extent.cx;
  28. SetWindowPos(NULL, rect.left, rect.top,
  29. rect.Width(), rect.Height(), SWP_NOZORDER);
  30. }

⑩ 定义函数SetDefaultCursor(),用于设定默认的鼠标形状,具体代码如下:

  1. void CHyperLink::SetDefaultCursor()
  2. {
  3. if (m_hLinkCursor == NULL)         // No cursor handle - load our own
  4. {
  5. // Get the windows directory
  6. CString strWndDir;
  7. GetWindowsDirectory(strWndDir.GetBuffer(MAX_PATH), MAX_PATH);
  8. strWndDir.ReleaseBuffer();
  9. strWndDir += _T("\\winhlp32.exe");
  10. // This retrieves cursor #106 from winhlp32.exe,
  11. // which is a hand pointer
  12. HMODULE hModule = LoadLibrary(strWndDir);
  13. if (hModule) {
  14. HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
  15. if (hHandCursor)
  16. m_hLinkCursor = CopyCursor(hHandCursor);
  17. }
  18. FreeLibrary(hModule);
  19. }
  20. }

⑪定义函数GetRegKey(),用于获得注册表信息,具体代码如下:

  1. LONG CHyperLink::GetRegKey(HKEY key, LPCTSTR subkey, LPTSTR retdata)
  2. {
  3. HKEY hkey;
  4. LONG retval = RegOpenKeyEx(key, subkey, 0, KEY_QUERY_VALUE, &hkey);
  5. if (retval == ERROR_SUCCESS) {
  6. long datasize = MAX_PATH;
  7. TCHAR data[MAX_PATH];
  8. RegQueryValue(hkey, NULL, data, &datasize);
  9. lstrcpy(retdata, data);
  10. RegCloseKey(hkey);
  11. }
  12. return retval;
  13. }

⑫定义函数ReportError(),用于输出打印错误,具体代码如下:

  1. void CHyperLink::ReportError(int nError)
  2. {
  3. CString str;
  4. switch (nError) {
  5. case 0:
  6. str = "The operating system is out\nof memory or resources.";
  7. break;
  8. case SE_ERR_PNF:
  9. str = "The specified path was not found.";
  10. break;
  11. case SE_ERR_FNF:
  12. str = "The specified file was not found.";
  13. break;
  14. case ERROR_BAD_FORMAT:
  15. str = "The .EXE file is invalid\n(non-Win32 .EXE "
  16. + CString("") + "or error in .EXE image).";
  17. break;
  18. case SE_ERR_ACCESSDENIED:
  19. str="The operating system denied\naccess to the specified file.";
  20. break;
  21. case SE_ERR_ASSOCINCOMPLETE:
  22. str = "The filename association is\nincomplete or invalid.";
  23. break;
  24. case SE_ERR_DDEBUSY:
  25. str = "The DDE transaction could not\nbe completed because "
  26. + CString("")+"other DDE transactions\nwere being processed.";
  27. break;
  28. case SE_ERR_DDEFAIL:
  29. str = "The DDE transaction failed.";
  30. break;
  31. case SE_ERR_DDETIMEOUT:
  32. str = "The DDE transaction could not\nbe completed because "
  33. + CString("") + "the request timed out.";
  34. break;
  35. case SE_ERR_DLLNOTFOUND:
  36. str = "The specified dynamic-link library was not found.";
  37. break;
  38. case SE_ERR_NOASSOC:
  39. str = "There is no application associated\nwith the "
  40. + CString("") + "given filename extension.";
  41. break;
  42. case SE_ERR_OOM:
  43. str = "There was not enough memory to complete the operation.";
  44. break;
  45. case SE_ERR_SHARE:
  46. str = "A sharing violation occurred. ";
  47. default:
  48. str.Format("Unknown Error (%d) occurred.", nError);
  49. break;
  50. }
  51. str = "Unable to open hyperlink:\n\n" + str;
  52. AfxMessageBox(str, MB_ICONEXCLAMATION | MB_OK);
  53. }

定义函数GotoURL(),用于链接到指定的目标地址,具体代码如下:

  1. //链接到目标地址
  2. HINSTANCE CHyperLink::GotoURL(LPCTSTR url, int showcmd)
  3. {
  4. TCHAR key[MAX_PATH + MAX_PATH];
  5. // 调用函数ShellExecute()
  6. HINSTANCE result =
  7. ShellExecute(NULL, _T("open"), url, NULL, NULL, showcmd);
  8. // 如果错误,则检查注册表获得.htm文件的注册键值
  9. if ((UINT)result <= HINSTANCE_ERROR) {
  10. if (GetRegKey(HKEY_CLASSES_ROOT,_T(".htm"),key) == ERROR_SUCCESS) {
  11. lstrcat(key, _T("\\shell\\open\\command"));
  12. if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
  13. TCHAR *pos;
  14. pos = _tcsstr(key, _T("\"%1\""));
  15. if (pos == NULL) {                     // 没有发现
  16. pos = strstr(key, _T("%1"));       // 检查%1
  17. if (pos == NULL)                   // 没有参数
  18. pos = key+lstrlen(key)-1;
  19. else
  20. *pos = '\0';                   // 删除参数
  21. }
  22. else
  23. *pos = '\0';                       // 删除参数
  24. lstrcat(pos, _T(" "));
  25. lstrcat(pos, url);
  26. result = (HINSTANCE)WinExec(key, showcmd);
  27. }
  28. }
  29. }
  30. return result;
  31. }

至此,整个实例的主要模块介绍完毕。该程序执行后,将在窗体内显示一个超级链接,如图1-17所示。单击"写邮件"后,将激活链接,开始写邮件,如图1-18所示。

 
图1-17  显示一个超级链接
 
图1-18  开始写邮件

转载于:https://www.cnblogs.com/For-her/p/3939357.html

1.3.1 数据报套接字编程相关推荐

  1. 网络编程【UDP数据报套接字编程】

    目录 1.网络编程基础 1.1 为什么需要网络编程? 1.2 什么是网络编程 1.3 网络编程中的基本概念 2.Socket套接字 2.1 分类 3.UDP数据报套接字编程 3.1 DatagramS ...

  2. 【网络编程】Socket套接字;UDP数据报套接字编程;TCP流套接字编程

    文章目录 1. 什么是网络编程 2. 网络编程中的基本概念 3. Socket套接字 4 UDP数据报套接字编程 4.1 客户端服务器交互流程 4.2 UDP版本的回显服务 4.3 英译汉服务 5. ...

  3. 计算机网络详解--套接字编程

    目录 1.什么是网络编程 2.TCP/IP协议 3.Socket套接字 流套接字:使用传输层TCP(传输控制协议) 数据报套接字:使用传输层UDP(用户数据报协议) 原始套接字 4.Java数据报套接 ...

  4. 无连接应用程序丢包率测试/UDP丢包率测试【基于数据报套接字的网络程序设计】

    目录 一.无连接应用程序丢包率测试 二.UDP 丢包率测试服务端 三.UDP丢包率测试客户端 四.用户使用说明(输入 / 输出规定) 五.部分运行结果 六.UDP 丢包率的测试结果分析 (1)讨论服务 ...

  5. socket编程——upd(数据报套接字)

    ip地址 用来标记网络上的一台电脑 如何查看电脑的IP地址? 分Windows和Linux系统 Windows是ipconfig Linux是ifconfig IP地址的分类 按版本分类 Ipv4: ...

  6. Linux之socket套接字编程20160704

    介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...

  7. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

  8. 专题 15 TCP套接字编程

    概述 存在三种套接字:流式套接字(SOCK_STREAM).数据报套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW). TCP套接字工作流程: 首先,服务器端启动进程,调用Socket创建 ...

  9. 套接字编程(VC_Win32)

    简介(源于维基) Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口.然而,由于AT&T的专利保护着UNIX,所以 ...

最新文章

  1. 人脸识别是大势所趋 加速落地“普惠AI”
  2. 2020年五大云计算预测
  3. c#_Func和Action委托简介
  4. python 栈和队列_Python实现栈和队列的简单操作方法示例
  5. 1052 卖个萌 (20 分)
  6. 每日集成Tip: CruiseControl.Net 提示DLL文见找不到的解决方法
  7. 文献阅读课10-Neural Relation Extraction for Knowledge Base Enrichment(提取+嵌入+消歧+规范化联合模型,实体已知,仅关系抽取,多词实体)
  8. java简单词法分析器(源码下载)
  9. mysql中的trigger
  10. mysql数据还原时报错_还原mysql数据库时报错
  11. TypeScript学习笔记(第一天)------创建简单的web应用
  12. 微信云控开发SDK使用教程--手机回传朋友圈点赞数量通知服务端
  13. Mac中如何将本地文文档设置成文档模板(WPS)
  14. port access vlan
  15. java输出数组中所有数字排列的集合
  16. 敲开bp神经网络之门(三,机器视觉斑点blob匹配中使用)
  17. 建筑施工复习资料-立杆基础
  18. Android——浙理体育(飞翔的红蜻蜓)反编译分析
  19. LCD段码液晶屏开模过程参数
  20. 流处理旅程——storm之spout介绍

热门文章

  1. Flink SQL - OVER windows‘ ordering in stream mode must be defined on a time attribute.
  2. html经典案例pdf,一篇文章学习html【经典案例】
  3. 图片处理命令行工具ImageMagick介绍
  4. SNMP Informant采集 MIB oids
  5. 哪种蓝牙耳机戴着最舒服?佩戴最舒服的真无线蓝牙耳机
  6. 学习 Linux,101: 使用正则表达式搜索文本文件
  7. 如何申请专利及流程是怎样的?
  8. 如何利用计算机,怎样利用计算机学习
  9. 临时停车收费管理系统的设计与实现
  10. 数据库主键如何设计?