文章目录

  • 总体思路
  • 控件开发
    • 系统控件
    • 自定义继承控件
  • 双缓冲区解决闪烁
  • MFC调用Bat文件
  • 常见知识点
    • 文件夹操作
    • MFC接收命令行参数的三种方法
    • MFC获取时间的几种方法
    • MFC 屏蔽ESC和ENTER键关闭对话框
    • 完全退出线程
  • 常见错误
    • Error Cxxx
    • 应用程序无法正常启动0xc000007b解决方法
  • 参考

总体思路

由UI设计界面背景图片、相关按钮图片等,然后在代码中创建关联控件变量。对于无需变化的背景、按钮,可以不设控件变量关联。一般有以下几个步骤:
1.UI设计界面;
2.创建需要变动的控件变量与之关联,并设置透明;
3.加载图片;
4.创建控件相应消息响应函数。

控件开发

系统控件

创建

CStatic ctrl_record_;
CRect rt_record_(614, 196, 794, 376);//创建控件ID,后续可以根据此ID找到控件GetDlgItem(IDC_INPUT_ID)->Invalidate(TRUE)
//pWnd->GetDlgCtrlID() == IDC_RECORD
#define IDC_RECORD        0x10001//SS_NOTIFY--能够接收消息
ctrl_record_.Create(NULL, WS_CHILD | SS_CENTER | SS_CENTERIMAGE | WS_VISIBLE | SS_NOTIFY , rt_record_, this, IDC_RECORD);

透明&消息响应

//定义消息响应函数
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);//消息映射
BEGIN_MESSAGE_MAP(CRiskEstimateDemoDlg, CDialogEx)ON_WM_CTLCOLOR()ON_STN_CLICKED(IDC_RECORD, &CRiskEstimateDemoDlg::OnRecordClicked)
END_MESSAGE_MAP()//设置控件透明
HBRUSH CRiskEstimateDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);// TODO:  在此更改 DC 的任何特性CFont font;// TODO:  如果默认的不是所需画笔,则返回另一个画笔if (nCtlColor == CTLCOLOR_STATIC){if (pWnd->GetDlgCtrlID() == IDC_DISPLAY_FACE || pWnd->GetDlgCtrlID() == IDC_RECORD){font.CreatePointFont(150, _T("Microsoft YaHei"));pDC->SelectObject(&font);pDC->SetBkMode(TRANSPARENT); //透明pDC->SetTextColor(0xffffff);return (HBRUSH)GetStockObject(NULL_BRUSH);}}return hbr;
}

图片加载

//resource.h
#define IDB_PNG_BACKGROUND              110//*.rc
IDB_PNG_BACKGROUND      PNG                     "res\\bg.png"//加载各个控件图片,拖动会重刷
BOOL CRiskEstimateDemoDlg::OnEraseBkgnd(CDC* pDC)
{CDC *pDc = GetDC();//加载背景图LoadImageForCtrl(pDc, IDB_PNG_BACKGROUND, rt_background_.left, rt_background_.top);if (pDc)ReleaseDC(pDc);return TRUE;
}

自定义继承控件

自定义控件可以解决频繁刷新整个界面闪烁的问题.

class CMyStatic : public CStatic
{DECLARE_DYNAMIC(CMyStatic)public:CMyStatic();virtual ~CMyStatic();virtual CMyStatic& SetText(const CString& strText);virtual CMyStatic& SetMyFont(int nSize,const CString& strFont);virtual CMyStatic& SetTextColor(COLORREF crText);protected:afx_msg LRESULT OnSetText(WPARAM,LPARAM);afx_msg HBRUSH CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/);afx_msg BOOL OnEraseBkgnd(CDC* pDC);DECLARE_MESSAGE_MAP()public:void SetImage(UINT id);private:BOOL GetImageById(CImage *pImage, UINT nResID, LPCTSTR lpTyp);BOOL GetImageInfo(CImage *pImage, UINT nResID, LPCTSTR lpTyp);void SetByteForImage(CImage &image);void Update();private:CBitmap     bitmap_;CFont       font_;COLORREF  text_color_;BOOL        bitmap_used_;static image_id_ stat_image_[IMAGE_NUM];
};

ListBox 具有 LBS_OWNERDRAW 样式是没有文字的,除非再添加 LBS_HASSTRINGS 样式,并处理 WM_DRAWITEM 去绘制文字,否则肯定不会显示文字。
参考:让ListBox控件每一行显示不同的颜色

