[問題] MFC書本範例無法正確執行

看板C_and_CPP (C/C++)作者 (ChingYue)時間9年前 (2017/03/20 14:10), 9年前編輯推噓0(003)
留言3則, 2人參與, 最新討論串1/1
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1489990239.A.839.html

03/20 14:25, , 1F
你的OnMouseMove呢?
03/20 14:25, 1F

03/20 14:27, , 2F
aDC建了卻沒畫
03/20 14:27, 2F
請問是這段嗎? 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

03/20 20:00, , 3F
OnLButtonDown是否少L
03/20 20:00, 3F
對對對 真的是少L 非常謝謝您! ※ 編輯: chingyue (122.116.59.114), 03/21/2017 09:26:35
文章代碼(AID): #1Opt9VWv (C_and_CPP)
文章代碼(AID): #1Opt9VWv (C_and_CPP)