作者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/m.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