MFC
C++程序员Carea
十年一线开发经验,热爱 C++ ,热爱编程
展开
-
Invalidate UpdateWindow
MFC文章列表Invalidate()通知系统,此时的窗口已经变为无效。调用PostMessage向窗口发送一个异步的WM_PAINT消息。原创 2021-01-27 13:56:17 · 295 阅读 · 0 评论 -
OnDraw和OnPaint
MFC文章列表在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同?(引用自百度) OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。 至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows回发送两个消息WM_PAINT(通知客户区有变化,在MESSAGE_MAP中添加ON_WM_PAINT())和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,原创 2021-01-26 16:28:25 · 277 阅读 · 5 评论 -
OnDestroy OnClose
(1)用户点击退出按钮,发送了WM_CLOSE消息(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()(3)在DestroyWindow()中发送了WM_DESTROY消息(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环综上,程序先调用OnClose()(也可能不调用),然后调用OnDestroy()(必调用).所以,如果要进行程序结束时的清理工作,应该在OnDestroy()中,而不是在OnClose原创 2021-01-26 16:20:09 · 261 阅读 · 0 评论 -
MFC文章列表
控件MFC MessageBox悬停文字 悬浮提示 CtoolTipCtrlMFC动态创建控件(按钮)及添加消息响应MFC下调用控制台菜单MFC右键弹出菜单窗口类型单文档、多文档、对话框模态对话框和非模态对话框区别绘制OnPaint函数的工作原理CListCtrl批量插入不刷新Windows界面绘图使用缓冲区避免闪烁MFC局部刷新 只刷新单个控件 只刷新1个控件MFC切换子界面事件响应MFC 对话框Dialog响应键盘事件(组合键Ctrl+原创 2021-01-26 16:05:19 · 246 阅读 · 4 评论 -
MFC创建线程 AfxBeginThread
//创建线程 auto threadBegin = AfxBeginThread ( ThreadSendTotalDataToHIS , (LPVOID) this ); //线程函数(类的静态成员函数) static UINT __cdecl ThreadSendTotalDataToHIS(LPVOID lpVoid);原创 2020-08-20 14:44:57 · 374 阅读 · 0 评论 -
MFC MessageBox
MessageBoxA(nullptr, "程序版本号已经成功配置到当前电脑的配置文件中!", "成功", 0);原创 2020-05-27 10:14:41 · 229 阅读 · 0 评论 -
关于OnPaint函数的工作原理(很详细,很实用)
https://blog.csdn.net/foreverhuylee/article/details/21889025原创 2020-03-27 14:16:55 · 611 阅读 · 0 评论 -
CListCtrl批量插入不刷新
////////////////////////////////////////////////////////////////////////// //插入过程禁止刷新界面 m_ctrlListSel.LockWindowUpdate(); m_ctrlListSel.SetRedraw(FALSE);//插入时如果设置了被选中状态就会引发重绘//////////////////...原创 2018-08-30 12:10:40 · 804 阅读 · 0 评论 -
MFC CTreeCtrl TVN_SELCHANGED树节点切换事件
1 在MessageMap中增加消息响应BEGIN_MESSAGE_MAP(CMyStrategyUIView, CView) ON_NOTIFY_REFLECT(TVN_SELCHANGED, &CTreeCtrlBT::OnTvnSelchanged)//这种情况是当前类继承了Ctreectrl时的声明方式ON_NOTIFY(TVN_SELCHANGED, IDD_CA...原创 2018-08-11 11:23:33 · 4478 阅读 · 0 评论 -
MFC滚动条自动对齐:一个grid选中一行另一个grid也选中相同行并且内容和滚动条自动对齐
核心思想是利用gridCtrl的滚动条消息响应。当我需要让一个gridCtrl的滚动条连同其gridCtrl的内容一起自动滚动到另一个新的合适的位置的时候,我给这个gridCtrl发一个消息SendMessage()核心代码如下:m_gridRight.SetScrollPos(SB_VERT, iPos, TRUE);//滚动条滚动 //内容滚动m_gridRight.SendMessage...原创 2018-05-15 17:46:06 · 967 阅读 · 0 评论 -
单文档、多文档、对话框
本质上都是窗口程序,可以说都可以实现同样的功能。区别对话框更适合进行人机交互,用来接收用户的请求。基于对话框类似“计算器”这样的应用程序,没有需要处理的文档。对话框可以方便的使用控件,所见即所得的编程,比较方便。VC的代码向导使设计对话框比较容易,代码向导则简化了在对话框中初始化和验证控件的过程和收集用户输入的值的过程。文档视图架构文档视图架构适合图原创 2017-08-08 13:31:50 · 739 阅读 · 0 评论 -
C++控制台输出字体颜色字体背景色
#include "stdio.h" #include "windows.h" int main(int argn, char **argv) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN); printf("Hello"); SetCons原创 2017-07-06 21:17:17 · 2062 阅读 · 0 评论 -
CString分割切分 实现SplitCString
直接上代码说明:CStringArray只能用引用传入,不可以作为函数返回值,因为CStringArray集成的CObject不支持复制构造void SplitCString(const CString& _cstr, const CString& _flag, CStringArray& _resultArray){ CString strSrc(_cstr); CStringA原创 2017-06-27 19:23:00 · 3480 阅读 · 0 评论 -
MFC下调用控制台
在CWinApp的InitInstance中对话框的DoModal之前加入void MyUseConsole(void){ AllocConsole(); // 开辟控制台 SetConsoleTitle(_T(""));//设置控制台窗口标题 freopen("CONOUT$", "w", stdout原创 2017-07-05 22:16:03 · 684 阅读 · 0 评论 -
模态对话框和非模态对话框区别
按工作方式不同,可将对话框分成两类: ??模式对话框(modal dialog box模态对话框):在关闭模式对话框之前,程序不能进行其他工作(如一般的“打开文件”对话框) ??无模式对话框(modeless dialog box 非模态对话框):模式对话框打开后,程序仍然能够进行其他工作(如一般的“查找与替换”对话框) 两者的区别: 一. 非模态对话框的模板必须具有Visible转载 2014-12-27 12:57:32 · 1558 阅读 · 0 评论 -
悬停文字 悬浮提示 CtoolTipCtrl
使用CtoolTipCtrl 导读:本文适用于相对静止的控件,比如按钮,不适用于向树型控件这样的位置不固定的控件(因为树型控件经常被折叠和展开) CtoolTipCtrl封装了一个工具提示的控件,可弹出一个单行的小窗口来显示一些描述信息,大多时候它是隐藏的,除非用户将光标移到要显示提示的工具上面,并且停留大概半秒的时间它才显示,当单击鼠标或者移走光标的时候这个提示窗口就会消失原创 2014-12-27 15:48:24 · 3149 阅读 · 0 评论 -
CString与string之间的转换
(1)CString转换为stringCString cs(_T("cs"));string s;s = (LPCSTR)(CStringA)(cs);(2)string转换为CString string s ="Hello World!中国"; CString cs(s.c_str());原创 2015-01-06 11:12:24 · 5156 阅读 · 0 评论 -
ANSI(字符集) and Unicode(字符集) and UTF-8(编码Unicode字符集)
为什么要Unicode?ANSI用一个字节(8位)表示一个字符但是很多世界上其他的语言无法表示,但是又想每个字符都平等对待,所以需要更长的位Unicode用两个字节(16位)来表示一个国际字符,这样世界上任何国家的任何字符都可以用两个字节统一表示对C++而言如何表示Unicode?char正好是8位,可以用来表示一个ANSI字符wchar_t正好是16位,可原创 2016-08-02 09:31:27 · 1166 阅读 · 0 评论 -
MFC 对话框Dialog响应键盘事件(组合键Ctrl+A)
在上一篇文章的基础上,这里描述如何捕获组合键,这里以Ctrl+A为例 做法就是按下Ctrl的时候用一个静态成员变量保存Ctrl是否被按下,当Ctrl按下的时候设置为true;当Ctrl键抬起的时候设置为false头文件声明 BOOL PreTranslateMessage(MSG* pMsg);源文件定义BOOL CmfcDlg::PreTranslateMessage(MSG* pMsg)原创 2015-02-12 16:20:42 · 8608 阅读 · 0 评论 -
MFC 对话框Dialog响应键盘事件
OnKeyDown不行Dialog程序本来没有直接响应键盘的事件,如果你用OnKeyDown会发现不起作用。 那么你想按下“左键”、“W键”、“9键盘”应该怎么响应呢? 重载基类的BOOL PreTranslateMessage(MSG* pMsg)函数最简单的键盘响应函数头文件声明: BOOL PreTranslateMessage(MSG* pMsg); 源文件定义: B原创 2015-02-12 15:48:06 · 3516 阅读 · 0 评论 -
MFC长按键盘:执行多次、执行一次
先说明一下你按下一个键盘不松开的时候发生了什么:产生了多个按下的消息,切消息的内容都一样,是你按下的那个键。实现长按的时候执行多次:比如你长按“A”按钮,可以让界面上的某个控件的数值一直增大,那么你只要在实现这个按键的响应事件里增大一次就可以了,只要你长按,自动会多次调用你的这个函数。实现长按的时候执行一次:这个按照网上的说法,可以添加一个静态变量,记录上次原创 2015-01-09 12:50:53 · 4364 阅读 · 0 评论 -
MFC右键弹出菜单
右键弹出菜单是指右键抬起的时候弹出的菜单。通常放置在Dialog的OnRButtonUp响应函数里。下面就给出右键弹出菜单的实例:1 添加右键事件及响应函数 可以用Class Wizard。。。来添加一个右键消息WM_RBUTTONUP,为其添加Handler,会自动生成OnRButtonUp响应函数2 为弹出菜单添加资源 可以用“Resource View”中的”String Table”添加原创 2015-02-13 15:55:55 · 2597 阅读 · 0 评论 -
MFC切换子界面
在Dialog程序中,子界面通常是一些子控件,这些控件在切换的时候通常是隐藏其他,显示要显示的控件来做到的。下面的例子有两个按钮,分别控制两个静态文本的显示(点击按钮1会显示文本1,点击文本2会显示文本2)实现分为如下几个步骤: 1 给Dialog添加静态文本和按钮成员变量。private: CButton m_btn_1; CButton m_btn_2; CSta原创 2015-02-13 11:31:43 · 4386 阅读 · 0 评论 -
MFC动态创建控件(按钮)及添加消息响应
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。一、创建动态控件:为了对照,我们先来看一下静态控件的创建。 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。 静态控件不需要调用Create()原创 2015-02-13 09:57:30 · 8922 阅读 · 0 评论 -
Windows界面绘图使用缓冲区避免闪烁:MFC版本 和 GDI版本
1.1. 缓冲消除闪烁(MFC版本)先做一个内存dc,将背景绘制到这个dc,再将棋盘绘制到这个dc,再将棋子绘制到这个dc.此时dc里面就是一个累积的完整的最终效果图。此时再把这个dc拷贝到当前绘图句柄上,就等于只跟上一次图相比,只有局部内容发生的变化,而且是内存拷贝,所以很快就绘制了一个变化之后的图。不会有闪烁。void CchessDlg::PaintChessboard(void原创 2017-05-20 10:17:11 · 1423 阅读 · 0 评论 -
MFC局部刷新 只刷新单个控件 只刷新1个控件
下面的程序实现:(1)按下键盘左键减少数值并用控件显示(2)按下键盘右键增加数值并用控件显示其中的刷新就用到了局部刷新,只刷新显示数字的控件BOOL CEditTestDlg::PreTranslateMessage(MSG* pMsg){ if (pMsg->message == WM_KEYDOWN) { if (pMsg->w原创 2015-01-06 16:46:25 · 12235 阅读 · 0 评论