《Windows程式設計》常見問題

來源:互聯網
上載者:User

1 問:C++語言基礎部分與後面的Windows編程設計思路聯絡與區別?
答:
(1) C++語言基礎部分的編程思路是基於console(DOS)的編程,不是真正的Windows編程設計的範疇;
理由:a) C++語言基礎部分的輸出是字元介面的(printf、cout<<);而Windows程式的輸出是圖形介面的
b) C++語言基礎部分的程式是基於過程執行的;而Windows程式是基於事件驅動的
c) C++語言基礎部分的輸入一般直接接受鍵盤字元輸入;而Windows程式的輸入主要是滑鼠、鍵盤、定時器等;
(2) C++語言的學習是Windows編程設計的基礎(MFC編程的基礎)
理由:a) C++是物件導向的程式設計語言(OOP),其封裝性、繼承性、多態性特點有利於Windows程式的協同開發、節省開發和維護成本;
(3) C++語言基礎部分的編程思路側重介紹C++語言本身;Windows編程設計的編程思路側重於Windows基本機理以及MFC類的學習。

2 問:C++語言基礎部分的基本要求?後八節的Windows編程設計的基本要求?
答:
(1) C++語言基礎部分的編程思路側重介紹C++語言本身:
基本要求:
a) 理解OOP的基本特點、熟悉C++語言的基礎語言現象(抽象、封裝、繼承與派生、多態性、虛函數)
b) 可以基本讀懂別人編寫的C++代碼:類層次、類的成員變數與成員函數;
c) 掌握VC開發平台的基本用法;學會基於過程的基本調試方法(斷點調試、單步跟蹤、watch、callstack)
(2) Windows編程設計的編程思路側重於Windows基本機理以及MFC類的學習:
基本要求:
a) 理解Windows程式的基本機理(Windows程式的基本結構、訊息機制)
b) 瞭解MFC架構、MFC類層次;掌握基本的類的特點和用法(CWinApp;CWnd;CString;CDC;CPoint;CRect;CDocument;CView;CArchive;CDialog;CEdit;CButton;CListBox;CControl)
c) 除了基於過程的基本調試方法(局部調試用),補充學習基於事件的基本調試方法(Spy++;TRACE;ASSERT)
d) 掌握一些重點內容:文檔視圖(DOC/VIEW)結構;對話方塊以及各種控制項的使用;

3 問:SDK編程與MFC編程的聯絡與區別?
答:
(1) SDK編程與MFC編程,都是Windows編程方法;MFC編程是SDK編程方法的發展
SDK編程是傳統的、基於Win32 API底層開發、費時費力的編程方法
MFC編程是模組化的、在MFC類的基礎上開發、省時省力的編程方法
(2) SDK編程上手快、編程思路容易理解;MFC編程上手困難、學習過程較漫長(一般需要半年至一年才初步熟練掌握);
SDK編程可以類比與電子學中的“類比電路設計”;MFC編程可以類比與電子學中的“數字電路設計”;

4 問:MFC編程千頭萬緒,學習要點是什嗎?
答:MFC編程是物件導向的編程思路(OOP),重點在於利用前人已經構建好的對象(類),派生出自己的新的對象、賦予新的特性,從而完成我們的帶有獨特功能的Windows應用程式。
在MFC學習過程中,學習要點如下:
a)參考經典的例題,通過閱讀、模仿,加深對Windows訊息機制、MFC程式架構的理解;
b)逐步積累MFC類和成員函數的使用方法;
c)培養良好的編程習慣、掌握基本的調試手段和技巧、養成線上查閱資料的習慣;

5 問:一般的VC6.0書上的代碼中都有OnDraw函數,為什麼課上給的HelloWorld程式中找不到OnDraw成員函數?
答:為了循序漸進,在上課時建立的MFC程式架構中去掉了DOC/VIEW結構,因此產生的類CChildView不是從CView派生的,而是從基礎類CWnd派生的。
請同學們重點關注CWnd類的OnPaint訊息響應函數。
OnPaint與OnDraw用法類似,但OnPaint更簡單一點,適合初學。

6 問:能否提前解釋一下OnDraw與OnPaint的關係?
答:OnDraw是CView的成員函數(是虛函數,不是訊息響應函數),是在視圖/文檔結構中實現輸出(包括螢幕輸出和列印輸出)而進行的封裝;
OnPaint是視窗類別CWnd的訊息響應函數。

因為CView是視窗類別CWnd的衍生類別,因此CView的WM_PAINT訊息響應函數也是OnPaint。
在CView以及CView的衍生類別中,OnDraw與OnPaint的關係是:(1)OnPaint函數中調用了OnDraw;(2)在使用CView以及衍生類別的時候,一般只需要對OnDraw進行代碼處理,而OnPaint一般情況下被封裝。

