VC入門筆記

来源:互联网 发布:匿名发泄软件 编辑:程序博客网 时间:2024/06/07 18:55

1.MFC框架結构

vc程序啟動過程:
第一步:构建CMyApp對象
第二步:調用WinMain,WinMain找到CMyApp對象,
第三步:執行CMyApp對象的的成員函數InitInstance,初始化框架Frame
第四步:執行Run

vc程序退出過程:
第一步:刪除CMyFrame對象
第二步:退出Run
第三步:退出WinMain
第四步:刪除CMyApp對象

MFC庫消息映射:
第一步:在.h文件中聲明函數
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
第二步:在.cpp文件中BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之間聲明消息
ON_WM_LBUTTONDOWN()
第三步:在.cpp文件中實現函數
void CMyFrame::OnLButtonDown(UINT nFlags,CPoint point)
{
//
}
示例1:
新增一專案,選擇Single Document,其它都為默認,然后修改OnDraw函數如下:
void CChap3View::OnDraw(CDC* pDC)
{
 CChap3Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);

 //加上下面這句代碼,第一個程序就完成了.
 pDC->TextOutW(30,30,_T("Hello World!"));
}

2.GDI
GDI是一個圖形設備接口,它使得開發圖形應用程序時不用考慮顯卡的類型是CGA,EGA,還是VGA,SVGA等等.對于具体的設備只需再開發相應的設備驅動程序就可以了.


設備描述表分為四种類型:顯示器型,打印机型,內存型及信息型.
應用程序不能直接訪問設備描述表,但可以通過函數調用檢取設備描述表的句柄,從而間接地訪問設備描述表.

2.1 GDI常用函數:
(1). CDC* CWnd::GetDC()
用于獲取指定窗口的工作區的顯示器設備描述表.
對于公共設備描述表,GetDC()為每一次被檢取的設備描述表指定缺省屬性.
對于私有設備場境,GetDC()保持它先前所具有的屬性不變.

當類在注冊時,如果指定有CS_CLASSDC,CS_OWNDC,CS_PARENTDC等風格,則GetDC()返回屬于CWnd類的設備場境.

CWnd::GetWindowDC()用于獲取整個窗口的設備描述表,
GetSystemMetrics()用于檢取窗口非客戶區域中各元件的几何尺寸.

(2).int ReleaseDC(CDC *pDC);
用于釋放一個設備描述表.
除非設備描述表屬于窗口類,否則在完成繪圖后,都要調用Release釋放.

(3).CDC* CWnd::BeginPaint(LPPAINTSTRUCT lpPaint);
用于為在指定窗口中畫圖作准備工作.并將畫圖的有關信息寫到PAINTSTRUCT結构中.

(4).BOOL CWnd::EndPaint(CONST PAINTSTRUCT* lpPaint);
用于結束指定窗口中的畫圖過程,返回值總是true

(5).SelectObject()
用于把一個對象選擇進設備描述表.
CPen* CDC::SelectObject(CPen* pPen);
CBrush* CDC::SelectObject(CBrush* pBrush);
virtual CFont* CDC::SelectObject(CFont* pFont);
CBitmap* CDC::SelectObject(CBitmap* pBitmap);
int CDC::SelectObject(CRgn* pRgn);

(6).BOOL CDC::DeleteObject(HGDIOBJ hObject);
用于刪除邏輯畫筆,畫刷,字体,位圖,區域或調色板的句柄.

2.2 GDI對象:
(1).畫筆
庫存畫筆:BLACK_PEN,WHITE_PEN,NULL_PEN
可使用GetStockObject()來取出庫存畫筆

創建畫筆
BOOL CPen::CreatePen(int nPenStyle,int nWidth,COLORREF crColor)
BOOL CPen::CreatePenIndirect(LPLOGPEN lpLogPen)

(2).畫刷
virtual CGdiObject* CDC::SelectStockObject(int nIndex);
用于選擇畫庫存畫刷
如:pDC->SelectStockObject(DKGRAY_BRUSH)

