求助,MFC鼠标绘图的onDraw()函数怎么写

sigfield 2009-11-02 10:04:33

void CdrawDlgDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO:
static CPoint oldPoint; //上一个点的位置记录
static bool firstPressed = true;

CClientDC dc(this);

if(nFlags & MK_LBUTTON) //鼠标移动时如果左键被按下,则绘图
{
if(firstPressed == true) //鼠标第一次被点下的时候,在原地画个点
{
firstPressed = false;
dc.SetPixel(point, RGB(255, 255, 255));
oldPoint = point;
}
else //鼠标不是第一次被点下的时候,当前点和上个点之间连一条线
{
dc.MoveTo(oldPoint);
dc.LineTo(point);
oldPoint = point;
}
}
else
{
firstPressed = true;
}
CDialog::OnMouseMove(nFlags, point);
}





上面这段是绘图的代码,完整起见贴上来,其实没什么可说的。

关键是下面的问题:
当窗口部分移出屏幕时,已绘的线会消失——要写onDraw()/onPaint()函数
问题是:如何写?
我的想法是,各点坐标都存到一个队列里,onDraw()的时候一个一个提取,一条线一条线的重画。
但是,感觉很难看,是否有更好的方法?
我的图都画在一个Picture Control控件里,能否直接对控件进行存取操作?
...全文
563 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
如果你想实现类似画图板的功能,我有如下建议:

1、折线可以保存在一个链表中(便于添加、删除),每次有点加入或删除就更新链表数据。
2、如果图案所占面积不是特别大(大到无法创建那么大的位图),可以考虑创建一个内存DC,选入一个CBitmap,每次需要刷新时只要bitblt就行了。
3、MOUSE事件里,添加更新列表以及重画内存DC的代码。

例如:

class CMyClass
{
.............
CDC m_memDC;
CBitmap m_memBMP;
List m_points;
void DrawLine();
}

int CMyClass::OnInitDialog(...)
{
......................
//初始化类的成员,内存DC和CBitmap
CDC* pDC = GetDC();
m_memDC.CreateCompatibleDC(pDC);
m_memBMP.CreateCompatibleBitmap( pDC, 2048, 2048);
m_memDC.SelectObject( &m_memBMP );
.....................
}

void CMyClass::DrawLine()
{
//顺序按链表在内存DC上画图
m_memDC.MoveTo( 第一个点 )
while( m_points没到末尾 ){ m_memDC.LineTo(下一个点); }
Invalidate();
}

void CMyClass::OnMouseMove(UINT nFlags, CPoint point)
{
如果左键处于按下状态,添加新点到链表末尾。
DrawLine();
}

CMyClass::OnPaint()
{
CPaintDC dc(this);
dc.Bitblt(.......m_memDC,..........);
}

天鹅梦 2009-11-03
  • 打赏
  • 举报
回复
一般都是在OnMouseMove中改变某个具有程序分支控制的值,然后在OnDraw函数中根据相应的值进行分支处理
  • 打赏
  • 举报
回复
孙新教程很详细的
fandh 2009-11-03
  • 打赏
  • 举报
回复
onmousemove里面需要画线的数据,保存成视图或者对话框的成员变量,这样,你直接在ondraw或者onpaint里面使用就可以了!

楼主的想法是对的!
hhwei1985 2009-11-03
  • 打赏
  • 举报
回复
onDraw()/onPaint()是窗口重绘函数,可以解决因为移动覆盖而导致图形消失的问题;
所以
绘图工作要在onDraw()/onPaint()函数中进行,在OnMouseMove里边设置一些变量,
传递到onDraw()/onPaint()里面即可;
loop_k 2009-11-03
  • 打赏
  • 举报
回复
你要的答案就是上面那个兄弟贴的代码
要是想实现“橡皮筋”效果
参考http://blog.csdn.net/loop_k/archive/2009/08/24/4480034.aspx
zyq5945 2009-11-02
  • 打赏
  • 举报
回复
建议你看下孙鑫VC视频的11课
// GraphicView.h : interface of the CGraphicView class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_GRAPHICVIEW_H__A0E2AC83_7DFB_4989_9276_209F79BAEDC3__INCLUDED_)
#define AFX_GRAPHICVIEW_H__A0E2AC83_7DFB_4989_9276_209F79BAEDC3__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


