桌面端编程之与C++配套的界面编程工具

在之前的文章《开发一个软件的主要流程》中指出要开发一个软件,第一步就是要为该软件编写一个界面。C++配套的界面编程工具常见的有Qt与MFC。Qt支持跨平台。MFC不支持跨平台,它是Windows系统下的界面开发工具。Qt的官方网站及下载地址为:https://www.qt.io/,从该网站可以下载Qt安装源文件。Qt分为试用版、开源版、商业版,试用版允许用户在试用期内免费使用,但超过试用期则需付费;开源版允许用户使用Qt开发开源的软件,如使用开源版开发商业软件会受到一定的限制;商业版具有比开源版更加丰富的功能,可以自由开发自己的商业软件。

下载Qt后进行安装,安装完后双击则可打开该软件。Qt打开后的界面如图 4‑12所示,该界面上列出了一些常见的界面开发样例,使用Qt的开发人员可以参考这些样例进行二次开发,而不必从零开始。这提高了开发的效率,同时也降低了开发的难度。Qt的优势除了跨平台之外,还在于使用Qt既可以通过编写代码行的方式来编写软件界面,也可以采用拖拽控件的方式构建出软件的界面。Qt编写的界面中各控件的功能通过信号与槽的机制来实现,信号就是在特定情况下被发射的事件,槽就是一个对应于特定信号的被调用的函数,它负责当控件的事件被触发时执行对应的动作。Qt的具体使用方法读者可以参考官方的文档,也可以通过阅读Qt的相关教材进行学习。Qt的文档网址和常用教材将在随后的文章中介绍。

 412 Qt软件的界面

Qt的官方文档为英文,可以点击Qt软件菜单栏中的“帮助”进行查看,也可以通过在线网站查询,官方文档的网址为:https://doc.qt.io

如果不习惯看英文文档,也可以查阅文档的中文翻译版,其网址为:http://qt6.digitser.net/en-US.html或者http://qtdocs.sourceforge.net

在AI项目开发中,一般使用Qt联合Visual Studio和OpenCV的方式来进行计算机视觉项目的开发。为此必须先配置好开发环境,具体来说先安装Visual Studio,然后在Visual Studio下配置OpenCV;接下来安装Qt,然后在Qt下面配置好Visual Studio和OpenCV。这样的配置方式,既可以使用Visual Studio联合OpenCV开发无需软件界面的计算机视觉项目,也可以使用Qt联合Visual Studio及OpenCV来开发带软件界面的计算机视觉项目。具体的开发环境的配置步骤,读者可以参考网上的相关教程。

与C++配套的另外一个界面编程工具是MFC。MFC是Visual Studio自带的一个工具包。使用MFC编写界面时,可以通过拖拽控件的方式先构建出程序的界面,然后在控件的事件函数中实现该控件对应的功能。需要学习MFC界面编程的读者可以查阅Visual Studio教材中介绍MFC的内容。

如果想了解C++编程方面的著名教材有哪些,敬请关注本公众号的下一篇文章《桌面端编程之C++编程著名教材》。

关于人工智能中编程能力和技能训练的更多介绍,可以购买《人工智能怎么学》进一步阅读。

图书购买方式

京东:https://item.jd.com/13395339.html

当当:http://product.dangdang.com/29469230.html

天猫:https://detail.tmall.com/item_o.htm?id=687374654836

为了让图书惠及更多的读者,为更多想学习人工智能的人提供帮助,经过向出版社申请,对图书《人工智能怎么学》的部分内容进行改编和连载。图书《人工智能怎么学》的全部内容包含了初级入门、中阶提高以及高级进阶三个级别的内容。连载的内容主要是初级入门级别,适合想对人工智能进行快速和高效入门的读者,对于已有一定的人工智能学习基础,希望进一步进阶或提高的读者,则需要购买图书《人工智能怎么学》,学习中阶提高以及高级进阶的内容。此外,对于学习人工智能感兴趣的读者,也可以加入知识星球《人工智能怎么学》,知识星球是一个构建学习社群的平台,通过加入《人工智能怎么学》的社群,你将获得更多的学习资料和课程信息。

与作者互动和了解更多信息