創建畫刷:
BOOL CBrush::CreateSolidBrush(COLORREF crColor);
BOOL CBrush::CreateHatchBrush(int nIndex,COLORREF crColor);
BOOL CBrush::CreatePatternBrush(CBitmap* pBitmap);
BOOL CBrush::CreateBrushIndirect(const LOGBRUSH* lpLogBrush);


2.3 繪制基本圖形
(1)畫點
COLORREF CDC::SetPixel(int X,int Y,COLORREF crColor);

(2)畫直線
BOOL CDC::LineTo(int nXEnd,int nYEnd);
用于從當前位置畫線到指定坐標點.
BOOL CDC::MoveTo(intX,int Y);
用于移動當前位置

(3)畫折線
BOOL CDC::Polyline(CONST POINT* lppt,int cPoints);
用于畫一條折線
BOOL CDC::PolyPolyline(CONST POINT* lppt,CONST DWORD* lpPolyPoints,DWORD cCount);
用于畫多條折線


(4)畫弧線

示例1:
新增一專案,,選擇Single Document,其它都為默認,然后修改OnDraw函數如下:
void CChap4View::OnDraw(CDC* pDC)
{
 CChap4Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;

 int i=0;
 //
 //繪制一組彩色點
 //
 pDC->TextOutW(20,20,_T("Point"));
 pDC->SetPixel(100,20,RGB(255,0,0));
 pDC->SetPixel(110,20,RGB(0,255,0));
 pDC->SetPixel(120,20,RGB(0,0,255));
 pDC->SetPixel(130,20,RGB(255,255,0));
 pDC->SetPixel(140,20,RGB(255,0,255));
 pDC->SetPixel(150,20,RGB(0,255,255));
 pDC->SetPixel(160,20,RGB(0,0,0));

 //
 //繪制一組彩色線
 //
 //定義顏色表
 struct tagColor
 {
  int r,g,b; 
 }
 color[7]=
 {
  {255,0,0},
  {0,255,0},
  {0,0,255},
  {255,255,0},
  {255,0,255},
  {0,255,255},
  {0,0,0},
 };
 //定義兩個指向畫筆的指針
 CPen* pNewPen;
 CPen* pOldPen;
 for(i=0;i<7;i++)
 {
  pNewPen=new CPen;
  if(pNewPen->CreatePen(PS_SOLID,2,RGB(color[i].r,color[i].g,color[i].b)))
  {
   //把新畫筆選入設備描述表
   //同時存儲設備描述表中的原有畫筆
   pOldPen=pDC->SelectObject(pNewPen);
   //用新畫筆繪圖
   pDC->MoveTo(20,60+i*10);
   pDC->LineTo(160,60-i*10);
   //恢复設備認描述表中的原有畫筆
   pDC->SelectObject(pOldPen);
  }
  else
  {
   //出錯時給出提示
   AfxMessageBox(_T("CreatePen Error!"));
  }
  //刪除新創建的畫筆,以便再另外分配
  delete pNewPen;

 }
 //
 //用系統缺省筆繪制折線和曲線
 //
 //畫一條折線
 POINT polyline[4]={{20,190},{70,190},{20,240},{70,240}};
 pDC->Polyline(polyline,4);

 //畫多條折線,以下畫4條折線
 POINT polypolyline[9]={{95,160},{120,185},{120,250},{145,160},{120,185},
       {90,185},{150,185},{80,210},{160,210}};
 DWORD dwpolypoints[4]={3,2,2,2};
 pDC->PolyPolyline(polypolyline,dwpolypoints,4);

 //繪制貝齊爾曲線(Bezier)
 POINT polyBezier[4]={{20,310},{70,250},{110,290},{160,330}};
 pDC->PolyBezier(polyBezier,4);
 //
 //繪制圓,圓弧和橢圓
 //
 //畫圓圈線
 for(i=0;i<8;i++)
 {
  //以260,70為圓心
  pDC->Arc(260-5*i,70-5*i,260+5*i,70+5*i,260+5*i,70,260+5*i,70);
 }
 //畫圓弧線
 for(i=4;i<8;i++)
 {
  pDC->Arc(260-10*i,70-10*i,260+10*i,70+10*i,
    (int)260+10*i*cos(60*3.1415926/180),
    (int)70+10*i*sin(60*3.1415926/180),
    (int)260+10*i*cos(60*3.1415926/180),
    (int)70-10*i*sin(60*3.1415926/180));

  pDC->Arc(260-10*i,70-10*i,260+10*i,70+10*i,
    (int)260-10*i*cos(60*3.1415926/180),
    (int)70-10*i*sin(60*3.1415926/180),
    (int)260-10*i*cos(60*3.1415926/180),
    (int)70+10*i*sin(60*3.1415926/180));

 }
 //繪橢圖面
 CBrush* pNewBrush;
 CBrush* pOldBrush;
 for(i=8;i>1;i--)
 {
  pNewBrush=new CBrush;//构造畫刷,然后初始化
  if(pNewBrush->CreateSolidBrush(RGB(color[8-i].r,color[8-i].g,color[8-i].b)))
  {
   //在設備描述表中選擇新創建的畫刷
   //同時存儲設備描述表中原有畫刷
   pOldBrush =pDC->SelectObject(pNewBrush);
   //用畫刷繪橢圖
   pDC->Ellipse(260-10*i,200-5*i,260+10*i,200+5*i);
   //恢复設備描述表的原有畫刷
   pDC->SelectObject(pOldBrush);
  }
  delete pNewBrush;
 }
 //繪矩形和圓角矩形
 pDC->Rectangle(190,270,250,310);
 pDC->RoundRect(260,270,330,310,30,20);

 //繪制弧形
 pDC->Chord(360-80,70-80,360+80,70+80,
  (int)360+80*cos(60*3.1415926/180),
  (int)70+80*sin(60*3.1415926/180),
  (int)360+80*cos(30*3.1415926/180),
  (int)70-80*sin(30*3.1415926/180));
 //繪扇形
 pDC->Pie(480-80,70-80,480+80,70+80,
  (int)480+80*cos(60*3.1415926/180),
  (int)70+80*sin(60*3.1415926/180),
  (int)480+80*cos(30*3.1415926/180),
  (int)70-80*sin(30*3.1415926/180));
 //繪三角形多邊形
 POINT polygon[3]={{400,160},{430,220},{350,210}};
 pDC->Polygon(polygon,3);

 //畫任意多邊形
 int polygonpoints[2]={3,3};
 POINT polypolygon[6]={{450,120},{540,320},{480,280},{403,300},{540,320},{480,280}};
 pDC->PolyPolygon(polypolygon,polygonpoints,2);

}

