mfc

Qt MFC混合编程详细介绍与代码示例

匆匆过客 提交于 2020-03-01 01:14:45
在用Qt做客户端时,如果项目突然需要用到一些COM,MFC dll等,这些玩意儿在Qt可能无法调用,又不想用MFC做界面,那么是否可以Qt, MFC一起使用呢? 这种解决方案是存在的,Qt是一套界面库,把Qt当做一套常规的SDK, 在MFC项目中包含Qt的头文件,lib,dll,这样就可以把Qt嵌套在MFC中使用,问题又来了,MFC有自己的消息映射机制,Qt有自己的信号槽,在一起使用,那么该遵循谁的标准呢? 下面介绍一种Qt, MFC混合编程的例子。用MFC作为程序起点,Qt做界面,在程序中截断MFC的消息循环,主要使用Qt的消息循环。 新建一个MFC单文档项目(或者对话框项目),我的项目名字TestDemo,如果MFC程序运行顺序不太熟悉的可能不太好看懂。大致从theApp--->InitInstance--->Run等流程要很熟悉。另外要包含Qt的头文件,lib库,dll。 项目要点如下: 1 在TestDemo.cpp 自定义一个Windows消息,用于发送到消息队列,启动Qt界面 //自定义消息,MFC调用Qt界面 #define MainUI WM_USER + 1000 来源: CSDN 作者: 令狐掌门 链接: https://blog.csdn.net/yao_hou/article/details/104580887

关于MFC中窗口最大化的两篇文章