class CGraphicView : public CScrollView
{
protected: // create from serialization only
CGraphicView();
DECLARE_DYNCREATE(CGraphicView)

// Attributes
public:
CGraphicDoc* GetDocument();

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CGraphicView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void OnInitialUpdate();
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CGraphicView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
//{{AFX_MSG(CGraphicView)
afx_msg void OnDot();
afx_msg void OnLine();
afx_msg void OnRectangle();
afx_msg void OnEllipse();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnPaint();
afx_msg void OnFileSave();
afx_msg void OnFileOpen();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
CDC m_dcCompatible;
CMetaFileDC m_dcMetaFile;
CPtrArray m_ptrArray;
CPoint m_ptOrigin;
UINT m_nDrawType;
};

#ifndef _DEBUG // debug version in GraphicView.cpp
inline CGraphicDoc* CGraphicView::GetDocument()
{ return (CGraphicDoc*)m_pDocument; }
#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_GRAPHICVIEW_H__A0E2AC83_7DFB_4989_9276_209F79BAEDC3__INCLUDED_)

// GraphicView.cpp : implementation of the CGraphicView class
//

#include "stdafx.h"
#include "Graphic.h"

#include "GraphicDoc.h"
#include "GraphicView.h"

#include "Graph.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGraphicView

IMPLEMENT_DYNCREATE(CGraphicView, CScrollView)

BEGIN_MESSAGE_MAP(CGraphicView, CScrollView)
//{{AFX_MSG_MAP(CGraphicView)
ON_COMMAND(IDM_DOT, OnDot)
ON_COMMAND(IDM_LINE, OnLine)
ON_COMMAND(IDM_RECTANGLE, OnRectangle)
ON_COMMAND(IDM_ELLIPSE, OnEllipse)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_PAINT()
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGraphicView construction/destruction

CGraphicView::CGraphicView()
{
// TODO: add construction code here
m_nDrawType=0;
m_ptOrigin=0;
m_dcMetaFile.Create();
}

CGraphicView::~CGraphicView()
{
}

BOOL CGraphicView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGraphicView drawing

void CGraphicView::OnDraw(CDC* pDC)
{
CGraphicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
/* CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
pDC->SelectObject(pBrush);

for(int i=0;i<m_ptrArray.GetSize();i++)
{
switch(((CGraph*)m_ptrArray.GetAt(i))->m_nDrawType)
{
case 1:
pDC->SetPixel(((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd,RGB(0,0,0));
break;
case 2:
pDC->MoveTo(((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin);
pDC->LineTo(((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd);
break;
case 3:
pDC->Rectangle(CRect(((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin,
((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd));
break;
case 4:
pDC->Ellipse(CRect(((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin,
((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd));
break;
}
}*/
/* HMETAFILE hmetaFile;
hmetaFile=m_dcMetaFile.Close();
pDC->PlayMetaFile(hmetaFile);
m_dcMetaFile.Create();
m_dcMetaFile.PlayMetaFile(hmetaFile);
DeleteMetaFile(hmetaFile);*/
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcCompatible,0,0,SRCCOPY);
}

/////////////////////////////////////////////////////////////////////////////
// CGraphicView printing

BOOL CGraphicView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}

void CGraphicView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}

void CGraphicView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CGraphicView diagnostics

#ifdef _DEBUG
void CGraphicView::AssertValid() const
{
CScrollView::AssertValid();
}

void CGraphicView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}

CGraphicDoc* CGraphicView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraphicDoc)));
return (CGraphicDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGraphicView message handlers

void CGraphicView::OnDot()
{
// TODO: Add your command handler code here
m_nDrawType=1;
}

void CGraphicView::OnLine()
{
// TODO: Add your command handler code here
m_nDrawType=2;
}

void CGraphicView::OnRectangle()
{
// TODO: Add your command handler code here
m_nDrawType=3;
}

void CGraphicView::OnEllipse()
{
// TODO: Add your command handler code here
m_nDrawType=4;
}

void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
CScrollView::OnLButtonDown(nFlags, point);
}