3.鼠標
若想知道某個鍵被按下,可用對應有位屏蔽值与nFlags參數作按位邏輯"与"動算,所得結果若為非零,則表示鍵被按下.
如:
if(nFlags & MK_LBUTTON)
{
 AfxMessageBox("LButton is pressed down!");
}
else
{
 AfxMessageBox("LButton up!");
}
鼠標消息的處理
通過重載以下消息映射函數來完成.
OnLButtonDown(UINT nFlags,CPoint point)
{
 //檢測Ctrol和Shift是否按下
 if((wParam& VK_CONTROL) && (wParam & VK_SHIFT))
 break;
};

OnMouseMove(UINT nFlags,CPoint point)
{
}

CWnd::SetCapture();
用于捕捉鼠標
CWnd::ReleaseCapture;
用于釋放鼠標


設定光標:
當光標未被捕捉時從一個窗口移到另一個窗口,將向窗口發送WM_SETCURSOR消息
protected afx_msg BOOL OnSetCursor(CWnd* pWind,UINT nHitTest,UINT message);

例:
BOOL CChap5BView::OnSetCursor(CWnd* pWnd,UINT nHitTest,UINt message)
{
 SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
 return TRUE;
}
示例1:
一個用鼠標涂鴉的程式.
第一步:在.h文件中聲明變量及函數
protected:
 bool m_bDraw;//是否繪制