想跟作者一起学习人工智能和互动,你可以加入如下社群:

知识星球:https://t.zsxq.com/0aLkVg0os

QQ群:600587177

想了解更多关于人工智能学习及实践的内容,请关注如下媒体:

官方网站:https://bigdatamininglab.github.io

官方微信公众号:人工智能怎么学(可扫描下方二维码或者微信搜索“人工智能怎么学”添加关注)

CSDN:https://blog.csdn.net/audyxiao001

参考文献

  1. Robert C. Martin. 代码整洁之道(第2版)[M]. 韩磊, . 北京: 中国工信出版集团, 人民邮电出版社, 2020.
  2. Herb Sutter, Andrei Alexandrescu. C++编程规范:101条规则、准则与最佳实践[M]. 刘基诚, . 北京: 人民邮电出版社, 2016.
  3. 杨冠宝. 阿里巴巴Java开发手册[M]. 北京: 电子工业出版社, 2020.
  4. James Gosling et al. The Java Language SpecificationJava SE 8 Edition [M]. Upper Saddle River: Addison-Wesley, 2014.
  5. 老九君. C++的发展简史[EB/OL]. https://www.cnblogs.com/ljxt/p/11636342.html, 2019-10-08.
  6. 翁惠玉. C++程序设计:思想与方法(第2版)[M]. 北京: 人民邮电出版社, 2012.
  7. 谭浩强. C++程序设计(第3版)[M]. 北京: 清华大学出版社, 2015.
  8. Siddhartha Rao. Sams Teach Yourself C++ in One Hour a Day (Eighth Edition) [M]. Boston: Pearson, 2017.
  9. Bjarne Stroustrup. ProgrammingPrinciples and Practice Using C++ (Second Edition) [M]. Crawfordsville: Pearson, 2014.
  10. Bjarne Stroustrup. C++语言设计和演化[M]. 裘宗燕, . 北京: 人民邮电出版社, 2020.
  11. Stephen Prata. C++ Primer Plus(中文第6版)[M]. 张海龙 , . 北京: 人民邮电出版社, 2020.
  12. Stanley B. Lippman, Josée Lajoie, Barbara E. Moo. C++ Primer(中文第5版)[M]. 王刚 , . 北京: 电子工业出版社, 2013.
  13. Stanley B. Lippman. Essential C++(中文版)[M]. 侯捷, . 北京: 电子工业出版社, 2013.
  14. 侯捷. STL源码解析 [M]. 武汉: 华中科技大学出版社, 2015.
  15. Ivor Horton. C++标准模板库编程实战 [M]. 郭小虎 , . 北京: 清华大学出版社, 2017.
  16. Brian W. Kernighan, Rob Pike. 程序设计实践 [M]. 裘宗燕, . 北京: 机械工业出版社, 2003.
  17. Bruce Eckel. C++编程思想(两卷合订本)[M]. 刘宗田 , . 北京: 机械工业出版社, 2011.
  18. Scott Meyers. Effective C++:改善程序与设计的55个具体做法(第3版)[M]. 侯捷, . 北京: 电子工业出版社, 2011.
  19. Scott Meyers. More Effective C++35个改善编程与设计的有效方法 [M]. 侯捷, . 北京: 电子工业出版社, 2020.
  20. Scott Meyers. Effective STL50条有效使用STL的经验 [M]. 潘爱民 , . 北京: 电子工业出版社, 2013.
  21. 陆文周. Qt 5开发及实例(第4版)[M]. 北京: 电子工业出版社, 2019.
  22. 王维波. Qt 5.9 C++开发指南 [M]. 北京: 人民邮电出版社, 2018.
  23. 冯振, 郭延宁, 吕跃勇. OpenCV 4快速入门 [M]. 北京: 电子工业出版社, 2020.
  24. ghscarecrow. Java的发展历程[EB/OL]. Java的发展历程_ghscarecrow的博客-CSDN博客, 2018-09-02.
  25. JMCui. Java的发展历程[EB/OL]. https://www.cnblogs.com/jmcui/p/11796303.html, 2019-11-07.
  26. 明日科技. Java从入门到精通(第5版)[M]. 北京: 清华大学出版社, 2019.
  27. Kathy Sierra, Bert Bates. Head First Java (Second Edition) [M]. Sebastopol: O’Reilly, 2005.
  28. Bruce Eckel. Java编程思想(第4版)[M]. 陈昊鹏, . 北京: 机械工业出版社, 2007.
  29. Cay S. Horstmann. Java核心技术 I:基础知识(第11版)[M]. 林琪 , . 北京: 机械工业出版社, 2019.
  30. Cay S. Horstmann. Java核心技术卷:高级特性(第11版)[M]. 陈昊鹏, . 北京: 机械工业出版社, 2020.
  31. Joshua Bloch. Effective Java(中文第3版)[M]. 俞黎敏, . 北京: 机械工业出版社, 2019.
  32. 周志明. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)[M]. 北京: 机械工业出版社, 2019.
  33. Brian Goetz. Java并发编程实战 [M]. 童云兰 . 北京: 机械工业出版社, 2012.
  34. Kamalmeet Singh. Java设计模式及实践 [M]. 张小坤 , . 北京: 机械工业出版社, 2013.
  35. 明日科技. Java Web从入门到精通(第3版)[M]. 北京: 清华大学出版社, 2019.
  36. 未来科技. HTML5+CSS3+JavaScript从入门到精通[M]. 北京: 中国水利水电出版社, 2017.
  37. Elisabeth Robson, Eric Freeman. Head First HTMLCSS(第2版)[M]. 徐阳 , . 北京: 中国电力出版社, 2013.
  38. Adam Freeman. HTML5权威指南 [M]. 谢廷晟 , . 北京: 人民邮电出版社, 2014.
  39. Eric A. Meyer, Estelle Weyl . CSS权威指南(第4版)[M]. 安道, . 北京: 中国电力出版社, 2019.
  40. David Flanagan. JavaScript权威指南(第7版)[M]. 李松峰, . 北京: 机械工业出版社, 2021.
  41. 许令波. 深入分析Java Web技术内幕(修订版)[M]. 北京: 电子工业出版社, 2014.
  42. Nicholas S. Williams. Java Web高级编程 [M]. 王肖峰, . 北京: 清华大学出版社, 2015.
  43. 孙卫琴. TomcatJava Web开发技术详解(第3版)[M]. 北京: 电子工业出版社, 2019.
  44. 郭霖. 第一行代码Android(第3版)[M]. 北京: 人民邮电出版社, 2020.
  45. 欧阳燊. Android Studio开发实战:从零基础到App上线(第2版)[M]. 北京: 清华大学出版社, 2018.
  46. Dmitry Jemerov, Svetlana Isakova. Kotlin实战 [M]. 覃宇 , . 北京: 电子工业出版社, 2017.
  47. Kristin Marsicano, Brian Gardner, Bill Phillips, Chris Stewart. Android编程权威指南(第4版)[M]. 王明发, . 北京: 中国工信出版集团, 人民邮电出版社, 2021.
  48. 刘望舒. Android进阶之光(第2版)[M]. 北京: 电子工业出版社, 2021.
  49. 邓凡平. 深入理解Android: Java虚拟机ART [M]. 北京: 机械工业出版社, 2019.
  50. 任玉刚. Android开发艺术探索[M]. 北京: 电子工业出版社, 2015.
  51. 林学森. 深入理解Android内核设计思想(上、下册)(第2版)[M]. 北京: 人民邮电出版社, 2017.
  52. 何红辉, 关爱民. Android 源码设计模式解析与实战(第2版)[M]. 北京: 人民邮电出版社, 2017.
  53. Christian Keur, Aaron Hillegass. iOS编程(第6版)[M]. 王风全, . 武汉: 华中科技大学出版社, 2019.
  54. 张益珲. Swift 4从零到精通iOS开发[M]. 北京: 清华大学出版社, 2019.
  55. Aaron Hillegass, Mikey Ward. Objective-C编程(第2版)[M]. 王蕾 , . 武汉: 华中科技大学出版社, 2015.
  56. Matthew Mathias, John Gallagher. Swift编程权威指南(第2版)[M]. 陈晓亮, . 北京: 人民邮电出版社, 2017.
  57. Kazuki Sakamoto, Tomohiko Furumoto. Objective-C高级编程:iOSOS X多线程和内存管理[M]. 黎华, . 北京: 人民邮电出版社, 2013.
  58. Erica Sadun. iOS Auto Layout开发秘籍(第2版)[M]. 孟立标, . 北京: 清华大学出版社, 2015.
  59. 珲少. iOS性能优化实战[M]. 北京: 电子工业出版社, 2019.
  60. 罗巍. iOS应用逆向与安全之道[M]. 北京: 机械工业出版社, 2020.
  61. Gaurav Vaish. 高性能iOS应用开发[M]. 梁士兴 , . 北京: 人民邮电出版社, 2017.
  62. 刘浩. MATLAB R2020a完全自学一本通 [M]. 北京: 电子工业出版社, 2020.
  63. 天工在线. MATLAB 2020从入门到精通 [M]. 北京: 中国水利水电出版社, 2020.
  64. 苗志宏, 马金强. MATLAB面向对象程序设计[M]. 北京: 电子工业出版社, 2014.
  65. 徐潇, 李远 . MATLAB面向对象编程——从入门到设计模式(第2版)[M]. 北京: 北京航空航天大学出版社, 2017.
  66. 王文峰 . MATLAB计算机视觉与机器认知[M]. 北京: 北京航空航天大学, 2017.
  67. 杨淑莹, 郑清春. 模式识别与智能计算——MATLAB技术实现(第4版)[M]. 北京: 电子工业版社, 2019.
  68. Eric Matthes. Python编程:从入门到实践(第2版)[M]. 袁国忠, . 北京: 人民邮电出版社, 2020.
  69. Magnus Lie Hetland. Python基础教程(第3版)[M]. 袁国忠, . 北京: 人民邮电出版社, 2018.
  70. Luciano Ramalho. 流畅的Python [M]. 安道 , . 北京: 人民邮电出版社, 2017.
  71. Brett Slatkin. Effective Python:编写高质量Python代码的90个有效方法(第2版)[M]. 爱飞翔, . 北京: 机械工业出版社, 2021.
  72. Jan Erik Solem. Python计算机视觉编程[M]. 朱文涛 , . 北京: 人民邮电出版社, 2014.
  73. Andreas C. Müller. Python机器学习基础教程[M]. 张亮, . 北京: 人民邮电出版社, 2018.
  74. 魏坤. Julia语言程序设计[M]. 北京: 机械工业出版社, 2018.
  75. 郝林. Julia编程基础(第2版)[M]. 北京: 人民邮电出版社, 2020.
  76. Ben Lauwens, Allen B. Downey. Think Julia [M]. Sebastopol: O’Reilly, 2019.
  77. Jalem Raj Rohit. Julia Cookbook [M]. Birmingham: Packt Publishing, 2018.
  78. Zacharias Voulgaris. Julia数据科学应用 [M]. 陈光欣, . 北京: 人民邮电出版社, 2018.
  79. 朱红庆. Julia机器学习核心编程:人人可用的高性能科学计算[M]. 北京: 电子工业出版社, 2019.
  80. Norman Matloff. R语言编程艺术[M]. 陈堰平, . 北京: 机械工业出版社, 2013.
  81. Andy Nicholls, Richard Pugh, Aimee Gott. R语言入门经典[M]. 姜佑 , . 北京: 人民邮电出版社, 2018.
  82. Robert I. Kabacoff. R语言实战(第2版)[M]. 王小宁 , . 北京: 人民邮电出版社, 2016.
  83. Hadley Wickham. 高级R语言编程指南[M]. 潘文捷 , . 北京: 机械工业出版社, 2020.
  84. Brett Lantz. 机器学习与R语言(第2版)[M]. 李洪成 , . 北京: 机械工业出版社, 2017.
  85. 程乾, 刘永, 高博. R语言数据分析与可视化从入门到精通[M]. 北京: 北京大学出版社, 2020.
  86. 周伟明.程序员的十层楼(一、二、三)[J]. 程序员, 2009(6):134-136; 2009(7):118-120; 2009(8):134-136.

