日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC快捷菜单以及位图的加载和移动操作

發(fā)布時間:2024/3/24 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC快捷菜单以及位图的加载和移动操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

      • 一、效果:
        • (一)畫直線
        • (二)畫矩形
      • 二、基本介紹
        • (一)功能實現(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ù)


其代碼如下

void Cthird4View::OnBeginMove() {// TODO: 在此添加命令處理程序代碼//設(shè)為70時比較流暢SetTimer(1,70,NULL); }void Cthird4View::OnStopMove() {// TODO: 在此添加命令處理程序代碼KillTimer(1); }
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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。