void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//dc.SelectObject(pBrush);
m_dcMetaFile.SelectObject(pBrush);

if(!m_dcCompatible.m_hDC)
{
m_dcCompatible.CreateCompatibleDC(&dc);
CRect rect;
GetClientRect(&rect);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
m_dcCompatible.SelectObject(&bitmap);
m_dcCompatible.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
m_dcCompatible.SelectObject(pBrush);
}
switch(m_nDrawType)
{
case 1:
//dc.SetPixel(point,RGB(0,0,0));
//m_dcMetaFile.SetPixel(point,RGB(0,0,0));
m_dcCompatible.SetPixel(point,RGB(0,0,0));
break;
case 2:
//dc.MoveTo(m_ptOrigin);
//dc.LineTo(point);
//m_dcMetaFile.MoveTo(m_ptOrigin);
//m_dcMetaFile.LineTo(point);
m_dcCompatible.MoveTo(m_ptOrigin);
m_dcCompatible.LineTo(point);
break;
case 3:
//dc.Rectangle(CRect(m_ptOrigin,point));
//m_dcMetaFile.Rectangle(CRect(m_ptOrigin,point));
m_dcCompatible.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
//dc.Ellipse(CRect(m_ptOrigin,point));
//m_dcMetaFile.Ellipse(CRect(m_ptOrigin,point));
m_dcCompatible.Ellipse(CRect(m_ptOrigin,point));
break;
}
//CGraph graph(m_nDrawType,m_ptOrigin,point);
//m_ptrArray.Add(&graph);
/* OnPrepareDC(&dc);
dc.DPtoLP(&m_ptOrigin);
dc.DPtoLP(&point);
CGraph *pGraph=new CGraph(m_nDrawType,m_ptOrigin,point);
m_ptrArray.Add(pGraph);*/
CScrollView::OnLButtonUp(nFlags, point);
}

void CGraphicView::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
OnPrepareDC(&dc);
OnDraw(&dc);
// Do not call CScrollView::OnPaint() for painting messages
}

void CGraphicView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class
SetScrollSizes(MM_TEXT,CSize(800,600));
}

void CGraphicView::OnFileSave()
{
// TODO: Add your command handler code here
HMETAFILE hmetaFile;
hmetaFile=m_dcMetaFile.Close();
CopyMetaFile(hmetaFile,"meta.wmf");
m_dcMetaFile.Create();
DeleteMetaFile(hmetaFile);
}

