MFC快捷菜单以及位图的加载和移动操作
文章目錄
- 一、效果:
- (一)畫直線
- (二)畫矩形
- 二、基本介紹
- (一)功能實現(xiàn)用到的方法
- (二)環(huán)境描述
- 三、實現(xiàn)過程
- (一)主編框調(diào)整
- (二)快捷菜單的使用
- 1、添加快捷菜單資源
- 2、類向?qū)Ю锾砑酉鄳?yīng)的消息處理函數(shù)
- 3、為快捷菜單下的子菜單添加處理函數(shù)
- 4、快捷菜單加載
- 5、畫直線和矩形
- (三)位圖的加載和使用
- 1、添加icon資源
- 2、Timer計時器
- 3、InvalidateRect(icon_rect,true);函數(shù)
- 4、位圖移動核心代碼:
- 四、總結(jié)
功能要求:自行設(shè)計一個位圖,然后令位圖沿著直線和矩形的邊界移動
一、效果:
(一)畫直線
(二)畫矩形
二、基本介紹
(一)功能實現(xiàn)用到的方法
-
MFC主邊框的調(diào)整
-
菜單欄的操作
-
快捷菜單的操作
-
計時器的基本使用
-
InvalidateRect(icon_rect,true);函數(shù)的使用
-
位圖的加載和使用
菜單欄的操作在我之前的一篇blog里,這里不再進(jìn)行贅述
地址如下
MFC對話框、菜單欄、工具欄、控件的創(chuàng)建和基本使用
(二)環(huán)境描述
環(huán)境:visual studio 2010
三、實現(xiàn)過程
(一)主編框調(diào)整
首先是重設(shè)一下主邊框
位置在CMainFrame.cpp里的CMainFrame::PreCreateWindow函數(shù)里
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;// TODO: 在此處通過修改// CREATESTRUCT cs 來修改窗口類或樣式// 設(shè)置窗口大小cs.cx=800;cs.cy=600;// 將最小化按鈕無效cs.style&=~WS_MINIMIZEBOX;//無法改變視窗尺寸// cs.style&=~WS_THICKFRAME;//最大化窗口按鈕失效//cs.style&=~WS_MAXIMIZEBOX;return TRUE; }(二)快捷菜單的使用
1、添加快捷菜單資源
2、類向?qū)Ю锾砑酉鄳?yīng)的消息處理函數(shù)
在類向?qū)Ю锾砑覹M_CONTEXTMENU消息的處理函數(shù)
3、為快捷菜單下的子菜單添加處理函數(shù)
4、快捷菜單加載
void Cthird4View::OnContextMenu(CWnd* /*pWnd*/, CPoint point) {// TODO: 在此處添加消息處理程序代碼CMenu menu;// 加載快捷菜單menu.LoadMenuW(IDR_POPUP_MENU);CMenu *pMenu=menu.GetSubMenu(0);// 彈出快捷菜單pMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); }5、畫直線和矩形
void Cthird4View::OnPopupLine() {// TODO: 在此添加命令處理程序代碼CDC *pDC=GetDC();CRect rect;GetClientRect(&rect);pDC->MoveTo(rect.right/2-200,rect.bottom/2);pDC->LineTo(rect.right/2+200,rect.bottom/2);// 設(shè)置位圖的初始位置icon_pos.x=rect.right/2-130;icon_pos.y=rect.bottom/2-3;// 設(shè)置icon周圍的邊框icon_rect.right=icon_pos.x+10;icon_rect.left=icon_pos.x-27.0;icon_rect.bottom=icon_pos.y+42;icon_rect.top=icon_pos.y+7;// 設(shè)置畫線為type=0type=0; }void Cthird4View::OnPopupRect() {// TODO: 在此添加命令處理程序代碼CDC *pDC=GetDC();CRect rect;// 獲得客戶區(qū)的數(shù)據(jù)GetClientRect(&rect);// 選擇透明畫刷CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));pDC->SelectObject(pBrush);pDC->Rectangle(rect.right/2-150,rect.bottom/2-150,rect.right/2+150,rect.bottom/2+150);// 設(shè)置位圖的初始位置icon_pos.x=rect.right/2-176;icon_pos.y=rect.bottom/2-196;// 設(shè)置icon周圍的邊框icon_rect.right=icon_pos.x+4;icon_rect.left=icon_pos.x-21.0;icon_rect.bottom=icon_pos.y+42;icon_rect.top=icon_pos.y+7;// 設(shè)置畫矩形為type=0type=1; }icon_pos和icon_rect是為之后的位圖設(shè)定的參數(shù)
在類視圖里直接添加變量即可
類型如下
CPoint icon_pos; CRect icon_rect;(三)位圖的加載和使用
1、添加icon資源
在資源視圖里為添加icon即可,工具欄在上方
2、Timer計時器
類視圖里的WM_TIMER是計時器的消息
OnBeginMove()和OnStopMove()函數(shù)是菜單欄里計時器的處理函數(shù)
其代碼如下
3、InvalidateRect(icon_rect,true);函數(shù)
接下就是位圖移動的重點動作了
這個時候需要先介紹InvalidateRect(icon_rect,true);函數(shù)
簡單來說就是調(diào)用這個函數(shù)之后,會用背景色填充icon_rect所表示的矩形區(qū)域
更加詳細(xì)的原理分析和其他問題網(wǎng)上相關(guān)文章較多
請讀者自行查找
這里列出幾篇不錯的文章
https://blog.csdn.net/u011580175/article/details/56354223
https://blog.csdn.net/harvic880925/article/details/8963711?locationNum=11
4、位圖移動核心代碼:
void Cthird4View::OnTimer(UINT_PTR nIDEvent) {// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值if(nIDEvent==1){//如果要沿矩形移動if(type==1){CDC *pDC=GetDC();// 加載位圖HICON icon;icon=AfxGetApp()->LoadIconW(IDI_MYICON);CRect rect,newRect;// 獲取客戶區(qū)數(shù)據(jù)GetClientRect(&rect);newRect=icon_rect;// 矩形的上邊界if(icon_pos.x>rect.right/2-229&&icon_pos.x<rect.right/2+166&&icon_pos.y<=rect.bottom/2-196){if(flag==0){// newRect向右移動newRect.right+=offset;newRect.left+=offset;// 重繪icon_rect區(qū)域InvalidateRect(icon_rect,true);// 繪制位圖pDC->DrawIcon(icon_pos,icon);// icon向右移動icon_pos.x+=offset;}else{newRect.right+=offset;newRect.left+=offset;// 重繪icon_rect區(qū)域InvalidateRect(icon_rect,true);// icon向右移動icon_pos.x+=offset;// 繪制位圖pDC->DrawIcon(icon_pos,icon);}// 更新icon_rect 區(qū)域icon_rect=newRect;}// 矩形的右邊界else if(icon_pos.x>=rect.right/2+150&&icon_pos.y>=rect.bottom/2-196&&icon_pos.y<=rect.bottom/2+126){// 重繪newRect區(qū)域InvalidateRect(newRect,true);// 設(shè)置轉(zhuǎn)向if(flag==0){// newRect向右移動newRect.right+=offset;newRect.left+=offset;flag=1;}else{// newRect向下移動newRect.top+=offset;newRect.bottom+=offset;// icon向下移動icon_pos.y+=offset;}// 繪制位圖pDC->DrawIcon(icon_pos,icon);// 更新icon_rect 區(qū)域icon_rect=newRect;}// 矩形的下邊界else if(icon_pos.x>=rect.right/2-190&&icon_pos.x<=rect.right/2+226&&icon_pos.y>=rect.bottom/2+104){// newRect向左移動newRect.right-=offset;newRect.left-=offset;// 重繪icon_rect區(qū)域InvalidateRect(icon_rect,true);// icon向左移動icon_pos.x-=offset;// 繪制位圖pDC->DrawIcon(icon_pos,icon);// 更新icon_rect 區(qū)域icon_rect=newRect;}// 矩形的左邊界else if(icon_pos.x<=rect.right/2+150&&icon_pos.y>=rect.bottom/2-176&&icon_pos.y<=rect.bottom/2+166){// newRect向上移動newRect.top-=offset;newRect.bottom-=offset;// 重繪icon_rect區(qū)域InvalidateRect(icon_rect,true);// icon向上移動icon_pos.y-=offset;// 繪制位圖pDC->DrawIcon(icon_pos,icon);// 更新icon_rect 區(qū)域icon_rect=newRect;}}//如果要沿直線移動if(type==0){CDC *pDC=GetDC();//加載位圖HICON icon;icon=AfxGetApp()->LoadIconW(IDI_MYICON);pDC->DrawIcon(icon_pos,icon);// 獲得客戶區(qū)的數(shù)據(jù)CRect rect,newRect;GetClientRect(&rect);// newRect區(qū)域移動newRect=icon_rect;newRect.right+=offset;newRect.left+=offset;// 到邊界時反向if(icon_pos.x<rect.right/2-190||icon_pos.x>rect.right/2+150)offset=-offset;// 重繪icon_rect區(qū)域InvalidateRect(icon_rect,true);// 更新icon_recticon_rect=newRect;// icon向左移動icon_pos.x+=offset;}}CView::OnTimer(nIDEvent); }其中的flag參數(shù)也是添加的變量,類型為bool
四、總結(jié)
本章節(jié)重點講述了快捷菜單和位圖的相關(guān)操作
如果本文對老鐵們有幫助的話請給個三連叭~~
總結(jié)
以上是生活随笔為你收集整理的MFC快捷菜单以及位图的加载和移动操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微型计算机P42.4G表示,在微型计算机
- 下一篇: mybatis的resultMap配置详