作者chingyue (ChingYue)
看板C_and_CPP
标题[问题] MFC书本范例无法正确执行
时间Mon Mar 20 14:10:35 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
win7
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Visual Studio 2013
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
无
问题(Question):
小弟最近刚入门MFC 正在依照书本范例执行程式
但是刚刚依照书本程式范例输入程式码却无法正确执行
麻烦各位前辈指点迷津
预期的正确结果(Expected Output):
应该要可以在视窗上绘图
错误结果(Wrong Output):
视窗上点击左键却无反应
程式码(Code):(请善用置底文网页, 记得排版)
http://ideone.com/jazfJE
#include <afxwin.h>
#include "resource.h"
#include <afxtempl.h> //定义样板类别的标头档
class MyDoc : public CDocument //Document的资料储存
{
public:
CArray<CPoint, CPoint &> pArray; //容纳滑鼠轨迹的Array容器
void AddPoint(CPoint p) //将轨迹点加到容器内
{
pArray.Add(p);
}
CPoint GetPoint(int i) //将轨迹点从容器中取出
{
return pArray[i];
}
int GetSiez() //取得容器的大小
{
return pArray.GetSize();
}
DECLARE_DYNCREATE(MyDoc) //宣告 run-time类别
DECLARE_MESSAGE_MAP() //宣告讯息映射表
};
IMPLEMENT_DYNCREATE(MyDoc,CDocument) //宣告MyDoc为run-time类别
BEGIN_MESSAGE_MAP(MyDoc,CDocument) //建立讯息映射表
END_MESSAGE_MAP()
class MyView : public CView //将储存的资料显示
{
public:
void OnDraw(CDC * aDC) //复写OnDraw(必须复写的虚拟函数)
{
MyDoc *doc = (MyDoc *)GetDocument(); //取得目前Document物件的指标
int num = doc->GetSiez(); //取得目前储存的轨迹点点数
int i;
for (i = 0; i < num; ++i) //将MyDOc中储存的轨迹点重绘到视窗上
{
CPoint point = doc->GetPoint(i); //取出doc物件中储存的第i个滑鼠轨迹点
aDC->SetPixel(point, RGB(255, 0, 0)); //将滑鼠轨迹点绘於画布上
}
}
afx_msg void OnButtonDown(UINT , CPoint point)
{
SetCapture();
} //取得滑鼠讯息的接收权
afx_msg void OnMouseMove(UINT , CPoint point)
{
if (this == GetCapture()) //GetCapture()函数检查滑鼠游标是否在这个应用程式的
视窗上
{
CClientDC aDC(this); //建立画布
aDC.SetPixel(point, RGB(255, 0, 0)); //将点画在画布上
MyDoc *doc = (MyDoc *)GetDocument(); //取得目前Doc物件的指标
doc->AddPoint(point); //将轨迹点加入Doc物件中
}
}
afx_msg void OnLButtonUp(UINT , CPoint point)
{
ReleaseCapture(); //解放滑鼠讯息的接收权
}
DECLARE_DYNCREATE(MyView) //宣告run-time类别
DECLARE_MESSAGE_MAP() //宣告讯息映射表
};
IMPLEMENT_DYNCREATE(MyView,CView) //宣告MyView为run-time类别
BEGIN_MESSAGE_MAP(MyView,CView)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP() //建立讯息映射表
class MyFrame : public CFrameWnd
{
DECLARE_DYNCREATE(MyFrame) //宣告 run-time类别
DECLARE_MESSAGE_MAP() //宣告讯息映射表
};
IMPLEMENT_DYNCREATE(MyFrame,CFrameWnd) //宣告MyFrame为run-time类别
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd) //建立讯息映射表
END_MESSAGE_MAP()
class MyApp : public CWinApp
{
public:
BOOL InitInstance()
{
CDocument *doc; //宣告指向文件的指标
CSingleDocTemplate* DocTemplate; //宣告指向单文件样板物件的指标
DocTemplate = new CSingleDocTemplate( //建立具有单文件样板物件
IDR_MENU1, //用於单文件框架之资源的识别子
RUNTIME_CLASS(MyDoc), //单文字视窗的Document
RUNTIME_CLASS(MyFrame),//单文字视窗的视窗框架
RUNTIME_CLASS(MyView)//单文字视窗的View
);
AddDocTemplate(DocTemplate); //将单文件样板物件设定给MyApp
doc = DocTemplate->CreateNewDocument(); //建立新的文件
m_pMainWnd = DocTemplate->CreateNewFrame(doc, NULL); //建立一个视窗框架
DocTemplate->InitialUpdateFrame((CFrameWnd*)m_pMainWnd, doc); //起始化视窗框
架物件,并连接View物件
m_pMainWnd->ShowWindow(SW_SHOW); //显示视窗
return true;
}
}a_app; //建立应用程式物件
补充说明(Supplement):
程式码网址:
http://ideone.com/jazfJE
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.163.26.51
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1489990239.A.839.html
1F:→ TeaEEE: 你的OnMouseMove呢? 03/20 14:25
2F:→ TeaEEE: aDC建了却没画 03/20 14:27
请问是这段吗?
class MyView里面
afx_msg void OnMouseMove(UINT , CPoint point)
{
if (this == GetCapture())
{
CClientDC aDC(this); //建立画布
aDC.SetPixel(point, RGB(255, 0, 0)); //将点画在画布上
MyDoc *doc = (MyDoc *)GetDocument(); //取得目前Doc物件的指标
doc->AddPoint(point); //将轨迹点加入Doc物件中
}
}
这里面aDC.SetPixel不是画图的意思吗?
※ 编辑: chingyue (1.163.26.51), 03/20/2017 14:50:59
3F:→ pttworld: OnLButtonDown是否少L 03/20 20:00
对对对 真的是少L 非常谢谢您!
※ 编辑: chingyue (122.116.59.114), 03/21/2017 09:26:35