本来希望通过vbs实现桌面随机位置弹窗的功能,奈何msgbox只能在屏幕中间弹窗,并且会随着弹窗数量增多往桌面右下角移动。本人没学过VBScript,要修改其弹窗位置似乎非常麻烦。于是转向熟悉的MFC,在愚人节当天研究了一天之后实现了,效果可以看动图。只要你有下载VS,本文手把手教你制作这样一个弹窗程序。

1.新建基于对话框的MFC项目,添加主对话框

①以VS2013为例,新建项目,选择MFC应用程序,项目名随便取,点击确定。

②进入向导,点击下一步,根据图片所示设置,再点下一步

③保留粗框架,取消系统菜单,对话框标题可以现在修改,后面也可以再改,点击下一步④取消所有功能,用不上,点击下一步

⑤默认就行,点击完成后就创建好了

⑥出现主对话框的资源视图,拖动可以修改该对话框大小,TODO什么的这个可以直接点击后按Delete键删除,取消按钮也可以删除,保留确定按钮就行,点击对话框的标题栏,在右下角的属性中Caption可以修改标题,同样的,点击确定按钮,可以在右下角的属性里更改按钮名字。最后双击这个按钮,会添加一个响应事件,并且会跳到代码过去。这样我们的准备工作就完成了。

2.添加子对话框

①在第一步中,我们生成了主对话框,这是创建项目时就已经添加好的,但还需准备一个用于弹出来的对话框,称为子对话框。在右侧解决方案资源管理器中右击项目名>添加->类,在弹出来的添加类对话框中输入类名,如图为Son,基类选择CDialogEX或者CDialog都可以,点击完成会生成Son的.h文件和.cpp文件,注意在整个项目编写过程中,我们只会编辑到如图4个红框的文件,其他文件不需要编辑。

②创建完之后,我们可以在右侧的解决方案资源管理器下边选择资源视图,查看新建的对话框,而下面那个IDD_TANCUANG_DIALOG是我们第一次创建的那个主对话框。双击IDD_SON进入子对话框的编辑。

③这里我们删除确定和取消按钮,并从上面菜单栏中的视图,选择工具箱调出,选择Static Text拉出来放到对话框里,可以调整其大小。点击Static Text,在右下角的属性栏中的默认ID_STATIC改成ID_XXX之类的,如图我改为ID_WORD.只有改ID了这个控件才允许添加变量。

④右键放上去的静态文本,选择添加变量,在弹出来的对话框中做如图修改,选择value,CString类型,取一个变量名m_word,点击完成

⑤在右侧回到解决方案资源管理器,显示.h和.cpp文件列表,找到Son.cpp双击打开,添加如图所示的一行代码,其中XXX即为弹出的对话框显示的内容,可以自定义,当然,如果你懂点编程,可以扩展一下,设置多条内容,以不同概率弹出。

void Son::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_WORD, m_word);SetDlgItemText(IDC_WORD, _T("XXX"));   //添加此行代码
}

⑥双击tancuangDlg.h,包含子对话框头文件,并实例化一个指针对象,如果按照上述流程做的话可以直接把原来的代码删除,将以下代码覆盖上去。

#pragma once
#include "Son.h"    //包含子对话框的头文件// CtancuangDlg 对话框
class CtancuangDlg : public CDialogEx
{
// 构造
public:CtancuangDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据enum { IDD = IDD_TANCUANG_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:Son *m_Son;    //实例化指针对象afx_msg void OnBnClickedOk();
};

⑦双击tancuangDlg.cpp并拉到最下面的OK函数,在函数内添加以下内容

srand((unsigned int)time(NULL));//随机数种子for (int i = 0; i < 100; i++)//弹出次数,当前为100{m_Son = new Son(this);//开辟空间m_Son->Create(IDD_SON, this);//创建对象CRect rcDlgs;m_Son->GetWindowRect(rcDlgs);  //得到对话框的Rect 对话框的大小ScreenToClient(rcDlgs);int  cx = GetSystemMetrics(SM_CXSCREEN);  //获得屏幕的分辨率int  cy = GetSystemMetrics(SM_CYSCREEN);int rx = rand() % cx + rcDlgs.Width();//x方向变化量int ry = rand() % cy + rcDlgs.Height();//y方向变化量m_Son->MoveWindow(rx - rcDlgs.Width(), ry - rcDlgs.Height(), rcDlgs.Width(), rcDlgs.Height(), TRUE);//设置对话框位置m_Son->ShowWindow(SW_SHOW);//弹出对话框m_Son->UpdateWindow();//刷新对话框,否则对话框的内容不会实时显示}

如果不懂,就将下述代码全部复制,覆盖到tancuangDlg.cpp中


// tancuangDlg.cpp : 实现文件
//#include "stdafx.h"
#include "tancuang.h"
#include "tancuangDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// CtancuangDlg 对话框CtancuangDlg::CtancuangDlg(CWnd* pParent /*=NULL*/): CDialogEx(CtancuangDlg::IDD, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CtancuangDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CtancuangDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK, &CtancuangDlg::OnBnClickedOk)
END_MESSAGE_MAP()// CtancuangDlg 消息处理程序BOOL CtancuangDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);           // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标// TODO:  在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CtancuangDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CtancuangDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CtancuangDlg::OnBnClickedOk()
{// TODO:  在此添加控件通知处理程序代码srand((unsigned int)time(NULL));for (int i = 0; i < 200; i++){m_Son = new Son(this);m_Son->Create(IDD_SON, this);CRect rcDlgs;m_Son->GetWindowRect(rcDlgs);  //得到对话框的Rect 对话框的大小ScreenToClient(rcDlgs);int  cx = GetSystemMetrics(SM_CXSCREEN);  //获得屏幕的分辨率int  cy = GetSystemMetrics(SM_CYSCREEN);int rx = rand() % cx + rcDlgs.Width();int ry = rand() % cy + rcDlgs.Height();m_Son->MoveWindow(rx - rcDlgs.Width(), ry - rcDlgs.Height(), rcDlgs.Width(), rcDlgs.Height(), TRUE);m_Son->ShowWindow(SW_SHOW);m_Son->UpdateWindow();}
}

3.输出exe文件

如果按照上述步骤做完,接下来就可以点击调试了。

注意选择Release后再点击本地Windows调试器,等编译完,就会跳出我们的程序了,如下图所示

那么最后一步就是获得exe文件了,随便右击一个文件,打开其所在文件夹,可以看到上面有一个Release的文件夹,打开文件夹,里面那个exe文件就是我们的最终结果啦。

用MFC制作桌面随机位置弹窗相关推荐

