1、 创建“图形”、“颜色”、“线的类型”、“线宽度”子菜单。
(1) 在新建的工程中“ResourceView”中打开Menu选项,在空白中添加这几项。
(2) 在“图形”下拉菜单中依次添加“椭圆”、“矩形”、“曲线”,并且依次设置ID分别为:ID_ELLIPSE,ID_RECTANGLE,ID_CURVES。
(3) 在“颜色”下拉菜单中依次添加“红色”,“绿色”,“蓝色”,“白色”和“黑色”。并设置其ID分别为ID_COLORRED,ID_COLORGREEN,ID_COLORBLUE,ID_COLORBLACK,ID_COLORWHITE。
(4) 在“线的类型”下拉菜单中依次添加“实线”和“虚线”。其ID分别是ID_LINESOLID,ID_LINEDOT
(5) 在“线宽度”下拉菜单中创建“1”和“2”,其ID分别设为ID_LINEWIDE1,ID_LINEWIDE2。
编译,运行后效果如下:
2、 响应菜单栏中的“图形”下拉子菜单的消息
响应椭圆(ID_ELLIPSE)矩形(ID_RECTANGLE)
(1)、首先在view类中添加变量
BOOL m_ISPointup; //鼠标左键弹起
BOOL m_ISPointdown; //鼠标左键按下
CPoint m_pointup; //鼠标左键弹起的位置
CPoint m_pointdown; //鼠标左键按下的位置
BOOL m_ClickRectangle; //判断是否画矩形
BOOL m_ClickEllipse; //判断是否画椭圆
Int flage;//菜单选项被标记的标志
(2)、在view类中对这些变量初始化
m_pointdown = 0; //原点
m_pointup = 0;
m_ISPointup = FALSE; //未按下
m_ISPointdown = FALSE;
flag = 0;
(3)、响应ID_ELLIPSE和ID_RECTANGLE的command和update消息
void CYangwei20090810229View::OnEllipse()
{
// TODO: Add your command handler code here
flag++;
m_ClickEllipse = TRUE;
m_ClickRectangle = FALSE;
m_ClickCurves = FALSE;
}
void CYangwei20090810229View::OnRectangle()
{
// TODO: Add your command handler code here
flag++;
m_ClickEllipse = FALSE;
m_ClickRectangle = TRUE;
m_ClickCurves = FALSE;
}
void CYangwei20090810229View::OnUpdateEllipse(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(flag%2==0);
if(255 == flag)
{
flag = 1;
}
void CYangwei20090810229View::OnUpdateRectangle(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(flag%2==1);
}
(3)、响应WM_LBUTTONDOWN消息,此时记下该点位置,并表示按下状态,添加代码:
void CYangwei20090810229View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_pointdown = point;
m_ISPointdown = TRUE;
m_ISPointup = FALSE;
CView::OnLButtonDown(nFlags, point);
}
(4)、响应WM_LBUTTONUP消息记下此点位置,虽然在此程序中未用到改点。
void CYangwei20090810229View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_pointup = point;
CDC *pDC=GetDC();
CBrush *pnew = CBrush::FromHandle((HBRUSH)GetStockObject(HOLLOW_BRUSH));//获得空画刷
CBrush *pold = pDC->SelectObject(pnew); //选择新建画刷
CPen newpen(m_penstyle,m_linewide,RGB(m_pen.red,m_pen.green,m_pen.blue));//创建自定义的画笔,这里的m_pen是自己写的结构
CPen *poldpen = pDC->SelectObject(&newpen); //选择自定义的画笔
if(m_ClickEllipse)
{
pDC->Ellipse(m_pointdown.x,m_pointdown.y,point.x,point.y);
}
if(m_ClickRectangle)
{
pDC->Rectangle(m_pointdown.x,m_pointdown.y,point.x,point.y);
}
pDC->SelectObject(poldpen);
pDC->SelectObject(pold);
m_ISPointup = TRUE;
m_ISPointdown = FALSE;
CView::OnLButtonUp(nFlags, point);
}
响应曲线(ID_CURVES)
(1)、响应ID_CURVES的command消息
void CYangwei20090810229View::OnCurves()
{
// TODO: Add your command handler code here
m_ClickCurves = TRUE; //代表曲线被选择
m_ClickEllipse = FALSE;
m_ClickRectangle = FALSE;
}
响应WM_MOUSEMOVE消息
void CYangwei20090810229View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_ISPointdown && m_ClickCurves)
{
CClientDC dc(this);
CPen pen(m_penstyle,m_linewide,RGB(m_pen.red,m_pen.green,m_pen.blue));
CPen *pold = dc.SelectObject(&pen);
dc.MoveTo(m_pointdown);
dc.LineTo(point);
m_pointdown = point;
dc.SelectObject(pold);
}
CView::OnMouseMove(nFlags, point);
}
对于颜色菜单,首先在view类中的头文件中定义一个结构体
struct myColor
{
int red;//红色
int green;//绿色
int blue;//蓝色
};
向view类中添加myColor m_pen; //画笔的颜色
初始化黑色
m_pen.red = 0;
m_pen.green = 0;
m_pen.blue = 0;
响应红色ID_COLORRED的command消息
void CYangwei20090810229View::OnColorred()
{
// TODO: Add your command handler code here
m_pen.red = 255;
m_pen.green = 0;
m_pen.blue = 0;
}
其他的颜色道理一样,只要知道各种颜色的三原色各自的值并且赋给他们即可,不再详述
对于线的类型:
在view类中添加变量m_penstyle并在构造函数中初始化
m_penstyle =PS_SOLID;//线类型实线
然后响应实线ID_LINESOLID的command消息
void CYangwei20090810229View::OnLinesolid()
{
// TODO: Add your command handler code here
m_penstyle = PS_SOLID;
}
对于虚线响应ID_LINEDOT消息
void CYangwei20090810229View::OnLinedot()
{
// TODO: Add your command handler code here
m_penstyle = PS_DOT;
}
对于线宽 1,2分别响应ID_LINEWIDE1和ID_LINEWIDE2的command消息
void CYangwei20090810229View::OnLinewide1()
{
// TODO: Add your command handler code here
m_linewide = 1;//线宽1
}
void CYangwei20090810229View::OnLinewide2()
{
// TODO: Add your command handler code here
m_linewide = 2;//线宽2
}
3、 响应工具栏的的各种图形消息
如椭圆
在ResourceView页面中,双击Toolbar文件夹,可以看到有一个ID位ID_MAINFRAME的工具栏。双击ID_MAINFRAME工具栏,在工具栏编辑框中出现如下图所示的工具栏。
在工具栏的最右边有一空白按钮,双击该按钮,弹出对话框如下图,其中ID选择ID_ELLIPSE,即“椭圆”按钮。该按钮显示在编辑窗口中,可以通过Graphics和Colors工具箱及鼠标画自己的图标。(矩形工具栏图标同椭圆方法)
其他图形一样。
4、 响应右击菜单消息
a) 在工作区的ResourceView选项卡中,右击Menu文件夹,在弹出菜单中选择插入菜单便可创建一个新的菜单资源,其ID为IDR_MENU1。右击IDR_MENU1,在弹出菜单中选择属性,修改其ID为IDR_POPMENU。双击IDR_POPMENU资源进入编辑对话框,对弹出式菜单进行编辑,,完成后的菜单资源如图:
b) 添加代码,实现鼠标右键单击时显示弹出式菜单。在查看菜单项中选择建立类向导来添加右键单击弹出式菜单WM_CONTEXTMENU及消息处理函数,这时MFC会发现创建了一个新资源,将询问是否创建一个新类,取消后,弹出下图对话框,选择ID为CExyangwei20090810229View,Messages为WM_CONTEXTMENU,双击该消息或单击Add Function按钮,将为该消息添加默认处理函数,单击Edit Code按钮进入OnContextMenu()函数,对其进行编辑。
void CYangwei20090810229View::OnContextMenu(CWnd*, CPoint point)
{
// CG: This block was added by the Pop-up Menu component
{
if (point.x == -1 && point.y == -1){
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(CG_IDR_POPUP_YANGWEI20090810229_VIEW));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
}
其中响应画各种图形的方法与工具栏中的做法差不多
对于清空消息ID_UPDATE
void CYangwei20090810229View::OnUpdate()
{
// TODO: Add your command handler code here
Invalidate();
UpdateWindow();
}
5、 下面美化状态栏
(1)、将状态栏的提示器改成自己的东西,在这里我改成了作者和日期
即2011-4-2 made by Veiker.其实就是在ResourseView中的StringTable中找到
AFX_IDS_IDLEMESSAGE 将其属性改下
(2)、修改状态栏中的提示器
让状态栏显示鼠标箭头的位置,CTRL键是否按下,时间、进度条
A、 在Stringtable中添加对应的ID
B、 在Frame类构造函数中的indicators数组中添加ID(对应ID如下显示)
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_XY, //显示鼠标位置
ID_INDICATOR_CTRL,//显示CTRL键是否按下
ID_INDICATOR_TIME,//显示时间
ID_INDICATOR_PROG,//显示进度条
ID_INDICATOR_NUM,//显示数字
};
显示鼠标位置:
响应WM_MOUSEMOVE 由于前面响应过这里只要向里面添加代码
CString str;
str.Format("x=%d,y=%d",point.x,point.y);
CMainFrame*pMainFrame=(CMainFrame*)(AfxGetApp()->GetMainWnd());
pMainFrame->m_wndStatusBar.SetPaneText(1,str);
注意:包含MainFrm.h
显示CTRL键是否按下在View类中的消息注释宏中添加
ON_UPDATE_COMMAND_UI(ID_INDICATOR_CTRL,OnUpdateKeyCtrl)
然后响应函数
void CYangwei20090810229View::OnUpdateKeyCtrl(CCmdUI* pCmdUI)
{
pCmdUI->Enable(::GetKeyState(VK_CONTROL)<0); //更新状态指示器
}
显示时间
在frame类中OnCreate()中添加
SetTimer(1,1000,NULL);
CTime time = CTime::GetCurrentTime();
CString str = time.Format("%H:%M:%S");
m_wndStatusBar.SetPaneText(3,str);
响应WM_TIMER消息
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CTime time = CTime::GetCurrentTime();
CString str = time.Format("%H:%M:%S");
m_wndStatusBar.SetPaneText(3,str);
CFrameWnd::OnTimer(nIDEvent);
}
显示进度条:
在frame类中添加变量CProgressCtrl m_Process;
响应WM_PAINT消息
void CMainFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
m_wndStatusBar.GetItemRect(4,&rect);
if(m_Process.m_hWnd)
{
m_Process.SetWindowPos(NULL,rect.left,rect.top,rect.Width(),rect.Height(),SWP_NOZORDER);
}
else{
m_Process.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar,111);
}
// Do not call CFrameWnd::OnPaint() for painting messages
}
向OnTimer()中添加m_Process.StepIt();
三、 运行后总体效果:
源代码:见附件
- 大小: 2.2 KB
- 大小: 4 KB
- 大小: 3.6 KB
- 大小: 3.5 KB
- 大小: 1.3 KB
- 大小: 694 Bytes
- 大小: 4.9 KB
- 大小: 4.9 KB
- 大小: 27.2 KB
- 大小: 31.9 KB
分享到:
相关推荐
给出了各种关于菜单、工具栏和状态栏编程实例,类容涵盖了平时所见到的各种菜单、工具栏和状态栏的编程过程,如果有需要学习菜单、工具栏和状态栏编程的,极力推荐下载本资源,(所包含的实例均是从光盘上直接拷出来...
### MFC状态栏编程 1. **创建状态栏** 首先,需要在StringTable资源中添加新条目,如IDS_TIMER和PROGRESS。在主框架类的`OnCreate`函数中,修改`indicators`数组以包含这些条目的索引。 2. **显示系统时间** ...
通过本实验,我们学习了如何在 MFC 编程中使用菜单、工具栏、状态栏,并且了解了如何在应用程序中实现菜单、工具栏、状态栏的联动功能。 六、知识点总结 * 菜单的使用方法 * 工具栏的使用方法 * 状态栏的使用方法 ...
在编程领域,尤其是在Windows应用程序开发中,菜单、工具栏和状态栏是用户界面(UI)设计中的关键元素。这些组件提供了用户与程序交互的主要方式,使得软件更加易用且功能丰富。以下是对“菜单、工具栏和状态栏20例...
本篇文章将详细介绍如何利用MFC进行状态栏编程。 一、状态栏的基本概念与作用 状态栏主要由一系列的“部分”(Panels)组成,每个部分可以显示不同的信息。例如,一个部分可能用于显示光标位置,另一个部分则可以...
本篇将详细介绍MFC中的三个重要组件:菜单栏、工具栏和状态栏,以及如何在MFC应用程序中使用它们。 **菜单栏** 菜单栏是用户界面中常见的元素,它位于窗口的顶部,通常包含一系列下拉菜单,每个菜单项对应一个操作...
包含了一个或多个C++源文件(.cpp)和头文件(.h),通过分析这些代码,你可以深入理解MFC如何处理菜单和工具栏的创建、响应用户交互,以及状态栏更新。 以上就是这个MFC开发示例中涉及的关键知识点。通过学习和...
总结来说,对话框界面编程涉及多个方面,包括菜单、工具栏和状态栏的创建与管理,以及对话框背景的定制。熟练掌握这些技术,能帮助开发者构建出更加专业且用户友好的Windows应用程序。通过不断实践和学习,你可以...
在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)库,特别是如何创建和管理菜单栏、工具栏,以及如何处理配置文件和注册表操作。MFC是微软为Windows应用程序开发提供的一套C++类库,它封装了Windows ...
然后,通过SetToolBarBits函数或重载OnUpdateUI函数,根据菜单项的状态自动更新工具栏按钮的状态。 6. **响应消息**:最后,确保你的消息映射包含对工具栏按钮点击的处理。这通常涉及到定义ON_COMMAND或ON_UPDATE_...
通过以上步骤,你可以实现对话框中工具栏和菜单栏状态的同步更新,从而提供一致且直观的用户界面。这不仅增强了用户体验,也减少了因操作不可用导致的误操作可能性。记住,良好的编程实践总是关注细节和用户体验,这...
在本文中,我们将深入探讨如何在Visual Studio 2010中使用MFC(Microsoft Foundation Classes)库创建基于对话框的应用程序,并添加自定义的工具栏和状态栏。MFC是一个C++类库,它提供了封装Windows API的能力,使得...
- 在VC中,可以使用MFC类库中的成员函数来控制菜单项和工具栏按钮的启用/禁用状态。例如,`CMenu::EnableMenuItem()` 用于设置菜单项的启用状态,`CWnd::EnableWindow()` 用于控制按钮的可用性。 - 通常,这些状态...
5. **菜单、工具栏和状态栏**:阐述如何添加和管理菜单、工具栏及状态栏,以增强用户交互体验。 6. **文件操作**:讲解MFC如何处理文件操作,包括打开、保存对话框,以及读写二进制和文本文件。 7. **数据库编程**...
在C++编程中,创建和使用菜单、工具栏以及状态栏是构建图形用户界面(GUI)应用程序的关键部分。这些元素提供了用户与程序交互的直观方式。以下是对标题和描述中涉及知识点的详细解释: 1. **菜单(Menu)**: - ...
这个教程涵盖了一系列关键概念,包括绘图、应用管理、菜单设计、工具栏创建以及视图处理,这些都是构建用户界面和交互功能的核心部分。 1. 绘图:在MFC中,绘图通常涉及到CDC(设备上下文)类,它提供了基本的图形...
在IT领域,创建一个带有菜单、工具栏和状态栏的对话框是常见的用户界面设计实践。这样的设计可以提供丰富的交互性,使用户能够更高效地访问功能和获取反馈信息。以下将详细介绍这些元素以及如何在实际开发中实现它们...
在编程领域,尤其是在Windows应用程序开发中,菜单、工具栏和状态栏是用户界面的重要组成部分,它们极大地提升了用户体验和交互性。本章将深入探讨在Visual C++环境中如何使用这些元素来构建用户友好的应用程序。 ...