void CGraphicView::OnFileOpen()
{
// TODO: Add your command handler code here
HMETAFILE hmetaFile;
hmetaFile=GetMetaFile("meta.wmf");
m_dcMetaFile.PlayMetaFile(hmetaFile);
DeleteMetaFile(hmetaFile);
Invalidate();
}
深入浅出MFC(第二版) 目录 第0章 你一定要知道(导读) 这本书适合谁 你需要什么技术基础 你需要什么软硬件环境 让我们使用同一种语言 本书符号习惯 本书例程的取得 范例程序说明 与前版本之差异 如何联络作者 第一篇 勿在浮砂筑高台 第1章 Win32程序基本概念 Win32程序开发流程 需要什么函数库(.LIB) 需要什么头文件(.H) 以消息为基础,以事件驱动之(message based,event driven) 一个具体而微的Win32程序 程序进入点WinMain 窗口类之注册与窗口之诞生 消息循环 窗口的生命中枢:窗口函数 消息映射(Message Map)的雏形 对话框的运行 模块定义文件(.DEF) 资源描述档(.RC) Widnows程序的生与死 空闲时间的处理:OnIdle Console程序 Console程序与DOS程序的差别 Console程序的编译链接 JBACKUP:Win32 Console程序设计 MFCCON:MFC Console程序设计 行程与线程(Process and Thread) 核心对象 一个行程的诞生与死亡 产生子行程 一个线程的诞生与死亡 以_beginthreadex取代CreateThread 线程优先级(Priority) 多线程程序设计实例 第2章 C++的重要性质 类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态成员(变量与函数) C++程序的生与死:兼谈构造函数与解构函数 四种不同的对象生存方式(in stack、in heap、global、local static) 执行期类型信息(RTTI) 动态生成(Dynamic Creation) 异常处理(Exception Handling) Template Template Functions Template Classes Template的编译与链接 第3章 MFC六大关键技术之仿真 MFC类层次结构 Frame 1范例程序 MFC程序的初始化过程 Frame 2范例程序 RTTI(执行期类型识别) 类别型录网与CRuntimeClass DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏 Frame 3范例程序 IsKindOf(类型识别) Frame 4范例程序 Dynamic Creation(动态生成) DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE宏 Frame 6范例程序 Persistence(永久保存)机制 Serialize(数据读) DECLARE_SERIAL/IMPLEMENT_SERIAL宏 没有范例程序 Message Mapping(消息映射) Frame 7范例程序 Command Routing(命令传递) Frame 8范例程序 本章回顾 第二篇 欲善工事先利其器 第4章 Visual C++集成开发环境 安装与组成 四个重要的工具 内务府总管:Visual C++集成开发环境 关于project 关于工具设定 Source Browser Online Help 调试工具 VC++调试器 Exception Handling 程序代码产生器:AppWizard 东圈西点完成MFC程序骨干 威力强大的资源编辑器 Icon编辑器 Cursor编辑器 Bitmap编辑器 工具栏(Toolbar)编辑器 VERSIONINFO资源编辑器 字符串表格(Accelerator)编辑器 菜单(Menu)编辑器 加速键(Accelerator)编辑器 对话框(Dialog)编辑器 Console程序的项目管理 第三篇 浅出MFC程序设计 第5章 总观Application Framework 什么是Application Framework? 侯捷怎么说 我怎么说 别人怎么说 为什么使用Application Framework Microsoft Foundation Classes(MFC) 白头宫女话天宝:Visual C++与MFC 纵览MFC General Purpose classes CObject 数据处理类(collection classes) 杂项类 异常处理类(exception handling classes) Windows API classes Application framework classes High level Abstractions Afx全局函数 MFC宏(macros) MFC数据类型(data types) 第6章 MFC程序的生死因果 不二法门:熟记MFC类的层次结构 需要什么函数库? 需要什么头文件? 简化的MFC程序结构——以Hello MFC为例 Hello程序程序代码 MFC程序的来龙去脉(causal relations) 我只借用两个类:CWinApp和CFrameWnd CWinApp——取代WinMain的地位 CFrameWnd——取代WndProc的地位 引爆器——Application object 隐晦不明的WinMain AfxWinInit——AFX内部初始化操作 CWinApp::InitApplication CMyWinApp::InitInstance CFrameWnd::Create产生主窗口(并先注册窗口类) 奇怪的窗口类名称Afx:b:14ae:6:3e8f 窗口显示与更新 CWinApp::Run——程序生命的活水源头 把消息与处理函数连接在一起:Message Map机制 来龙去脉总整理 Callback函数 空闲时间(idle time)的处理:OnIdle Dialog与Control 通用对话框(Common Dialogs) 本章回顾 第7章 简单而完整:MFC骨干程序 不二法门:熟记MFC类层次结构 MFC程序的UI新风貌 Document/View支撑你的应用程序 利用Visual C++工具完成Scribble step0 骨干程序使用哪些MFC类? Document Template的意义 Scribble的Document/View设计 主窗口的诞生 工具栏和状态栏的诞生(Toolbar&Status bar) 鼠标拖放(Drag and Drop) 消息映射(Message Map) 标准菜单File/Edit/View/Window/Help 对话框 改用CEditView 第四篇 深入MFC程序设计 第8章 Document-View深入探讨 为什么需要Document-View(形而上) Document View Document Frame(View Frame) Document Template CDocTemplate管理CDocument/CView/CFrameWnd Scribble Step1的Document——数据结构设计 MFC Collection Classes的选用 CScribbleDoc的修改 文件:一连串的线条 线条与坐标点 Scribble Step 1的View:数据重绘与编辑 CScribbleView的修改 View的重绘操作:GetDocument和OnDraw ClassWizard的辅佐 WizardBar的辅佐 Serialize:对象的档案读 Serialization以外的档案读操作 台面上的Serialize操作 台面下的Serialize档奥秘 台面下的Serialize读档奥秘 DYNAMIC/DYNCREATE/SERIAL三宏 Serializable的必要条件 CObject类 IsKindOf IsSerializable CObject::Serialize CArchive类 operator《和operator》 效率考虑 自定SERIAL宏给抽象类使用 在CObList中加入CStroke以外的类 Document与View交流——为Step4做准备 第9章 消息映射与命令传递 到底要解决什么 消息分类 万流归宗Command Target(CCmdTarget) 三个奇怪的宏,一张巨大的网 DECLARE_MESSAGE_MAP宏 消息映射网的形成:BEGIN…/ON…/END…宏 米诺托斯(Minotauros)与西修斯(Theseus) 二万五千里长征——消息的传递 直线上溯(一般Windows消息) 拐弯上溯(WM_COMMAND命令消息) 罗塞达碑石:AfxSig_xx的奥秘 Scribble Step2:UI对象的变化 改变菜单 改变工具栏 利用ClassWizard连接命令项识别码与命令处理函数 维护UI对象状态(UPDATE_COMMAND_UI) 本章回顾 第10章 MFC与对话盒 对话框编辑器 利用ClassWizard连接对话框与其专用类 对话框的消息处理函数 对话框数据交换与校验(DDX&DDV) 如何唤起对话框 本章回顾 第11章 View功能的加强与重绘效率的提高 同时修改多个Views:UpdateAllViews和OnUpdate 在View中定义一个hint 把hint传给OnUpdate 利用hint增加重绘效率 可卷动的窗口:CScrollView 大窗口中的小窗口:Splitter 切分窗口的功能 切分窗口的程序概念 切分窗口的实现 本章回顾 第12章 打印与预览 概述 打印操作的后台原理 MFC默认的打印机制 Scribble打印机制的增强 打印机的页和文件的页 配置GDI绘图工具 尺寸与方向:关于映射方式(坐标系统) 分页 页眉与页脚 动态计算页码 打印预览(Print Preview) 本章回顾 第13章 多重文件与多重显示 MDI和SDI 多重显示(Multiple Views) 窗口的动态切分 窗口的静态切分 CreateStatic和CreateView 窗口的静态三叉切分 Graph范例程序 静态切分窗口之观念整理 同源子窗口 CMDIFrameWnd::OnWindowNew Text范例程序 非标准做法的缺点 多重文件 新的Cocument类 新的Document Template 新的UI系统 新文件的档案读操作 第14章 MFC多线程程序设计 从操作系统层面看线程 三个观念:模块、行程和线程 线程优先级(Priority) 线程调度(Scheduling) Thread Context 从程序设计层面看线程 Worker Threads和UI Threads 错误观念 正确态度 MFC多线程程序设计 探索CWinThread 产生一个Worker Thread 产生一个UI Thread 线程的结束 线程与同步控制 MFC多线程程序例程 第15章 定制一个AppWizard 到底Wizard是什么? Custom AppWizard的基本操作 剖析AppWizard Components Dialog Templates和Dialog classes Macros Directives 动手修改Top Studio AppWizard 利用资源编辑器修改IDD_CUSTOM1对话框画面 利用ClassWizard修改IDD_CUSTOM1对话框的对应类CCustomlDlg 改OnDismiss虚拟函数,在其中定义macros 修改text template Top Studio AppWizard执行结果 更多的信息 第16章 站上众人的肩膀——使用Components&activeX Controls 什么是Component Gallery 使用Components Splash screen system Info for About Dlg Tip of the Day Components实际运用:ComTest程序 修改ComTest程序内容 使用ActiveX Controls ActiveX Control基础观念:Properties、Methods、Events ActiveX Controls的五大使用步骤 使用ActiveX Control:OcxTest程序 第五篇 附录 附录A 无责任书评:从摇篮到坟墓Windows的完全学习 无责任书评:MFC四大天王 附录B Scribble Step 5完整原始码 附录C Visual C++5.0MFC范例程序一览 附录D 以MFC重建DBWIN收起

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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