public:
 afx_msg void OnLButtonDown(unsigned int nFlags, CPoint point);
 afx_msg void OnLButtonUp(unsigned int nFlags, CPoint point);
 afx_msg void OnMouseMove(unsigned int nFlags, CPoint point);
第二步:在.cpp文件中BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之間添加消息
BEGIN_MESSAGE_MAP(CChap5AView, CView)
 ON_WM_LBUTTONDOWN()
 ON_WM_LBUTTONUP()
 ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

第三步:在.cpp文件中實現如下函數
CChap5AView::CChap5AView()
{
 //在构造函數中初始化成員變量
 m_bDraw=false;
}
void CChap5AView::OnLButtonDown(unsigned int nFlags, CPoint point)
{
 //左鍵按下時,捕捉鼠標
 SetCapture();
 m_bDraw=true;
}

void CChap5AView::OnLButtonUp(unsigned int nFlags, CPoint point)
{
 //左鍵彈起時釋放鼠標
 ReleaseCapture();
 m_bDraw=false;
}

void CChap5AView::OnMouseMove(unsigned int nFlags, CPoint point)
{
 if(m_bDraw)
 {
  //取得設備描述表
  CDC* pDC=GetDC();
  pDC->SetPixel(point,RGB(0,0,0));
 }
}
示例2:改變光標形狀的程式
第一步:在.h文件中聲明成員變量及成員函數
protected:
 CPoint m_prePoint;
public:
 BOOL OnSetCursor(CWnd* pWnd,UINT nHitTest,UINT message);
 void OnLButtonUp(UINT nFlags,CPoint point);
 void OnMouseMove(UINT nFlags,CPoint point);
第二步:在.h文件中聲明消息
BEGIN_MESSAGE_MAP(CChap5BView, CView)
 ON_WM_SETCURSOR()
 ON_WM_LBUTTONUP()
 ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

第三步:在.cpp文件中實現成員函數
CChap5BView::CChap5BView()
{
 // TODO: 在此加入建構程式碼
 m_prePoint.x=m_prePoint.y=-2;

}

BOOL CChap5BView::OnSetCursor(CWnd* pWnd,UINT nHitTest,UINT message)
{
 //需先新增一個空白的光標資料IDC_CURSOR1
 SetCursor(AfxGetApp()->LoadCursorW(IDC_CURSOR1));
 return true;
}

void CChap5BView::OnMouseMove(UINT nFlags,CPoint point)
{
 CDC* pDC=GetDC();
 //取當前客戶區大小
 CRect rect;
 GetClientRect(rect);
 //設置繪圖方式為R2_NOTXORPEN
 int nDrawMode=pDC->SetROP2(R2_NOTXORPEN);
 //覆蓋先前的光標線
 pDC->MoveTo(rect.left,m_prePoint.y);
 pDC->LineTo(rect.right,m_prePoint.y);
 pDC->MoveTo(m_prePoint.x,rect.top);
 pDC->LineTo(m_prePoint.x,rect.bottom);
 //繪制新的光標線
 pDC->MoveTo(rect.left,point.y);
 pDC->LineTo(rect.right,point.y);
 pDC->MoveTo(point.x,rect.top);
 pDC->LineTo(point.x,rect.bottom);
 //設置先前的繪圖方式
 pDC->SetROP2(nDrawMode);
 //記錄當前點,以作為下次進入MouseMove的前一個點
 m_prePoint=point;
}
//點鼠標左鍵彈出一個對話框
void CChap5BView::OnLButtonUp(UINT nFlags,CPoint point)
{
 //一個對話框,上面加了很多個按鈕,
 //當鼠標放在按鈕上時,顯示不同的光標形狀.
 CCursorDlg dlg;
 dlg.DoModal();
}
附:CCursorDlg的實現
public:
 BOOL OnSetCursor(CWnd* pWnd,UINT nHitTest,UINT message);

BEGIN_MESSAGE_MAP(CCursorDlg, CDialog)
 ON_WM_SETCURSOR()
END_MESSAGE_MAP()