为MFC中的ListBox添加水平滚动条
参考:为MFC中的ListBox添加水平滚动条

双缓冲区解决闪烁

//加载各个控件图片,拖动会重刷
BOOL CRiskEstimateDemoDlg::OnEraseBkgnd(CDC* pDC)
{// TODO:  在此添加消息处理程序代码和/或调用默认值CDC *pDc = GetDC();if (pDc == NULL){return FALSE;}CDC memDC; //首先定义一个显示设备对象CBitmap memBitMap;//定义一个位图对象CImage image; //背景图片用来定义位图大小CBitmap *pOldBmp;int width = rt_background_.Width();int height = rt_background_.Height();memDC.CreateCompatibleDC(pDc);//ASSERT(memDC.CreateCompatibleDC(pDc) != NULL);//这时还不能绘图,因为没有地方画//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义memBitMap.CreateCompatibleBitmap(pDc, width, height);//ASSERT(memBitMap.CreateCompatibleBitmap(pDc, width, height) != NULL);pOldBmp = memDC.SelectObject(&memBitMap);//将位图选入到内存显示设备中//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上ASSERT(pOldBmp != NULL);if (pOldBmp == NULL){return FALSE;}//memDC.FillSolidRect(0, 0, image.GetWidth(), image.GetHeight(), RGB(255, 255, 255));//绘图DrawCtrl(memDC);pDc->BitBlt(0, 0, width, height, &memDC, 0, 0, SRCCOPY);//绘图完成后的清理,把前面的pOldBit选回来.在删除MemBitmap之前要先从设备中移除它memDC.SelectObject(pOldBmp);DeleteObject(&memDC);memBitMap.DeleteObject();if (pDc)ReleaseDC(pDc);return TRUE;
}