7 問:在將SDK作業(正弦動畫)改造到MFC程式的時候,資料變數應該在哪裡定義?
答:這一問題應該已在C++語言的學習中得以解決,這裡總結一下。
在MFC編程(C++編程)中,資料變數定義可以有三種辦法。
a)如果定義的變數只需要在特定的一個cpp檔案中使用,可以在這個cpp檔案上方直接定義,一般定義為靜態變數(static)。一旦定義,在該cpp檔案中的所有類的成員函數或全域函數中均可訪問並使用這些變數。這一用法可參考MainFrm.cpp中的indicators靜態變數。(繪圖示範程式DrawDemo中採用了這一方法)
b)在一些類中定義public甚至static成員變數,通過訪問類的成員變數達到全域使用的目的。這一用法可參考MainFrm.h中CMainFrame的成員變數m_wndView,以及MainFrm.cpp中m_wndView的使用方式。
c)如果需要定義的變數在多個cpp檔案中使用,建議自己構造一個structure或class,將這些變數封裝起來,然後訪問。此時,需要在cpp檔案中構造一個對象,並將類的標頭檔include到有關cpp檔案中。這一用法可參考程式架構中的theApp。
當然,也可以(不建議)參照C語言編程中的相關使用辦法,在某個cpp檔案中定義,並在公用的標頭檔(.h)中申明,並include到需要訪問並使用這些變數的cpp檔案中。


8 問:在將SDK作業(正弦動畫)改造到MFC程式的時候,應該在哪個類中添加功能表命令的訊息響應函數?CHelloWorldApp類、CMainFrame類還是CChildView類?
答:事實上,在上述三個類中添加訊息響應函數都是可行的。考慮最方便的實現方案,具體情況需要具體分析。
(1)如果變數定義採用與DrawDemo相同的定義方法(上述第一種方法),應在CChildView類中添加。這樣,所有變數均在同一個cpp檔案中使用,代碼編寫和維護最方便。
(2)如果變數定義採用第二種方法,即定義為某個類的成員變數,則在任何類中添加功能表命令訊息響應函數都是可行的。此時,在具體編程時,需要使用類的範圍操作符::。
順便說一下,在學習了DOC/VIEW視圖文檔結構之後,大部分變數資料將被封裝在文檔類中(第二種方法變數定義法);尤其在學習了多文檔(MDI)之後,需要分析功能表命令的影響範圍,然後決定在哪個類中響應命令訊息。

9 問:在將SDK作業(正弦動畫)改造到MFC程式的時候,按照上課時的HelloWorld示範,我的程式架構也同樣沒有選用DOC/VIEW結構。在使用ClassWizard對CChildView類添加WM_TIMER訊息映射函數時,我發現右側待選的訊息(Messages)中沒有WM_TIMER訊息,連WM_PAINT也沒有。為什嗎?
答:請在ClassWizard中的Class Info頁中,選取類CChildView,並將Message Filter從"Not A Window"修改為"Window"。然後,所有WM_...標準訊息均可映射。
這個產生的應用程式架構有一點點不方便:(,應該預設將Message Filter設定為"Window"就好了。


10 問:裝置描述表CDC與各種GDI對象(CPen,CBrush等)之間是什麼關係?
答:打一個形象的比方:
CDC是一塊畫布,各種GDI對象是畫家手中的工具;
paint的全過程與畫家繪畫類比:
(1)準備工作(::BeginPaint())
(2)畫家調整工具(CDC::SelectObject(...))
選取顏料(CDC::SetTextColor(...);CDC::SetBkColor(...))
按照一定技法(CDC::SetROP2(...))
在畫布上畫了數筆(CDC::TextOut(...)、CDC::Ellipse(...)等成員函數)
(3)畫家調整工具(CDC::SelectObject(...))
選取顏料(CDC::SetTextColor(...);CDC::SetBkColor(...))
按照一定技法(CDC::SetROP2(...))
在畫布上又畫了數筆(CDC::TextOut(...)、CDC::Ellipse(...)等成員函數)
(...)...
(N)直到所有的工作成功完成(::EndPaint())


11 問:文檔視圖結構很複雜,學習要點是什嗎?
答::
文檔/視圖結構是MFC應用程式架構的重要概念。
重點掌握內容:
(1)視圖與文檔間的關係、視圖與文檔間的協調編程;
(2)文檔的序列化【其中一個應用就是檔案輸入輸出(IO)】;
(3)掌握各種典型的視圖類和文檔類的用途和用法;【需要在使用過程中積累】
其他要點:
(1)MFC應用程式架構協調架構視窗、文檔、視圖的機制(文件範本CDocTemplate與文件管理器CDocManager)。
(2)動態對象和類型檢查。


(3) SDK編程中涉及的 win32 API函數基本上可以在MFC類中找到對應的成員函數,類成員函數的聲明一般只比 win32 API函數少一個參數(表示操作對象的控制代碼);
(*4) 進階提示(一般不建議使用):SDK編程中涉及的 win32 API函數也可在MFC編程時直接使用。使用全域範圍操作符" ::",並將物件控點傳遞就可以調用了。如: ::Sleep(50); 或者 ::FlashWindow( CWnd::GetSafeHwnd(),TRUE)
(5) 總之,學習SDK有利於加深對Windows程式運行機制的理解、並協助學習MFC;學習MFC的根本目的是提高編程效率和程式穩定性、降低程式的開發和維護成本;
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.