BOOL CCursorDlg::OnSetCursor(CWnd* pWnd,UINT nHitTest,UINT message)
{
 //const char * nID;
 //LPWSTR  nID;
 WCHAR * nID;
 switch(pWnd->GetDlgCtrlID())
 {
 case IDC_BTN_ARROW: nID=IDC_ARROW;break;
 case IDC_BTN_IBEAM: nID=IDC_IBEAM;break;
 case IDC_BTN_WAIT: nID=IDC_WAIT;break;
 case IDC_BTN_CROSS: nID=IDC_CROSS;break;
 case IDC_BTN_UPARROW: nID=IDC_UPARROW;break;
 case IDC_BTN_SIZE: nID=IDC_SIZE;break;
 case IDC_BTN_SIZEALL: nID=IDC_SIZEALL;break;
 case IDC_BTN_ICON: nID=IDC_ICON;break;
 case IDC_BTN_SIZENWSE: nID=IDC_SIZENWSE;break;
 case IDC_BTN_SIZEWE: nID=IDC_SIZEWE;break;
 case IDC_HELP: nID=IDC_HELP;break;
 case IDC_BTN_NO: nID=IDC_NO;break;
 default:
  return CDialog::OnSetCursor(pWnd,nHitTest,message);
 }
 SetCursor(AfxGetApp()->LoadStandardCursor(nID));
 return true;
}

4.鍵盤与計時器
系統鍵經常由輸入鍵与Alt鍵組合產生,這种鍵一般由Windows系統內部直接處理,如果應用程序處理了這种擊鍵消息,則在處理完后,還應調用DefWindowProc(),以便不影響Windows對它們的處理.

可通過以下虛函數處理鍵盤消息
OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags);
OnKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags);
OnSysKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags);
OnSysKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags);

字符消息
當按鍵產生可見的字符時,Windows在發送鍵 盤消息的同時還發送字符消息,而有些鍵只產生鍵盤消息而不產生字符消息,如功能鍵,Shift鍵,Insert鍵,Delete鍵等.
字符消息通過以下函數來映射:
OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);
OnDeadChar(UINT nChar,UINT nRepCnt,UINT nFlags);
OnSysChar(UINT nChar,UINT nRepCnt,UINT nFlags);
OnSysDeadChar(UINT nChar,UINT nRepCnt,UINT nFlags);
其中,WM_CHAR和WM_DEADCHAR是由WM_KEYDOWN消息引出的.而WM_SYSCHAR和WM_SYSDEADCHAR是由WM_SYSKEYDOWN消息引出的.

示例1:
一個鼠標點在哪,光標就移到哪,并且光標不斷閃爍,在
第一步:在.h文件中聲蝗成員變量及成員函數
protected:
 CPoint m_Position;
 bool m_bCursorOn;
 int m_nCount;

 void MoveCursor(CPoint point);
 afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
 afx_msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);
 afx_msg void OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags);

 afx_msg void OnTimer(UINT nIDEvent);
 BOOL Create(LPCTSTR lpszClassName,LPCTSTR lpszWindowName,
       DWORD dwStyle,const RECT& rect,
       CWnd* pParentWnd,UINT nID,
       CCreateContext* pContext);
 BOOL DestroyWindow();

第二步:

BEGIN_MESSAGE_MAP(CChap5CView, CView)
 ON_WM_LBUTTONUP()
 ON_WM_CHAR()
 ON_WM_KEYDOWN()

 ON_WM_TIMER()
END_MESSAGE_MAP()

第三步:
CChap5CView::CChap5CView()
: m_Position(0)
{
 //
 m_Position.x=40;
 m_Position.y=40;
 m_nCount=0;
 m_bCursorOn=true;

}

void CChap5CView::OnDraw(CDC* pDC)
{
 CChap5CDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;

 //設置R2_NOTXORPEN繪圖方式
 int nDrawMode=pDC->SetROP2(R2_NOTXORPEN);
 //繪制輸入光標
 pDC->MoveTo(m_Position.x,m_Position.y);
 pDC->LineTo(m_Position.x,m_Position.y+16);
 //恢复先前的繪圖方式
 pDC->SetROP2(nDrawMode);
}