女生的网名这么多〃 提交于 2020-02-29 19:35:13
文一:转载( http://dev.csdn.net/htmls/28/28675.html ) doc_view结构中让窗口一开始就最大化探讨 作者:enoloo 一般的做法是在 C**App::InitInstance()中,修改成这样: { //... m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow(); //... } 或者,还在 CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中,添加: { //... cs.style |= WS_MAXIMIZE; //... } 这种做法能产生窗口最大化,但效果是显示的时候窗口从普通大小"闪"到最大化。还有的做法,是先将窗口隐藏,然后再最大化。那么怎样使窗口正常一开始出现就最大化?看看下面的流程,从 C**App::InitInstance()中的ProcessShellCommand(...)开始: { //... //ProcessShellCommand中第一次显示了窗口 if (!ProcessShellCommand(cmdInfo)) return FALSE; m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow(

VS2010下MFC的串口编程

风格不统一 提交于 2020-02-29 17:56:19
串口通信简介   一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色。当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据;当用通信控件或声明调用API函数时,它们由COMM.DRV解释并传递给设备驱动程序。作为一个程序员,要编写通信程序,只需知道通信控件提供的Windows API通信函数的接口即可,换句话说,只需设定和监视通信控件的属性和事件即可。   串口通信方法一般有以下几种: 利用Windows API通信函数; 利用Visual C++的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作; 通过微软的串口通信控件MSComm,它是一种ActiveX控件; 利用第3方编写的通信类,比如MuMega Technologies公司提供的CSerail类;   我在项目开发过程中用的是第三种方法——通过MSComm控件操作串口,下面是我使用此控件的笔记。 MSComm控件简介   MSComm 是 Microsoft

VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程

眉间皱痕 提交于 2020-02-29 17:54:14
首先,在 vs2008 环境下创建 MFC 运用程序 设置项目名称为 ComTest (这个地方随意命名,根据个人习惯),点击确定后, 点击下一步 出现如下界面 选择“基于对话框”模式然后直接点击完成即可(其他选项按默认方式),点击完成后出现如下界面 解决资源管理器中自动给你生成好代码目录(可点击菜单栏“视图”选项打开解决方案资源管理器),如下图所示 我们再次回到对话框编辑窗口,删除自动生产的控件(静态文本控件、确定和取消按钮控件),并在工具箱里添加两个button按钮和编辑框,之后的界面如下图所示: 然后把最重要的串口通信控件加入到工具箱中,因为默认的工具箱是不带 MS 串口通信控件的。添加方法如下:在工具箱界面点击鼠标右键出现如下界面: 然后点击选择项出现如下界面,然后选择“COM 组件” 找到并选中该项 最后点击确定键,就成功添加 MS 串口通讯控件了,工具箱中就会出现串口控件图标了 我们吧串口控件添加到对话框里,位置随意,运行的时候是看不见的,所以最终界面是这样子的 下面开始添加变量,首先 为 IDC_MSCOMM1 添加控制变量: m_ctrlComm ,在串口通信图标上右键点击选择添加变量,如图: 完成就可以了,控件ID和类别是可以选的,下面为按钮和编辑框添加变量时选不同的就行了。 两个编辑框,一个用于接收显示数据 ID设置 为 IDC_EDIT_RXDATA

win32实现List Control

♀尐吖头ヾ 提交于 2020-02-28 21:56:41
到目前为止,还没有正儿八经的写过MFC程序,虽然现在自己把MFC的框架看得差不多,但是还是不想 使用MFC写代码,做界面MFC是关键,这是谁也无法逃脱的框架,好了,废话少说,说说自己的实现。 List Control是Windows的控件,使用的时候要加#include #pragma comment(lib, "commctl32.lib"( 这是win32平台,若是wince平台则不需要,原因现在我还不清楚) . 1.创建List Control控件 m_hList = ::CreateWindow(L"syslistview32", L"", WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, m_pt.x, m_pt.y, m_sz.cx, m_sz.cy, _hParent, NULL, _hInst, NULL); 2 .创建加列项目 LVCOLUMN _lvcol; memset(&_lvcol, 0, sizeof(LVCOLUMN)); _lvcol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; _lvcol.pszText = "sdfsdfs" _lvcol.cx = 80; ::SendMessage(m_hList, LVM

MFC窗口强制重绘

╄→尐↘猪︶ㄣ 提交于 2020-02-28 03:34:37
转自: https://www.cnblogs.com/skywatcher/p/3567754.html MFC提供了三个重绘函数: Invalidate()、UpdateWindow()和RedrawWindow()。 强制窗口重绘只用一个RedrawWindow()即可,Invalidate() 与UpdateWindow()两个函数组合使用才会引起重绘。 重绘之后你又会发现图形闪烁,看这里来解决: https://www.cnblogs.com/xingrun/p/3395589.html。 1. 重绘消息 当需要更新或者重绘窗口时,一般系统会发出两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化) WM_NCPAINT系统会自己搞定 WM_PAINT消息对应的函数是OnPaint(),它是系统默认的接受WM_PAINT消息的函数,但我们一般在程序中做重绘时都在OnDraw函数中进行的,因为在ONPAIN函数中调用了ONDRAW函数。 ///CView默认的标准的重画函数 void CView::OnPaint() { CPaintDC dc(this); OnPreparDC(&dc); OnDraw(&dc); //调用了OnDraw } 2. 重绘函数 InvalidateRect(&Rect)和Invalidate(

Where do I translate MFC message boxes

大兔子大兔子 提交于 2020-02-27 22:47:15
问题 I'm localizing an MFC app into Japanese, and have the resources working right. My current problem is that, when I use AfxMessageBox or MessageBox , the dialog title and button messages come up in English, and I haven't found anywhere to change that. I haven't found anything useful searching MSDN or Google. So, Does this work? Does Windows come up with "OK" or "Yes/No" buttons in Japanese, Arabic, and Russian? If not, what do I specify to change these? Edit: I went with MessageBoxEx , writing

C++(MFC)踩坑之旅 ------- 新建项目弹出“发生一个或多个错误”

风流意气都作罢 提交于 2020-02-27 21:00:53
结束隔离,回公司上班,把在家办公的程序考回公司的电脑,结果出错了,每当我新建项目时,都会弹出“发生一个或多个错误”,点确定后回到新建项目的设置上面,折腾了两天时间才解决,以下是我的解决思路和操作方法: 思路:年前的时候公司电脑没问题,年前年后有差别的地方在于:我在家时所写的程序(MFC)是自己新建了属性配置表, 解决方法:用公司电脑新建属性配置表,我的做法是配置表名字跟在家里一样的,并且配置内容也一样。 结果:成功了。 来源: https://www.cnblogs.com/chenzhenchou/p/12374134.html

MFC重绘原理的关键理解

≡放荡痞女 提交于 2020-02-27 12:17:13
// ====================Windows重绘消息与函数========================== 得到桌面窗口的句柄,然后再绘图 HWND GetDesktopWindow(VOID); 当需要更新或重新绘制窗口的外观时,应用程序就会发送WM_PAINT消息对窗口进行重新绘制。 Invalidate()是强制系统进行重画,但是不一定就马上进行重画。因为Invalidate()只是通知系统,此 时的窗口已经变为无效。强制系统调用WM_PAINT,而这个消息只是Post就是将该消息放入消息队列。当执行到WM_PAINT消息时才会对敞口进行重绘。 UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。 RedrawWindow()则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。 调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而 调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列。 如果你调用Invalidate之后想马上更新屏幕

MFC 列表控件CListCtrl详解

笑着哭i 提交于 2020-02-27 04:58:28
CListCtrl::SetExtendedStyle CListCtrl的成员函数声明   DWORD SetExtendedStyle(   DWORD dwNewStyle );   函数功能设置CListCtrl的扩展样式   dwNewStyle指定的扩展样式   LVS_EX_GRIDLINES //绘制表格,网格线。   LVS_EX_SUBITEMIMAGES//子项目图标列表   LVS_EX_CHECKBOXES //带复选框   LVS_EX_TRACKSELECT //自动换行   LVS_EX_HEADERDRAGDROP//报表头可以拖拽   LVS_EX_FULLROWSELECT //选择整行,允许选择整行。   LVS_EX_ONECLICKACTIVATE//单击激活单击选中项目。   LVS_EX_TWOCLICKACTIVATE//双击激活   LVS_EX_FLATSB//扁平滚动条   LVS_EX_REGIONAL   LVS_EX_INFOTIP   LVS_EX_UNDERLINEHOT   LVS_EX_UNDERLINECOLD   LVS_EX_MULTIWORKAREAS//多工作区 ---------------------------------- 例子:m_TextList.SetExtendedStyle(...);