注:本文版权归作者个人所有,如需转载请联系作者,未经授权不得转载。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++写的一个简单的界面演示系统 void CMiniDrawDoc::AddFigure (CFigure *PFigure) { m_FigArray.Add (PFigure); SetModifiedFlag (); } CFigure *CMiniDrawDoc::GetFigure (int Index) { if (Index m_FigArray.GetUpperBound ()) return 0; return (CFigure *)m_FigArray.GetAt (Index); } int CMiniDrawDoc::GetNumFigs () { return m_FigArray.GetSize (); } void CMiniDrawDoc::DeleteContents() { // TODO: Add your specialized code here and/or call the base class int Index = m_FigArray.GetSize (); while (Index--) delete m_FigArray.GetAt (Index); m_FigArray.RemoveAll (); CDocument::DeleteContents(); } void CMiniDrawDoc::OnEditClearAll() { // TODO: Add your command handler code here DeleteContents (); UpdateAllViews (0); SetModifiedFlag (); } void CMiniDrawDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable (m_FigArray.GetSize ()); } void CMiniDrawDoc::OnEditUndo() { // TODO: Add your command handler code here int Index = m_FigArray.GetUpperBound (); if (Index > -1) { delete m_FigArray.GetAt (Index); m_FigArray.RemoveAt (Index); } UpdateAllViews (0); SetModifiedFlag (); } void CMiniDrawDoc::OnUpdateEditUndo(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable (m_FigArray.GetSize ()); } // implementation of figure classes: IMPLEMENT_SERIAL (CFigure, CObject, 3) CRect CFigure::GetDimRect () { return CRect (min (m_X1, m_X2), min (m_Y1, m_Y2), max (m_X1, m_X2) + 1, max (m_Y1, m_Y2) + 1); } void CFigure::Serialize (CArchive& ar) { if (ar.IsStoring ()) ar << m_X1 << m_Y1 << m_X2 << m_Y2 <> m_X1 >> m_Y1 >> m_X2 >> m_Y2 >> m_Color; } IMPLEMENT_SERIAL (CLine, CFigure, 3) CLine::CLine (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = X1; m_Y1 = Y1; m_X2 = X2; m_Y2 = Y2; m_Color = Color; m_Thickness = Thickness; } void CLine::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CLine::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_SOLID, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); // draw figure: PDC->MoveTo (m_X1, m_Y1); PDC->LineTo (m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CRectangle, CFigure, 3) CRectangle::CRectangle (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = X1; m_Y1 = Y1; m_X2 = X2; m_Y2 = Y2; m_Color = Color; m_Thickness = Thickness; } void CRectangle::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CRectangle::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); PDC->SelectStockObject (NULL_BRUSH); // draw figure: PDC->Rectangle (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CRectFill, CFigure, 3) CRectFill::CRectFill (int X1, int Y1, int X2, int Y2, COLORREF Color) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; } void CRectFill::Draw (CDC *PDC) { CBrush Brush, *POldBrush; CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (&Pen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (&Brush); // draw figure: PDC->Rectangle (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); } IMPLEMENT_SERIAL (CRectRound, CFigure, 3) CRectRound::CRectRound (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; m_Thickness = Thickness; } void CRectRound::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CRectRound::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); PDC->SelectStockObject (NULL_BRUSH); // draw figure: int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1) / 6; PDC->RoundRect (m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CRectRoundFill, CFigure, 3) CRectRoundFill::CRectRoundFill (int X1, int Y1, int X2, int Y2, COLORREF Color) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; } void CRectRoundFill::Draw (CDC *PDC) { CBrush Brush, *POldBrush; CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (&Pen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (&Brush); // draw figure: int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1) / 6; PDC->RoundRect (m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound); // remove pen/brush: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); } IMPLEMENT_SERIAL (CCircle, CFigure, 3) CCircle::CCircle (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; m_Thickness = Thickness; } void CCircle::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CCircle::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); PDC->SelectStockObject (NULL_BRUSH); // draw figure: PDC->Ellipse (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CCircleFill, CFigure, 3) CCircleFill::CCircleFill (int X1, int Y1, int X2, int Y2, COLORREF Color) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; } void CCircleFill::Draw (CDC *PDC) { CBrush Brush, *POldBrush; CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (&Pen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (&Brush); // draw figure: PDC->Ellipse (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值