
MFC
超频化石鱼
这个作者很懒,什么都没留下…
展开
-
CObject/CCmdTarget/CCmdTarget三个类的能力
三个类的能力分别为: CObject:运行时类型识别(RTTI)、动态创建(Dynamic Creation)、文件读写(Serialization) CCmdTarget:消息机制,拥有DECLARE_MESSAGE_MAP宏,从而可以接收WM_COMMAND消息 CWnd:除WM_COMMAND消息之外,还可以接收WM_xxx消息 这三原创 2018-02-01 08:30:59 · 570 阅读 · 0 评论 -
MFC异形对话框
基本原理:获取窗体区域,指定一个颜色为透明色,遍历位图,将图上所有该色区域从窗体区域中去除。这样最后就得到了一个异形窗体。然后把背景图绘制在该窗体上。注意绘制的时候,作为透明的部分依然会被以原色绘制。但是由于绘制的地方并没有窗体,故而是显示不出来的。 在对话框的OnInitDialog()函数中加入以下代码:CDC* pDC = GetDC();//获得设备上下文CDC memDC;CBitm...原创 2018-02-09 15:34:17 · 655 阅读 · 0 评论 -
对话框未显示时GetWindowRect()获取坐标左上角为0
GetWindowRect()函数得到的是相对应于屏幕左上角的坐标。但是若在对话框的OnInitDialog()函数中使用RECT parentWindow;this->GetWindowRect(&parentWindow);得到的左上角却是(0,0);其原因是:对话框在执行OnInitDialog()的时候还没有显示,这时候对话框的左上角与屏幕左上角是重合的。所以该操作得到的区...原创 2018-02-09 15:34:20 · 870 阅读 · 0 评论 -
Invalidate()InvalidateRect()UpdateWindow()三者的区别
Invalidate():不立即更新。作用区域是整个窗口客户区,将客户区标记为无效,并将WM_PAINT放到消息队列中。InvalidateRect():立即更新。作用区域是指定矩形区,绕过消息队列直接将WM_PAINT发往窗口对象,并立即执行WM_PAINT。UpdateWindow():立即更新。作用区域是整个窗口客户区,先判断客户区是否存在无效区域,若有无效区域,则绕过消息队列直接将原创 2018-02-07 08:29:27 · 873 阅读 · 0 评论 -
MFC工程对话框资源合并
创建了一个工程Test,对其进行一次复制,复制后的工程依然为Test。为了区分方便,称之为修改Test。 现在要将修改Test中修改的内容合并到原Test中。① 在原Test上的解决方案上点右键,选Add,添加一个解决方案文件夹② 在文件夹上点右键,选Add,添加一个已存在的解决方案。将修改Test添加进来③ 切换到资源视图,在修改Test新添加的资源上点右键原创 2018-02-07 08:29:31 · 694 阅读 · 0 评论 -
GetDlgItem所获取CWnd*的时效性
GetDlgItem所获取的窗口CWnd*并非一定是全局的。① 若控件绑定了变量,那么通过GetDlgItem所获取的CWnd*是全局的。对该CWnd*进行保存,随时都可以正确调用② 若控件没有绑定变量,仅仅只有一个ID,那么通过GetDlgItem所获取的CWnd*仅在当前函数体内有效。函数体结束时,该CWnd*会被释放。所以,如果对CWnd*进行了保存,当在其他函数内调用...原创 2018-02-08 08:31:29 · 656 阅读 · 0 评论 -
MFC矩形、窗体与图像宽高:差1且不同
一.矩形 在MFC中,矩形的宽定义为:width= rect.right-rect.left 如矩形为:RECT rect;rect.left = 0;rect.top = 0;rect.right = 9;rect.bottom = 9; 则矩形: 宽 = rect.right-rect.left =...原创 2018-02-08 08:31:31 · 431 阅读 · 0 评论 -
OnNotify与OnChildNotify以及CStatic的DrawItem实现源代码
OnNotify是用于子控件向父窗口发送消息用的。该消息的接收对象是父窗口。OnChildNotify是子控件向父窗口发送消息后,父窗口反射消息给子窗口用的。该消息的接收对象是子窗口。如:CDialog上有一个CStatic。在CStatic上点击鼠标,则CStatic会发送OnNotify消息给CDialog。CDialog接收OnNotify消息并处理。然后CDialog会发送OnChildN...原创 2018-02-08 08:31:34 · 1436 阅读 · 0 评论 -
窗口的位置:GetWindowRect与MoveWindow等
父对话框的整个窗口区=父对话框客户区+父对话框标题栏区1. GetWindowRect()获取的是以屏幕左上角为(0,0)点的窗口区域,是屏幕坐标系。① 如果对父对话框调用GetWindowRect(),那么获取的矩形为父窗口在屏幕中的区域,其中矩形区含标题栏以及外边框。② 如果对控件调用GetWindowRect(),那么获取的矩形是控件在屏幕中的区域。注意在对话框的OnInitDialog...原创 2018-02-08 08:31:36 · 3142 阅读 · 0 评论 -
接受拖放文件
需要重载类的WM_DROPFILE消息。接受拖放的文件并显示路径与文件名的示例:void CYuEdit::OnDropFiles(HDROP hDropInfo){ // TODO: Add your message handler code here and/or call default UINT nFilesDroppedCount = DragQueryFile(hDropInfo...原创 2018-02-08 08:31:39 · 252 阅读 · 0 评论 -
MFC中DLL的创建
可创建的MFC DLL有三种:① Regular DLLusing shared MFC DLL: MFC动态链接常规DLL。需要MFC动态链接库。该类型DLL既可以被MFC程序使用也可以被一般的Win32程序使用。② Regular DLLwith MFC statically linked:MFC静态链接常规DLL。这种DLL将要使用的MFC的类代码直接加入到DLL中,从而使得DLL增大。...原创 2018-02-08 08:31:42 · 780 阅读 · 0 评论 -
MFC HOOK的使用
首先要将钩子装入:HHOOK m_menuHook;m_menuHook = SetWindowsHookEx(WH_MSGFILTER, HookProc, NULL, GetCurrentThreadId());然后实现钩子函数:LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam){ if (code == ...原创 2018-02-08 08:31:47 · 2105 阅读 · 0 评论 -
VC ini配置文件常用操作
A.读写ini文件ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。写函数(一个):BOOL WritePrivateProfileS...原创 2018-02-08 08:31:49 · 650 阅读 · 0 评论 -
控件截获主对话框WM_KEYDOWN消息后按键所发出的警告音
自定义了一个控件类,为了能让控件响应快捷键,需要重载父对话框的WM_KEYDOWN消息,将消息截获,并发送给控件。如:BOOL COpenGLDemoDlg::PreTranslateMessage(MSG* pMsg){ // TODO: Add your specialized code here and/or call the base class if (pMsg->messa...原创 2018-02-09 15:34:14 · 422 阅读 · 0 评论 -
向指定窗口发送一个BN_CLICKED消息
向指定窗口发送一个BN_CLICKED消息设一个对话框上有一个按钮,现在鼠标正在按钮上方为了向该对话框发送消息来响应该按钮的BN_CLICKED消息(注意不可以向按钮发送,而是要向对话框发送,因为按钮是将消息发往对话框,由对话框来响应)。BOOL CYuCvImageControl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){ // ...原创 2018-02-09 15:34:08 · 1539 阅读 · 0 评论 -
DECLARE_MESSAGE_MAP()与消息传递网
一.总体结构首先,在.h文件中:DECLARE_MESSAGE_MAP()然后在.CPP文件中:BEGIN_MESSAGE_MAP(CView, CWnd) ON_COMMAND(CViewid,0)END_MESSAGE_MAP()上面.h中的宏的声明是:#define DECLARE_MESSAGE_MAP\static AFX_MSGMA原创 2018-02-01 08:31:22 · 640 阅读 · 0 评论 -
GDI映射:设备坐标与逻辑坐标
1. 设备坐标,对显示器而言就是屏幕,其单位是像素;对打印机而言就是打印机的像素点。这个坐标与具体的设备相关,所以叫设备坐标。目前用到的就是显示器的像素。显示器的设备坐标有三种:屏幕坐标,窗口坐标,客户区坐标。① 屏幕坐标:以整个屏幕为显示区,屏幕左上角为(0,0)点,x值向右增加,y值向下增加。② 窗口坐标:以运行程序的整个窗口(客户区+标题栏等)为显示区,窗口左上角为原创 2018-02-01 08:31:44 · 611 阅读 · 0 评论 -
RTTI运行时类型识别与类对象的动态创建
RTTI运行时类型识别CRuntimeClass是MFC专用的。CRuntimeClass在文件AFX.H中声明,它是用来串起MFC从COBJECT继承下来的所有类。也可以把自己写的类加入这个链表。struct CRuntimeClass{ // Attributes LPCSTR m_lpszClassName; //类名 int m_nObjectSize; //类对象大小原创 2018-02-01 08:31:59 · 359 阅读 · 0 评论 -
WM_COMMAND与消息的传递
上面是一张MFC的类图局部。MFC将消息分为三大类:① 命令消息WM_COMMAND:凡是由CCmdTarget派生的类,均可接收该消息。② 标准消息WM_xxx:凡是由CWnd派生的类,均可接收该消息。③ 控件通知消息WM_NOTIFY/WM_COMMAND:由控件产生,为的是向其父窗口发送通知。Windows9x及以上控件传送的是WM_NOTIFY,而老版本控原创 2018-02-01 08:32:14 · 2683 阅读 · 0 评论 -
窗体的DC
HDC GetDC(HWND hWnd); //获取指定窗体的DC 对每一个窗体而言,无论其是否位于前端屏幕上显示,都存在一个DC。调用GetDC ()函数可以获取该DC。 如果调用GetDC (NULL),则会获取屏幕的DC。屏幕的DC与任何一个正在运行的窗体DC都是不同的DC,实际上,所有DC都是不同的DC。即使屏幕DC与正在运行的窗体DC可能有显原创 2018-02-01 08:32:28 · 518 阅读 · 0 评论 -
窗体的创建过程
Win32应用程序与Win32控制台程序的不同之处在于:① Win32应用程序以WinMain()为主函数,可以使用所有Win32API② Win32控制台程序以main()为主函数,不能使用GDI函数 Win32应用程序之所以可以使用Win32API,是因为引入了Windows.h,从而包含了数据类型定义与API的入口点。 在VS中创建一个空的原创 2018-02-01 08:33:21 · 316 阅读 · 0 评论 -
MFC消息的产生与传递
首先定义一个名词:向上匹配。对于 除WM_COMMAND以外的消息,在消息网中都只能是从派生类流向基类。派生类及基类都有自己的消息映射表AFX_MSGMAP_ENTRY。消息映射表中存储了类所有重写的消息处理。当前给定了一个消息,为了执行该消息所对应的处理函数,需要在当前类中搜索消息映射表AFX_MSGMAP_ENTRY,若消息的ID存在该表中,那么说明当前类重写了该消息的处理方式,那么就调用相应原创 2018-02-01 08:33:36 · 537 阅读 · 0 评论 -
程序的执行与WinMain起点
当Windows的Shell(资源管理器)侦测到使用者意欲执行一个Windows程序,就会调用加载器将程序加载,然后调用C startup code,后者再调用WinMain,开始执行程序。WinMain的四个参数由操作系统传递进来。 即:① 使用者双击exe,想要执行一个Windows程序② Windows资源管理器侦测到该行为,于是调用加载器,将程序加载进来原创 2018-02-02 08:40:40 · 289 阅读 · 0 评论 -
VC的路径
1.注意#include "../Common/MyTD.h" 这里面的目录表示方式与CFile saveFile;saveFile.Open(_T("\\abc.bmp"),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);这两种路径表达方式是不一样的。2. 绝对路径:_T(“D:\\Project\\imageTe...原创 2018-02-09 15:33:55 · 468 阅读 · 0 评论 -
MFC改变鼠标指针的形状
只要重载当前窗口的OnSetCursor()函数即可。在OnSetCursor()函数中:添加代码:::SetCursor(AfxGetApp()->LoadCursor(cursorID));//读取并设置鼠标指针形状return TRUE;//return CBitmapButton::OnSetCursor(pWnd, nHitTest, message);//把这一行注释掉其中A...原创 2018-02-09 15:33:58 · 1424 阅读 · 0 评论 -
MFC重载鼠标停留WM_MOUSEHOVER和离开WM_MOUSELEAVE消息
1. 重载OnMouseMove()消息,在消息的实现中添加代码:void CMainWindow::OnMouseMove(UINT nFlags, CPoint point){ TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); //结构体缓冲区大小 tme.dwFlags = TME_HOVER; //注册WM_MOUSEHOVER消息 t...原创 2018-02-09 15:34:00 · 2829 阅读 · 0 评论 -
MFC控件响应鼠标中键OnMouseWheel
控件必须获取焦点才能响应OnMouseWheel。因此首先要在控件的OnLButtonDown里调用SetFocus();。然后重载控件的OnMouseWheel函数:BOOL CYuCvImageControl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){ // TODO: Add your message handler code...原创 2018-02-09 15:34:03 · 7520 阅读 · 0 评论 -
VC ini文件的默认路径
ini配置文件如果使用默认路径,则注意该默认路径是系统的路径。程序启动情况下,该路径是程序根目录。程序启动后若调用了文件选取操作,则会更改该默认路径。若依然按照原来的思路直接通过默认路径去选取文件,则可能会读取失败。...原创 2018-02-08 08:31:53 · 339 阅读 · 0 评论