void CChap5CView::OnLButtonUp(UINT nFlags,CPoint point)
{
 //設置文本輸入位置
 MoveCursor(point);
}
void CChap5CView::OnChar(UINT nChar,UINT nRepCnt,UINT nFlags)
{
 //將數字轉化為字符串
 //char tbuf[20];
 //sprintf(tbuf,"%c",nChar);

 //一定要顯式轉換
 CString tbuf;
 tbuf+=(char)nChar;

 CDC* pDC=GetDC();
 pDC->TextOutW(m_Position.x+1,m_Position.y,tbuf);
 CSize size=pDC->GetTextExtent(tbuf);//取輸出字符串的大小范圍
 CPoint point=m_Position+CPoint(size.cx+1,0);
 MoveCursor(point);

}
void CChap5CView::OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)
{
 CPoint point;
 switch(nChar)
 {
 case VK_LEFT://向左
  point=m_Position+CPoint(-20*nRepCnt,0);
  MoveCursor(point);
  break;
 case VK_RIGHT://向右
  point=m_Position+CPoint(20*nRepCnt,0);
  MoveCursor(point);
  break;
 case VK_UP://向上
  point=m_Position+CPoint(0,-20*nRepCnt);
  MoveCursor(point);
  break;
 case VK_DOWN://向下
  point=m_Position+CPoint(0,20*nRepCnt);
  MoveCursor(point);
  break;
 default:
  break;


 }
}
void CChap5CView::MoveCursor(CPoint point)
{
 /*CDC* pDC=GetDC();

 //設置R2_NOTXORPEN繪圖方式
 int nDrawMode=pDC->SetROP2(R2_NOTXORPEN);
 //覆蓋先前的光標線
 pDC->MoveTo(m_Position.x,m_Position.y);
 pDC->LineTo(m_Position.x,m_Position.y+16);
 //繪制新的光標線
 m_Position =point;
 pDC->MoveTo(m_Position.x,m_Position.y);
 pDC->LineTo(m_Position.x,m_Position.y+16);
 //恢复先前的繪圖方式
 pDC->SetROP2(nDrawMode);*/

 CDC* pDC=GetDC();

 //設置R2_NOTXORPEN繪圖方式
 int nDrawMode=pDC->SetROP2(R2_NOTXORPEN);
 if(m_bCursorOn)
 {
  //覆蓋先前的光標線
  pDC->MoveTo(m_Position.x,m_Position.y);
  pDC->LineTo(m_Position.x,m_Position.y+16);
 }
 else
 {
  m_bCursorOn=true;
 }
 //繪制新的光標線
 m_Position =point;
 pDC->MoveTo(m_Position.x,m_Position.y);
 pDC->LineTo(m_Position.x,m_Position.y+16);
 //恢复先前的繪圖方式
 pDC->SetROP2(nDrawMode);

}
void CChap5CView::OnTimer(UINT nIDEvent)
{
 CDC* pDC=GetDC();
 switch(nIDEvent)
 {
 case 1://標識為1的計時器
  {
  m_bCursorOn=!m_bCursorOn;
  //設置R2_NOTXORPEN繪圖方式
  int nDrawMode=pDC->SetROP2(R2_NOTXORPEN);
  //覆蓋先前的光標線
  pDC->MoveTo(m_Position.x,m_Position.y);
  pDC->LineTo(m_Position.x,m_Position.y+16);
  pDC->SetROP2(nDrawMode);
  }
  break;
 case 2://標識為2的計時器
  {
  //char tbuf[20];
  //m_nCount+;
  //sprintf(tbuf,"%d",m_nCount);
  CString tbuf;
  tbuf=(char)m_nCount;
  pDC->TextOutW(20,20,tbuf);
  }
  break;
 default:
  break;
 }
}
BOOL CChap5CView::Create(LPCTSTR lpszClassName,LPCTSTR lpszWindowName,
       DWORD dwStyle,const RECT& rect,
       CWnd* pParentWnd,UINT nID,
       CCreateContext* pContext)
{
 int ret=CWnd::Create(lpszClassName,lpszWindowName,dwStyle,rect,pParentWnd,nID,pContext);
 //申請兩個計時器,標識為別為1,2,間隔時間分別為500,1000
 ASSERT(SetTimer(1,500,NULL)!=0);
 ASSERT(SetTimer(2,1000,NULL)!=0);
 return ret;

}

