掌握VC自定义消息实现与应用技巧

版权申诉
0 下载量 53 浏览量 更新于2024-11-12 收藏 8KB RAR 举报
资源摘要信息:"VC-DEFINE-MESSAGE.rar vc自定义消息" 在Windows应用程序开发中,消息机制是基础且关键的组成部分。消息机制允许应用程序与用户以及其他应用程序交互。在这个过程中,自定义消息提供了一种扩展Windows消息系统的方式,使得开发者可以创建特定的应用需求和功能。VC(Visual C++)作为一种常用的C++集成开发环境,为开发者提供了丰富的API来操作消息。本文将详细介绍如何在VC环境下使用Windows的消息机制来定义和处理自定义消息。 ### 知识点一:Windows消息机制基础 Windows消息机制基于消息队列模型,其中包含发送消息、消息队列以及消息循环等元素。当用户进行如按键、鼠标点击等操作时,系统会将这些操作转化为消息,并发送到应用程序的消息队列中。应用程序通过消息循环不断地检索消息队列,并根据消息类型执行相应的处理代码。 ### 知识点二:Windows消息的类型 Windows消息分为标准消息和自定义消息两大类。标准消息由系统预定义,例如WM_PAINT、WM_CREATE等,它们与特定的用户交互或系统事件相关联。而自定义消息则由开发者根据需要定义,以实现应用程序的特定功能。 ### 知识点三:定义VC自定义消息 在VC中定义自定义消息通常涉及以下步骤: 1. **定义消息标识符**:首先需要定义一个唯一的标识符来表示自定义消息。通常将自定义消息标识符定义为WM_USER+数值的形式,或者使用RegisterWindowMessage函数来注册一个字符串形式的消息。 2. **消息的发送**:使用消息发送函数如PostMessage或SendMessage将消息发送到目标窗口。 3. **消息的处理**:在目标窗口的消息处理函数中处理自定义消息,通常该函数是窗口过程函数(Window Procedure),即WinProc函数。 ### 知识点四:VC中自定义消息的应用场景 自定义消息在各种应用程序中有着广泛的应用。它们可以用于以下场景: - **通信机制**:在父子窗口或多个窗口间传递自定义数据或指令。 - **事件触发**:自定义消息可以作为应用程序内部事件的触发信号。 - **扩展控件功能**:开发者可以通过自定义消息扩展标准控件的功能,满足特定的需求。 ### 知识点五:VC中处理自定义消息的实例 在VC中创建一个窗口并处理自定义消息,需要执行以下几个关键步骤: 1. **定义消息处理函数**:创建一个新的消息处理函数来响应自定义消息。 2. **窗口过程函数中添加消息响应**:在窗口过程函数中添加对自定义消息的判断及处理逻辑。 3. **注册消息(可选)**:使用RegisterWindowMessage注册消息。 4. **发送消息**:在需要的时候,使用PostMessage或SendMessage函数向目标窗口发送自定义消息。 ### 知识点六:文档文件解析 根据提供的压缩包子文件列表,存在一个名为“VC中自定义消息的方法.doc”的文档文件。该文件很可能详细描述了如何在VC中定义和处理自定义消息的具体步骤,包括代码示例、函数用法说明以及最佳实践建议。阅读该文档可以帮助开发者更好地理解和掌握VC自定义消息的定义和应用。 ### 结论 VC自定义消息是Windows应用程序开发中一个非常重要的知识点,它使得开发者可以在Windows消息的基础上创建和实现应用程序特定的功能。通过阅读本文和相关文档,开发者可以学习到如何定义和处理自定义消息,以及自定义消息在实际开发中的应用,从而有效增强应用程序的交互性和功能性。
2023-05-29 上传

VC mfc单文档中代码如下void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); for (int i=0;i<points.size();i++){ color=RGB(rand()%6,rand()%6,rand()%6); r=rand()F+5; br.CreateSolidBrush(color); pDC->SelectObject(&br); pDC->Ellipse(points[i].x-r,points[i].y-r,points[i].x+r,points[i].y+r); br.DeleteObject(); } // TODO: add draw code for native data here } ///////////////////////////////////////////////////////////////////////////// // CMyView printing BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMyView::OnBeginPrinting(CDC* /pDC/, CPrintInfo* /pInfo/) { // TODO: add extra initialization before printing } void CMyView::OnEndPrinting(CDC* /pDC/, CPrintInfo* /pInfo/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMyView diagnostics #ifdef _DEBUG void CMyView::AssertValid() const { CView::AssertValid(); } void CMyView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMyDoc* CMyView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); return (CMyDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMyView message handlers void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default center=point; r=rand()F+5;//r=5~50 color=RGB(rand()%6,rand()%6,rand()%6); points.push_back(center); SetTimer(1,200,NULL); CView::OnLButtonDown(nFlags, point); } void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnLButtonUp(nFlags, point); } void CMyView::rise() { for(int i=0;i<points.size();i++) { points[i].y-=5; if(points[i].y<-r) { points.erase(points.begin()+i); i--; } } } void CMyView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent==1){ RedrawWindow(); rise(); } CView::OnTimer(nIDEvent); },怎么修改此代码能实现每次单击鼠标出现的圆大小和颜色随机,但在圆的上升过程中大小和颜色都为刚开始单击鼠标时的大小和颜色,不会不停的变换。并且前面单击鼠标出现的圆的颜色和大小不会随着后面单击鼠标出现的圆的颜色和大小改变而改变。给出完整步骤及代码

2023-05-29 上传

VC mfc单文档中代码如下void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); for (int i=0;i<points.size();i++){ color=RGB(rand()%256,rand()%256,rand()%256); r=rand()%46+5; br.CreateSolidBrush(color); pDC->SelectObject(&br); pDC->Ellipse(points[i].x-r,points[i].y-r,points[i].x+r,points[i].y+r); br.DeleteObject(); } // TODO: add draw code for native data here } ///////////////////////////////////////////////////////////////////////////// // CMyView printing BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMyView diagnostics #ifdef _DEBUG void CMyView::AssertValid() const { CView::AssertValid(); } void CMyView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMyDoc* CMyView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); return (CMyDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMyView message handlers void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default center=point; r=rand()%46+5;//r=5~50 color=RGB(rand()%256,rand()%256,rand()%256); points.push_back(center); SetTimer(1,200,NULL); CView::OnLButtonDown(nFlags, point); } void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnLButtonUp(nFlags, point); } void CMyView::rise() { for(int i=0;i<points.size();i++) { points[i].y-=5; if(points[i].y<-r) { points.erase(points.begin()+i); i--; } } } void CMyView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent==1){ RedrawWindow(); rise(); } CView::OnTimer(nIDEvent); },运行效果中圆在上升过程中颜色和大小不停的变换,应怎么修改此代码使得圆在上升过程中的大小和颜色不会变换,完整步骤及代码

2023-05-29 上传