『壹』 怎樣使用MFC單文檔程序編寫一個滑鼠畫線程序
在visual
C++6.0裡面
文件->新建->工程裡面的MFC
Appwizard
[EXE]
除了第二步選單文檔,基本上都是默認的。
建一個文件進行一下操作
我建的文件名為ZuoBiao
在CZuoBiaoView.h裡面添加變數:
int
m;
CPoint
p1,p2;
在構造函數裡面初使化m。
CZuoBiaoView::CZuoBiaoView()
{
//
TODO:
add
construction
code
here
m=0;
}
在資源文件Menu中的IDR_MAINFRAME中添加消息句柄OnLButtonDown,OnLButtonUp,OnMouseMove.
再回到ZuoBiaoView.cpp中編譯一下程序
void
CZuoBiaoView::OnLButtonDown(UINT
nFlags,
CPoint
point)
{
//
TODO:
Add
your
message
handler
code
here
and/or
call
default
CClientDC
dc(this);
m=1;
p1=point;
CView::OnLButtonDown(nFlags,
point);
}
void
CZuoBiaoView::OnLButtonUp(UINT
nFlags,
CPoint
point)
{
//
TODO:
Add
your
message
handler
code
here
and/or
call
default
p2=point;
CClientDC
dc(this);
OnPrepareDC(&dc);
dc.MoveTo(p1);
dc.LineTo(p2);
m=0;
CView::OnLButtonUp(nFlags,
point);
}
void
CZuoBiaoView::OnMouseMove(UINT
nFlags,
CPoint
point)
{
//
TODO:
Add
your
message
handler
code
here
and/or
call
default
static
int
n=0;
switch(++n)
{
case
1:
p2=point;
break;
case
2:
p1=p2;
p2=point;
n=0;
break;
}
CClientDC
dc(this);
OnPrepareDC(&dc);
if(m==1)
{
dc.MoveTo(p1);
dc.LineTo(p2);
}
CView::OnMouseMove(nFlags,
point);
}
『貳』 MFC編程怎麼實現將對話框在單文檔框架中顯示出來組成界面如圖
在MainFrame中,可以添加一個「顯示」按鈕的響應函數中;
在這個函數中獲取到Edit的文本信息後,可以設置給View;
View中有個變數保存著這個文本信息;
在View的OnDraw函數中,調用DrawText將這個文本可以繪制在任何你希望出現的視圖位置
『叄』 編寫MFC下的單文檔程序,通過滑鼠點擊選擇兩個點,作為矩形左上角,右下角,繪制矩形
View 類中增加兩個變數.CPoint m_ptLeftTop;BOOL m_bHasLeftTop.
LButtonDown處理函數中.
if (m_bHasLeftTop)
{
CDC * pdc;
pdc = this->GetDC();
pdc->Rectangle(m_ptLeftTop.x, m_ptLeftTop.y, pt.x, pt.y);
m_bHasLeftTop = FALSE;
}
else
{
m_ptLefttop = pt;
m_bHasLeftTop = TRUE;
}
『肆』 編寫MFC下的單文檔程序,繪制矩形,矩形坐上角、右下角坐標由對話框輸入。
題目: 編寫MFC下的單文檔程序,繪制矩形,矩形坐上角、右下角坐標由對話框輸入。
思路:使用CDC的Draw3dRect函數可以直接在視圖上繪制矩形,只是這個函數需要的是左上角坐標與矩形的長寬,所以我們需要通過左上角坐標與右下角坐標轉換計算出矩形長寬。
實現過程:
1. 創建名為drawrect的單文檔視圖程序
2. 為CDrawrectView類添加成員變數來存放左上角坐標與右下角坐標
3. 在CDrawrectView類的OnDraw函數中根據左上角坐標與右下角坐標繪制矩形
4. 添加對話框資源用來輸入左上角坐標與右下角坐標並為這個對話框添加相應的類與成員變數
5. 讓CDrawrectView響應OnFileNew函數,在這個函數中彈出對話框要求用戶輸入左上角坐標與右下角坐標,把用戶輸入保存到CDrawrectView的相應成員變數中並強迫視圖重繪。
關鍵代碼:
void CDrawrectView::OnDraw(CDC* pDC)
{
CDrawrectDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->Draw3dRect(m_nX1, m_nY1, m_nX2 - m_nX1, m_nY2 - m_nY1, RGB(0, 0, 0), RGB(0, 0, 0));
}
void CDrawrectView::OnFileNew()
{
CDlgPosition dlgPosition;
if (dlgPosition.DoModal() == IDOK)
{
m_nX1 = dlgPosition.m_nX1;
m_nY1 = dlgPosition.m_nY1;
m_nX2 = dlgPosition.m_nX2;
m_nY2 = dlgPosition.m_nY2;
}
Invalidate(); //Force view redraw
}
運行結果:
『伍』 MFC 單文檔文件 可視化編程
這個簡單
根本不需要什麼文檔,直接
用對話框
就行了,如果想要菜單自己手動添加,創建一個clist的鏈表,輸入一個記錄一個,最後顯示的時候遍歷一下,找出對應的就可以了.
『陸』 使用VC建立一個MFC應用程序,要求是單文檔。
很簡單啊!
你點工程欄有個 MFC(exe);然後你選第3個最上面第3個就行了。
『柒』 MFC單文檔程序添加消息映射和消息響應函數的問題
樓主對於VC的理解還是太陌生了。VC有自動化的實現機制,只是樓主不用啊。
這樣的程序設計應該是這樣的:
1派生一個CButton的子類,通過類向導為該子類添加相應的內容,如可以找到BN_CLICKED,然後寫窗口函數。
2切換到要包含該按鈕的對話框/視圖等容器,添加該按鈕類的一個實例,即視圖類的成員變數。然後動態創建。
3程序運行後,單擊按鈕,程序執行先前在1中定義好的窗口函數。
為什麼要這樣做,而不是像樓主那樣的說法,直接添加個功能--「如果真的只能手動添加,那麼當初VC6.0的作者怎麼不設計這個功能?」?
如果真的這樣做了,反而顯出了微軟的水平不高!!!因為這種做法是不符合面向對象和代碼重用的要求的。樓主可能一時無法理解,時間長了,就會明白了。
P.S.我們怎麼可能往已經做好的CButton里插入BN_CLICKED響應函數的代碼呢?要插入代碼,也只可能在CButton的子類里插入。那既然程序要求有個新的類,為什麼要把新的類和VIEW混在一起?模塊化的設計概念是什麼?為什麼要採用模塊化的設計方案?MFC把所有的類都放在一對文件里,一個.CPP對應一個.H文件。樓主看下通過VS下的應用程序向導創建的所有程序如SDI,MDI,DIALOG,都能發現一個類對應一對.CPP和.H。為什麼不幹脆全都混在一起算了! 樓主可以手工添加代碼把按鈕和視圖混在一起,這個在代碼技術上一點不難。但我絕對不會做這么不明智的選擇!
=====================================================
對不起,6.0很久前就不用了,對他的操作環境不是很熟悉,無法在未安裝6.0的情況下提供操作步驟。但是,如樓主所陳述,對function name設為OnClicked後,點擊OK按鈕後,向導應該會生成關於OnClicked的函數框架,樓主只要在函數體中寫代碼就可以了。當運行後,點擊你的那個BUTTON,就會執行OnClicked函數體中的代碼了。
另外,6.0之後的2003、2005、2008同6.0的操作界面有了很大的不同,之後幾個版本的操作界面變化不是很大。學習VC,上手不只是學習怎麼寫MFC,開始的時候MFC和操作界面的學習是同等重要的,也就是說如果學習1個小時,有半個小時必須花在學習操作界面上。可惜的是,能詳細介紹操作界面的書不多。而且,如前所述,根據樓主的版本不同,應該挑選不同版本的初級VC教程進行學習,並且選擇2到3本來學,因為沒有一本書能涵蓋所有有關操作方面的VC教程的。推薦一本初級書籍--《VC深入詳解》。另外值得提醒的是,可以選擇2005之後的版本來學習,因為通常6.0所附帶的代碼庫比較陳舊,不提供新推出的API,因此,如果使用6.0,就必須自己手工從網上下載資源,更新相關的代碼庫。
『捌』 編寫MFC下的單文檔程序,繪制圓,圓心坐標和半徑由對話框輸入
void CCircle_TestView::OnDraw(CDC* pDC)
{
CCircle_TestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
HPEN hPen; //畫筆;
hPen=CreatePen(PS_DASH,2,0x00ff00);//生成綠色畫筆;
SelectObject(pDC->m_hDC,hPen);//把畫筆引入設備場境 ;
Arc(pDC->m_hDC,100,100,300,300,350,500,350,500);//畫圓 ;
SelectObject(pDC->m_hDC,hPen);//復原 ;
}
總結:其實畫圓還可以使用Ellipse函數。
『玖』 MFC單文檔程序用計時器實現動態畫圖
這很簡單,都放在單文檔的View中處理
添加成員currentIndex,代表需要畫到第幾個
實現按鈕單擊事件,比如為OnButtonClick
void OnButtonClick()
{
SetTimer(1,1000,NULL);
currentIndex = 0;
}
在View中的OnDraw中添加繪制代碼
void OnDraw(CDC* dc)
{
for(int i=0; i<currentIndex-1; ++i)
{
DrawLine( x[i], y[i], x[i+1], y[i+1]);
}
}
4. 添加afx_msg void OnTimer( UINTnIDEvent) 並添加處理
void OnTimer(UINT id)
{
++currentIndex;
invalidaterect(NULL); //關鍵是這句,讓窗體重新繪制
}