BOOL CChap5CView::DestroyWindow()
{
 //使計時器1和2停止傳送WM_TIMER消息
 KillTimer(1);
 KillTimer(2);
 return CView::DestroyWindow();
}


5.菜單
SDI程序的命令傳遞順序為:
視->文檔->SDI主框架窗口->應用程序
MDI程序的命令傳遞順序為:
視->文檔->MDI子框架窗口->MDI主框架窗口應用程序.

消息處理命令:
在視類頭文件中添加函數聲明:
afx_msg void OnEditCut();
在實現文件中:
BEGIN_MESSAGE_MAP(CTestView,CView)
ON_COMMAND(ID_EDIT_CUT,OnEditCut)
END_MESSAGE_MAP()
void CTestView::OnEditCut()
{

}

更新命令用戶接口(UI)消息
在視類頭文件中添加函數聲明:
afx_msg void OnUpdateEditCut(CCmdUI* pCmdUI);
在實現文件中:
BEGIN_MESSAGE_MAP(CTestView,CView)
ON_UPDATE_COMMAND_UI(ID_EDIT,OnUpdateEditCut)
END_MESSAGE_MAP()

void CTestView::OnUpdateEditCut(CCmdUI* pCmdUI)
{
 //更新
 pCmdUI->Enable(m_bHaveData);
}

擴展命令和范圍命令的處理
ON_COMMAND_EX(id1,memberFnx)
ON_COMMAND_EX(id2,memberFnx)

ON_COMMAND_RANGE(id1,id2,memberFnx)
ON_UPDATE_COMMAND_UI_RANGE(id1,id2,UpdatememberFnx)

ClassWizard不支持擴展命令消息和范圍命令消息.這些消息要放在//{{AFX_MSG_MAP和//{{AFX_MSG_MAP括號對之外.
程序員必須自已編寫消息映射.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新房装修物业电梯用不了费用怎么办 在京东拼购没有拼成已付款的怎么办 微信上买东西发的货不一样怎么办 微信买东西收到货不付款怎么办 京东商品店家待出库不发货怎么办 微信二维码付款多付了怎么办 微信二维码付款付错了怎么办 身份证被移动公司拉黑了怎么办 微店申请退款卖家不同意怎么办 淘宝退货快递把我名字填错了怎么办 刚申请淘宝店信用为零怎么办 淘宝买家已付款卖家不做皮单怎么办 淘宝店铺被屏蔽7天后该怎么办 香信得登录密码忘了怎么办 苹果手机迅雷下载不了的资源怎么办 快手官方私信你的作品违规了怎么办 顺丰生鲜速配食物坏了怎么办 半年汽车没有年检 交警抓到怎么办 没年检的车子被交警抓到怎么办 去年检的路上被交警抓了怎么办 微信聊天界面群聊删除找不到怎么办 微博抽奖的奖品没发货怎么办 两个微信号绑了一个手机号怎么办 欧月玫瑰花朵叶子上有白粉怎么办 进对方空间被挡不想让他知道怎么办 qq上买东西给钱了对方没给怎么办 微信钱包手势密码忘记了怎么办 买家一起拍了两件宝贝怎么办 宿雾航空付款无法显示验证码怎么办 不小心把购物车的东西删了怎么办 微信在别人电脑登录忘退出怎么办 微信电脑版忘了退出怎么办 给微商交了定金不给退怎么办 方舟手游飞龙驯服时间不够怎么办 淘宝上买了假货找不到商家怎么办 魅蓝手机一直在开机画面怎么办 在实体店买的手机想退怎么办 淘宝买了东西发货了不想要了怎么办 快递已经发货了不想要了怎么办 锤子手机买了不到十天碎屏了怎么办 唯品会新人专享优惠卷过期了怎么办