MFC调用Bat文件

 if (flag_record_){//system("e:\\Workspaces\\Git\\FKDemo\\FKDemo\\record.bat");WinExec("record.bat 001.flv", SW_HIDE);}else{WinExec("kill.bat", SW_HIDE);}

record.bat


@echo offffmpeg -f dshow -rtbufsize 200M -i video="Logitech HD Webcam C310":audio="Âó¿Ë·ç (HD Webcam C310)" -pix_fmt yuv420p -ar 48000 -vcodec libx264 -crf 23 -preset veryslow -x264opts b-adapt=2:bframes=0:aq-strength=1:psy-rd=0.8,0 -vsync vfr -acodec aac -bsf:a aac_adtstoasc -f flv %1
pause
exit

kill.bat

@echo off
taskkill /f /im ffmpeg.exe

常见知识点

文件夹操作

遍历文件1

BrowseCurrentAllFile(CString strDir)
{if(strDir == _T("")){return;}else{if(strDir.Right(1) != _T("//"))strDir += L"//";strDir =strDir+_T("*.*");}CFileFind finder;CString strPath;BOOL bWorking = finder.FindFile(strDir);while(bWorking){bWorking = finder.FindNextFile();strPath = finder.GetFilePath();if(finder.IsDirectory() && !finder.IsDots())BrowseCurrentAllFile(strPath); //递归调用else if(!finder.IsDirectory() && !finder.IsDots()){//strPaht就是所要获取的文件路径}}
}//调用方式:
BrowseCurrentAllFile(_T("D://test"));

遍历文件2

BOOL ProcessImage(cv::Mat& image){CString strDir(PLOT_DATA_IMG_PATH);strDir += "*.jpg";CString fileFullName;CFileFind finder;BOOL bWorking = finder.FindFile(strDir);if (!bWorking){return FALSE;}bWorking = finder.FindNextFile();fileFullName = finder.GetFilePath();string s;s = (LPCSTR)(CStringA)(fileFullName);image = cv::imread(s);DeleteFile(fileFullName); //删除文件return TRUE;
}

目标文件是否存在

#include <shlwapi.h>
#pragma comment(lib,"Shlwapi.lib") //如果没有这行,会出现link错误if (PathFileExists(strDBPath)){//存在}else  CreateDirectory(html_path_out1, NULL);  //文件夹不存在
//Cstring.Replace('/','\\');    //将地址中的'/'替换为'\\'

浏览文件夹目录

 // 设置过滤器     TCHAR szFilter[] = _T("启动文件(*.avi)|*.avi|所有文件(*.*)|*.*||");// 构造打开文件对话框     CFileDialog fileDlg(TRUE, _T("exe"), NULL, 0, szFilter, this);if (IDOK == fileDlg.DoModal()){CString str    = fileDlg.GetPathName();replay_video_path_ = (LPCSTR)(CStringA)(str);ctrl_list_msg_.AddString(str);}else {return;}

MFC接收命令行参数的三种方法

/* 方法一:将获取到 "C:\test\app.exe  -1 -2" */
CString sCmdline = ::GetCommandLine();
AfxMessageBox(sCmdline); /*方法二:将获取到 将依次得到"C:\test\app.exe","-1", "-2"*/
char buff[128] = { 0 }
for (int i = 0; i < __argc; i++)
{ sprintf_s(buff, 128, "%ws", __targv[6]);g_Config.kBusinessEnd = atoi(buff)
} /*方法三:将获取到 将获取到 "-1 -2 ",AfxGetApp()->m_lpCmdLine 只包含参数*/
CString sCmdline = AfxGetApp()->m_lpCmdLine;

DEBUG模式测试如何设置:
菜单的: 项目->属性->配置属性->调试->命令行参数

命令行参数里可以直接写你的参数,例如在命令行是:test.exe per1 per2 , 这样在这里就直接写:per1 per2

MFC获取时间的几种方法

参考:MFC获取时间的几种方法

MFC 屏蔽ESC和ENTER键关闭对话框

VC MFC 屏蔽ESC和ENTER键关闭对话框

方法一:窗体头文件中加入:1 protected:
2     virtual BOOL PreTranslateMessage(MSG* pMsg);  // PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的
3 public:
4     virtual void OnOK();在CPP中加入:复制代码1 BOOL CColorDlgDlg::PreTranslateMessage(MSG* pMsg)2 {3     //屏蔽ESC关闭窗体/4     if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE ) return TRUE;5     //屏蔽回车关闭窗体,但会导致回车在窗体上失效.6     //if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN && pMsg->wParam) return TRUE;7     else8         return CDialog::PreTranslateMessage(pMsg);9 }
10 void CColorDlgDlg::OnOK()
11 {
12     //CDialogEx::OnOK();
13 }
复制代码方法二:窗体头文件中加入:public:virtual void OnOK();virtual void OnCancel();afx_msg void OnClose(); //响应关闭事件!在CPP中加入:复制代码
void CFirstFZDlg::OnOK()
{return;
}
void CFirstFZDlg::OnCancel()
{return;
}
void CFirstFZDlg::OnClose()
{// TODO:  在此添加消息处理程序代码和/或调用默认值CDialogEx::OnCancel();//CDialogEx::OnClose();
}
复制代码MSG 结构体定义如下:
typedef struct tagMSG {     // msg  HWND hwnd;   // 窗口句柄UINT message;  // 消息WPARAM wParam;  // 消息附加信息,根据消息而定LPARAM lParam;  // 消息附加信息,根据消息而定DWORD time;  // 消息发送时间POINT pt;  // 消息发送时指针的位置(屏幕坐标)
} MSG;

完全退出线程

UINT thread_testexit( PVOID pParam )
{  while( g_bExtiThread )  {  Sleep(1000);  static int i = 0;  CString str;str.Format( L"%d",i++);  //AfxGetApp()->GetMainWnd()->SetWindowText( str );  }  return 0;
}
void Ctmfc1Dlg::OnBnClickedButton1()
{  // TODO: 在此添加控件通知处理程序代码  pWinThreadtestexit = AfxBeginThread( thread_testexit, 0 );
}
void Ctmfc1Dlg::OnBnClickedButton2()
{  // TODO: 在此添加控件通知处理程序代码   g_bExtiThread = 0;  WaitForSingleObject( pWinThreadtestexit->m_hThread, INFINITE );  SetWindowText( L"线程已经停止" );
}

参考:MFC 线程的退出方法

常见错误

Error Cxxx

1.Error C1003: error count exceeds 100
A:在自定义源文件中要加入#include “stdafx.h”,且要加在首行。

应用程序无法正常启动0xc000007b解决方法

问题原因
依赖的库文件错误,需要排查更换。

解决方法
使用depends.exe检测错误的依赖库。并更换。

参考

1、(极好)VC++判断文件或文件夹是否存在

MFC 进行界面设计与编程相关推荐

  1. 计算机网络课程设计,使用MFC实现界面化创建ARP发送与接受程序(一)

    计算机网络课程设计,使用MFC实现界面化创建ARP发送与接受程序(一) 1.实验内容: 利用WinpCap开源库函数,编写程序实现ARP报文的发送和接收 2.实验要求: 利用WINPCAP给出的API ...

  2. 青少年编程教育平台后台—登录注册(界面设计)

    青少年编程教育平台后台-登录注册(界面设计) 本界面使用HTML和CSS,未使用任何框架! 一.效果截图 二.HTML <!DOCTYPE html> <html><he ...

  3. MFC界面设计——AUDK

    现在的软件用户和开发者越来越注重软件界面,因而在大部分的软件工程中,界面编程占据了越来越多的工作量 .开发者为了实现那些漂亮的控件或窗口以得到用户的青睐,通常会通过internet去寻找很多的控件,然 ...

  4. VB中的界面设计原则和编程技巧

    Windows的通用图形界面的出现,使计算机用户不必通过专门的学习就可以得心应手地使用各种Windows的软件.不仅如此,它还是程序设计者在设计Windows程序界面时所必须遵循的标准,这在很大程度上 ...

  5. MFC 基于VLC的视频播放器(三)---界面设计以及对话框接受文件的拖拽

    北京时间23点11分 2018年12月20日 前面已经完成了vlc的环境的搭建,下面便开始真正的编程. 前面的界面是这样的: 理想的界面应该是这样的: 所以添加按钮.进度条和播放列表控件,并且修改好I ...

  6. [java/初学者/GUI编程]GUI界面设计——界面组件类

     前言 GUI,即图形用户界面,其英文全称是Graphics User Interface. 它是基于图形的界面,windows就是一个图形用户界面的操作系统,而DOS是基于命令提示符的操作系统,GU ...

  7. Cognex Designer软件进行检测编程---(界面设计)

    Cognex Designer软件 检测界面设计) 检测界面创建 ###1.整体界面创建 ###2.组合页面创建 界面由下面几个Page页面组成: 程序运行后的页面显示为: ###总结: 整体页面创建 ...

  8. 图形化界面设计软件简要介绍

    图形化界面设计软件简要介绍 [摘要]:面向使用者的系统工程设计,其目的是要准确.快速地在设计者和使用者之间传递信息和实现功能,也是优化产品性能来适应大众的操作能力,减轻使用者的认知负担.成功的系统工程 ...

  9. 对WEB前端的几段思考(一)——界面设计和性能优化(整理中)

    尽管我并非艺术出生,既没有任何设计基础,又没有较高艺术涵养,也深谙在短时间内创造一定艺术造诣并非易事,但是既然当初选择从事网站前端开发,我的目光不能仅停留在前端代码上.作为一名志向在前端领域发展的人员 ...

  10. Java图形化界面设计——容器(JFrame)

    Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...

最新文章

  1. poj 2828 Buy Tickets
  2. linux 判断网卡类型 有线 无线
  3. HorizontalScrollView里的标签改变颜色(今日头条里的功能仿照)
  4. 北京计算机在职研究生双证学校,北京在职研究生目前有哪些学校开设了双证专业?...
  5. mac鼠标和触控板滚动方向_Apple 无线鼠标、键盘或触控板各型号的Mac系统要求和区别...
  6. office软件的发展前景_2018年办公软件产业发展趋势
  7. 配置DNS辅助服务器:DNS系列之四
  8. java 命名内部类_如何把java SWT程序中的匿名内部类改写成命名内部类?
  9. Java基础——Java NIO详解(二)
  10. 运行差分灰狼时出现 关于“索引超出数组元素的数目(0)和矩阵维度问题以及图例的问题”的解决办法
  11. menu什么意思中文意思_alternate什么意思
  12. php camp,Byte Camp
  13. 微信点餐系统感悟(上1-6章)
  14. C# ASP.NET里@的妙用
  15. 线性移位寄存器序列(m序列)之MATLAB实现
  16. python控制电机转动_使用python,通过串口ROS直接控制电机驱动器(6)
  17. 微积分(一)——二重积分与三重积分笔记
  18. java Base64编解码
  19. 超级计算机浪漫展览,这是最独特的“中国式浪漫”
  20. Maven项目管理工具

热门文章

  1. 笔记本电脑怎么录制屏幕
  2. STM32固件库下载步骤
  3. vscode更换字体
  4. 用Camshift算法对指定目标进行跟踪
  5. 二级倒立摆建模(二)
  6. chrome升级后无高级-断续访问
  7. 电力系统卫星时钟同步工作的重要性
  8. 某中学校校园网络方案设计(课程设计)
  9. Linux多线程编程之pthread
  10. 免费的WordPress Video Player插件