1.在單文檔中view擋在MainFrame的前面。此時如果編寫針對MainFrame的mouseClick事件,將不會有反應(yīng)。
2.消息響應(yīng)會在3處修改代碼,1處是在頭文件中,
//{{AFX_MSG(CDrawView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
另一處是cpp文件的begin MessageMap和End MessageMap之間,
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
// Standard PRinting commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
最后是要有函數(shù)實現(xiàn)的代碼。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TOD Add your message handler code here and/or call default
m_ptOrigin=m_ptOld=point;
m_bDraw=TRUE;
CView::OnLButtonDown(nFlags, point);
}
3.畫線:定義一個成員變量保存mouseDown的點m_Point
1)API函數(shù)方法畫線用HDC
2)用CDC類成員函數(shù)畫線。此時別忘記ReleaseDC
3)用CClientDC
4)用CWindowDC,用它甚至可以整個屏幕區(qū)域畫線。
下面是上面4種方法的代碼
/*HDC hdc;
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);必須成對使用。*/
/*CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);必須成對使用。*/
//CClientDC dc(this);
/*CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);此處不需要ReleaseDC,因為CClientDC會自動釋放DC*/
//CWindowDC dc(this);
//CWindowDC dc(GetParent());
/*CWindowDC dc(GetDesktopWindow());//此時可以在整個屏幕上畫線。
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
/*CPen pen(PS_DOT,1,RGB(0,255,0));
CClientDC dc(this);
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);*/
5)用Bitmap填充所畫的矩形。
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
//CBRUSH::FromHandle是靜態(tài)成員函數(shù),所以可以用下面的方法調(diào)用。
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush=dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush);
m_bDraw=FALSE;
6)用其它顏色畫線
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen=dc.SelectObject(&pen);//選中紅色畫筆
if(m_bDraw==TRUE)
{
dc.SetROP2(R2_BLACK);//設(shè)置繪畫模式
dc.MoveTo(m_ptOrigin);
//dc.LineTo(point);
dc.LineTo(m_ptOld);
//dc.MoveTo(m_ptOrigin);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
//m_ptOrigin=point;
m_ptOld=point;
}
dc.SelectObject(pOldPen);
4.MFC中隱式的包含了windows.h。為什么?
因為在AFXV_W32.h文件中:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
在AFXWIN.h中
// Note: WINDOWS.H already included from AFXV_W32.H
5.如何從句柄獲得對象的指針?
答FromHandle
6.類的靜態(tài)成員函數(shù)可以由類名直接調(diào)用,也可以由對象調(diào)用。可以認為靜態(tài)成員函數(shù)并不屬于某個對象,它屬于類本身。程序運行伊始,即使沒有實例化類的對象,靜態(tài)成員函數(shù)和靜態(tài)成員變量已然有其內(nèi)存空間。靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員變量!靜態(tài)成員變量必須在類的外部初始化。當(dāng)然如果并不打算用到靜態(tài)成員變量,此時你可以不初始它。
7.理解代碼區(qū),數(shù)據(jù)區(qū),堆,棧!
請見下面的簡介:
對于一個進程的內(nèi)存空間而言,可以在邏輯上分成3個部份:代碼區(qū),靜態(tài)數(shù)據(jù)區(qū)和動態(tài)數(shù)據(jù)區(qū)。動態(tài)數(shù)據(jù)區(qū)一般就是“堆棧”。“棧(stack)”和“堆(heap)”是兩種不同的動態(tài)數(shù)據(jù)區(qū),棧是一種線性結(jié)構(gòu),堆是一種鏈式結(jié)構(gòu)。進程的每個線程都有私有的“棧”,所以每個線程雖然代碼一樣,但本地變量的數(shù)據(jù)都是互不干擾。一個堆棧可以通過“基地址”和“棧頂”地址來描述。全局變量和靜態(tài)變量分配在靜態(tài)數(shù)據(jù)區(qū),本地變量分配在動態(tài)數(shù)據(jù)區(qū),即堆棧中。程序通過堆棧的基地址和偏移量來訪問本地變量。
具體的代碼如下,
其中添加了WM_LBUTTONDOWN,WN_LBUTTONUP,WM_MOUSEMOVE的消息
在CXXView中添加了數(shù)據(jù)成員CPoint m_orgpt,CPoint m_oldpt,CPoint m_movept
[html] view plain copyCDrawView::CDrawView() { // TODO: add construction code here m_orgpt=0; m_movept=0; flag=FALSE; } [html] view plain copyvoid CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_orgpt=m_oldpt=point; flag=TRUE; CView::OnLButtonDown(nFlags, point); } [html] view plain copyvoid CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default /*HDC hdc; hdc=::GetDC(m_hWnd); ::MoveToEx(hdc,m_orgpt.x,m_orgpt.y,NULL); ::LineTo(hdc,point.x,point.y); ::ReleaseDC(m_hWnd,hdc);*/ /*CDC *pcdc=GetDC(); pcdc->MoveTo(m_orgpt); pcdc->LineTo(point.x,point.y); ReleaseDC(pcdc);*/ //CClientDC ccdc(this); /* CClientDC ccdc(GetParent()); ccdc.MoveTo(m_orgpt); ccdc.LineTo(point);*/ //CWindowDC cwdc(this); //CWindowDC cwdc(GetParent()); /*CWindowDC cwdc(GetDesktopWindow()); cwdc.MoveTo(m_orgpt); cwdc.LineTo(point);*/ /*CPen cp(PS_SOLID,10,RGB(255,0,0)); CDC *pcdc=GetDC(); pcdc->SelectObject(&cp); pcdc->MoveTo(m_orgpt); pcdc->LineTo(point); ReleaseDC(pcdc);*/ /*CPen cp(PS_DOT,1,RGB(0,255,0)); CClientDC ccdc(this); CPen *pcp=ccdc.SelectObject(&cp); ccdc.MoveTo(m_orgpt); ccdc.LineTo(point); ccdc.SelectObject(pcp);*/ //CBrush cb(RGB(255,0,0)); /*CBrush cb(HS_DIAGCROSS ,RGB(255,0,0)); CClientDC ccdc(this); CBrush *pcb=ccdc.SelectObject(&cb); ccdc.Rectangle(&CRect(m_orgpt,point)); ccdc.SelectObject(pcb);*/ /*CBitmap cbmp; cbmp.LoadBitmap(MAKEINTRESOURCE(BITMAPID)); CBrush cbh(&cbmp); CClientDC ccdc(this); //CBrush *pcbh=ccdc.SelectObject(&cbh);//如果下面用Rectangle的話,這一句還有點作用 ccdc.FillRect(CRect(m_orgpt,point),&cbh); //ccdc.SelectObject(pcbh);//如果上面使用了Rectangle來填充顏色,則要把原來的畫刷設(shè)置回來*/ /*CClientDC ccdc(this); ccdc.Rectangle(&CRect(m_orgpt,point));//這里使用默認白畫刷*/ /*CClientDC ccdc(this); CBrush *pcbr; pcbr=(CBrush *)ccdc.SelectStockObject(NULL_BRUSH);//SelectStockObject(NULL_BRUSH)返回的是一個GDI指針 ccdc.Rectangle(&CRect(m_orgpt,point)); ccdc.SelectObject(pcbr);*/ /*CClientDC ccdc(this); LOGBRUSH logb; ::GetObject((HBRUSH)::GetStockObject(NULL_BRUSH),sizeof(LOGBRUSH),&logb); CBrush cbr; cbr.CreateBrushIndirect(&logb); ccdc.Rectangle(&CRect(m_orgpt,point));*/ //這段注釋的代碼不成功,理論上可行 /*CClientDC ccdc(this); CBrush *oldpcbr; CBrush *newpcbr; newpcbr=CBrush::FromHandle((HBRUSH)::GetStockObject(NULL_BRUSH)); oldpcbr=ccdc.SelectObject(newpcbr); ccdc.Rectangle(&CRect(m_orgpt,point)); ccdc.SelectObject(oldpcbr);*/ flag=FALSE; CView::OnLButtonUp(nFlags, point); } [html] view plain copyvoid CDrawView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default /*m_movept=point;//畫圖程序 CClientDC ccdc(this); ccdc.MoveTo(m_orgpt); if(flag) { ccdc.LineTo(m_movept); } m_orgpt=m_movept;*/ /*m_movept=point;//畫不帶邊線的扇形 CClientDC ccdc(this); ccdc.MoveTo(m_orgpt); if(flag) { ccdc.LineTo(m_movept); } */ CClientDC ccdc(this); CPen cpen(PS_SOLID,3,RGB(255,0,0)); CPen *oldpen =ccdc.SelectObject(&cpen); if(flag) { ccdc.SetROP2(R2_NOT); ccdc.MoveTo(m_orgpt); ccdc.LineTo(m_oldpt); ccdc.MoveTo(m_oldpt); ccdc.LineTo(point); m_oldpt=point; } ccdc.SelectObject(oldpen); CView::OnMouseMove(nFlags, point); }新聞熱點
疑難解答