  1. 使用VS 2019制作桌面程序的安装包

    使用VS 2019制作桌面程序的安装包 前言 文章中是以.NET 平台下使用C#语言开发的WinForm桌面程序为例,说明安装包制作流程.但根据官方文档的说明,Windows下的其他语言(C++/VB ...

  2. 【脚本项目源码】Python制作桌面宠物,这么可爱的萌宠你不想拥有吗?

    前言 本文给大家分享的是如何通过利用Python制作桌面宠物,废话不多直接开整~ 开发工具 Python版本: 3.6 相关模块: random模块 os模块 cfg模块 sys模块 PyQt5模块 ...

  3. 在deepin系统中制作桌面快捷方式

    在使用deepin-wine 安装一些软件的时候,每次启动都需要到.deepinwine目录下运行deepin-wine xx.exe.笔者在安装过HeidiSql之后,一直苦于这种情况.比较好的解决 ...

  4. html制作动态坐标轴,HTML5 canvas制作动态随机星图

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本篇将会介绍如何用canvas制作动态随机移动的星图啦啦啦 小白在远离小白道路上的第一步就是搭个博客 前言 这次的博文不 ...

  5. php做商品预告,预告:关于php制作桌面软件的方案与未来规划

    网站服务可以让你感觉在0秒的瞬间,网站服务就起来了! 此技术打算应用在未来的php桌面软件,用php直接快速制作桌面软件,看起来和传统软件并无二致, 配合我开发的netbeautify插件,可以用ht ...

  6. MFC制作Windows画图程序(二)

    继<MFC制作Windows画图程序(一)> 文章目录 7 颜色填充功能 8 选择画笔颜色 9 设置画笔粗细 10 将绘制出来的图形保存的实现 11 添加位图 7 颜色填充功能 油漆桶功能 ...

  7. 预告:关于php制作桌面软件的方案与未来规划

    未来的环境体积超小,全部的一切支持自定义,服务可以让你感觉在0秒的瞬间,网站服务就启动了! 此技术打算应用在未来的php软件,用php直接快速制作桌面软件,看起来和传统软件并无二致,基本看不出 配合我 ...

  8. php 网格,php – 在网格上的随机位置设置div

    我试图制作一个占据浏览器窗口宽度100%的网格,首先我不知道如何去做这个网格,其次我想要一个div在该网格中有一个随机位置,但是只有在没有被占用的情况下才填补该位置. 我想我的问题是,如何进行,如果可 ...

  9. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(二)

    今天继续新的专题.主要讲解[利用PYTHON制作桌面版爬虫软件]下的如何实现界面功能(一).该讲主要包括以下三个内容:掌握如何编写主函数,运行界面. 了解pywin32模块. 如何用python识别Q ...

最新文章

  1. Unity 中使用Async-Await替代 coroutines
  2. pycharm与github相配置连接(上传、删除、更新项目)
  3. FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg
  4. Linux的vagrant配置vmware
  5. JVM(3)——JVM类加载器
  6. JDK 7的算法和数据结构
  7. 因特网几个“特殊”IP地址的专门用途
  8. C++ STL里的排序去重函数 超级方便
  9. C语言之数组探究(一):定义、大小、初始化、访问和三要素
  10. MySQL学习日志(二)
  11. django管理界面使用与bootstrap模板使用
  12. C编译中如何向代码中传递一个预定义字串
  13. 基于能量采集的认知无线电时间和功率分配(一)——知识扫盲
  14. 4G标准LTE成争执焦点 中兴华为或以和解收场
  15. 汇编语言简明教程习题答案
  16. 梁宁产品思维学习笔记
  17. [滴滴校招]末尾0的个数
  18. PostgreSQL - 学习/实践
  19. SSM框架实战详细教程(十四)贯穿项目实战之三层架构
  20. android7.1 jack-admin 报错

热门文章

  1. HDU2677 DFS+模拟 Java版
  2. dota里属于英雄们自己的爱情
  3. 怎么样使用yum来安装、卸载jdk
  4. 解决org.apache.catalina.util.LifecycleBase.handleSubClassException 初始化组件[Connector[HTTP/1.1-8080]]失败
  5. tower mac 的使用
  6. 4.确定性推理方法: 自然演绎推理, 归结演绎推理, 鲁滨逊归结原理,归结反演
  7. Single Image Portrait Relighting via Explicit Multiple Reflectance Channel Modeling 论文笔记
  8. php弹窗一次,网站广告弹出层(每天弹出一次)
  9. android mimi自动安装,mimisys pack v0.1
  10. 新版标准日本语中级_第二十五课