摘要:子类化,通俗来讲就是用自己的窗口处理函数来处理特定消息,并将自己其他消息还给标准(默认)窗口处理函数。在SDK中,通过SetWindowLong来指定一个自定义窗口处理函数:SetWindowLong(hwnd, GWL_WNDPROC, (LONG)UserWndProc);。可是到了MFC中,大部分基础的东西都被封装起来了,那么,这是该怎么实现子类化呢?先来看一个例子:要求:定义一个Edit控件,让它能够对输入进行特定的处理输入进行处理-----只能输入英文字母,对其他输入作出提示。分析:1)处理输入当然是响应WM_CHAR消息了,然后对输入字符进行判断,并做相应处理。那么,我们有怎么才能
阅读全文
随笔分类 - VC/MFC
摘要:1.对OpenCV 的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法;然后将图像格式和矩阵运算,然后将各个算法的实现函数。我用它来做了一个Harris角点检测器和Canny边缘检测器,总共就花了一个小时(第一次用OpenCV)。而且该库显示图像极其方便,两句话就可以。但该库似乎不大稳定,对32F和16S、8U的图像数据支持上bug重重。我用 cvFilter2D函数进行线性滤波,屡屡出错,后来一查原来是大bug。后来用cvmGet来取矩阵元素也是频繁出错,仔细检查了N遍确保程序没问题之后在ya
阅读全文
摘要:1、利用IPicture接口加载、显示图片IPicture接口管理一个图片对象和它的属性。图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持。图像对象的主要接口是IPicture和IPictureDisp。IPictureDisp从IDispatch继承,提供了通过自动化访问图片属性的能力。图片对象可通过OleCreatePictureIndirect创建。关于IPicture支持的其他接口和方法可以看MSDN,一般创建图片对象可以用OleLoadPicture函数,它简化了基于流内容创建图片对象。IPicture接口管理一个图片对象和它的属性。图片对象提供对Bitm
阅读全文
摘要:当我们想仔细观察某个细微的东西时,一般都会使用放大镜。而要看清显示在计算机屏幕上的图片或文字时通常也可以借助于Windows操作系统附带的放大程序来实现。但该程序只能以固定的放大倍数去进行观看,有时并不能满足我们的需要。本文就通过MFC基本类库提供的StretchBlt函数来实现对屏幕图象的局部放大,并且可以随意放大、缩小,选取到合适的放大倍数来对图像的细节进行观察。设计与实现本程序主要用来对图像的局部进行可调倍数的放大,应当具有以下主要功能:1. 移动MOUSE放大显示图像的不同部位2. 左击增加放大倍率、右击减少放大倍率。从光学角度来看,对物体的放大成像是通过把较小的真实物体显示成尺寸较大
阅读全文
摘要:基础知识1.PictureBox控件的使用2.加载位图文件1.通过文件路径获得位图句柄//获得位图句柄void CMovePictureDlg::GetHandleFromPath(CString path){ hBitmap= (HBITMAP)::LoadImage(AfxGetInstanceHandle(),path,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);//创建位图句柄}2.通过位图句柄创建位图对象并获得位图信息//获取位图对象void CMovePictureDlg::GetBitMap(HBITMAP hBit
阅读全文
摘要:1.读取图片数据函数原型:bool LoadImage(const char *pName, unsigned char *pBitData);函数功能,读取pName指向的图片文件的位图数据bool LoadImage(const char *pName, unsigned char *pBitData){ HDC hdcTemp; // DC用来保存位图 HBITMAP hbmpTemp; // 保存临时位图 IPicture *pPicture; // 定义IPicture Interface OLECHAR wszPath[MAX_PATH+1]; // 图片的完全路径 char sz
阅读全文
摘要:// MySkinDlg.cpp : implementation file//#include "stdafx.h"#include "MySkin.h"#include "MySkinDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////////
阅读全文
摘要:1.WindowProc是你给自己的窗口定义的窗口处理函数DefWindowProc是windows平台提供的默认窗口处理函数如果某些消息你不需要做特别的处理,调用DefWindowProc进行处理就可以了,不需要你自己再去些那些windows的"标准动作"2.根据1,显然,你只能定义WindowProc而不能定义DefWindowProc看看MFC的CWnd源码就一目了然了LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){// OnWndMsg does most of the wor
阅读全文
摘要:msdn上的解析CWnd::SubclassWindowBOOL SubclassWindow( HWND hWnd );Return ValueNonzero if the function is successful; otherwise 0.ParametershWndA handle to the window.RemarksCall this member function to "dynamically subclass" a window and attach it to this CWnd object. When a window is dynamical
阅读全文
摘要:序:本人对Windows系统、MFC谈不上有深入的了解,但对MFC本身包装API的机制很有兴趣,特别是读了候老师的《深入浅出MFC》后,感觉到VISUAL C++的Application FrameWork十分精制[不敢用“完美”一词]。在以前,我对SDI结构处理消息有一定的认识,但对于模式对话框的消息机制不了解,读了《深入》一书也没能得到解决,近日,通过在CSDN上网友的帮助,和查阅MSDN,自认为已经了解。一时兴起,写下这些文字,没有其它目的,只是希望让后来者少走弯路,也希望和我一样喜欢“钻牛角尖”的人共同讨论、学习。如果你是牛人,那么你现在要慎重考虑有没有充足的时间读这些幼稚文字[何出此
阅读全文
摘要:走出MFC子类化的迷宫KEY WORDS:子类化SUBCLASSWINDOWMFC消息机制许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习,有些人可能对子类化机制比较陌生。我们先看看什么是Windows的子类化。Windows给我们或是说给它自己定义了许多丰富的通用控件,如:Edit、ComboBox、ListBox……等,这些控件功能丰富,能为我们开发工作带来极大方面,试想:我们单单是自己实现一个EDIT控件是多么的艰难!但是,在实际开发中还是有些情况这些标准控件也无能为力,比如:在我们的应用中要求一个EDIT得到老师对学生的评价A、B、C
阅读全文
摘要:1、CWnd::AttachBOOLAttach(HWNDhWndNew);返回值:如果成功,则返回非零值;否则返回0。参数:hWndNew指定了Windows窗口的句柄。说明:将一个Windows窗口与CWnd对象相连接。CWnd::SubclassWindowBOOLSubclassWindow(HWNDhWnd);返回值:如果函数成功,则返回非零值;否则返回0。参数:hWnd窗口句柄。说明:调用这个成员函数以动态子类化一个窗口,并将它与这个CWnd对象相连接。当窗口被动态子类化时,窗口消息将通过CWnd的消息映射,并首先调用CWnd类中的消息处理函数。发送给基类的消息将被传递给窗口的缺省
阅读全文
摘要:CWnd,CDC, Cxxx等都是MFC的类,这些类提供了很多成员函数来执行系统调用等操作,但是核心的类成员数据都是 句柄,(包括窗口句柄,DC句柄,线程句柄等)。 m_hWnd m_hDC m_hThread 如果这些类对象的这些句柄为空,就表示无效对象。比如你 CWnd * pWnd = new CWnd,执行是合法的,但是没有Create就没有窗口句柄,基本上就是一个无效对象,只是系统内存申请了内存分配空间而已,很多操作都无法执行(debug模式下会出现断言错误窗口)。 但是,假如你申请了一个CWnd,CDC的对象实体,可以使用Attach来指定一个有效的句柄付给这个对象。那么此对象就是
阅读全文
摘要:一、Windows对象和MFC对象的区别?MFC对象实际上并没有把整个Windows对象都包装在其中。对于窗口:MFC对象它只是有一个窗口句柄而已,这个窗口句柄如果指向一个实际存在的窗口对象(窗口对象,也就是WNDCLASS,是一个Windows对象),那么这个MFC对象就是有效的,否则这个MFC对象是空的。如果你还不明白,请回忆一下,当我们使用MFC创建一个窗口时,是分两步进行的:第一步,new一个CWnd对象,这一步是创建MFC对象,但是其中的HWND还是非法的,因为对应的Windows对象还没有被创建出来;第二步,调用CWnd的成员函数Create创建真正的Windows对象,同时,把先
阅读全文
摘要:当一个文件被映射到调用进程的地址空间时,GetModuleHandle函数得到其中某一模块的句柄。 使用GetModuleHandle函数格式:HMODULE GetModuleHandle( LPCTSTR lpModuleName); 参数 lpModuleName: [in]用指针指向一个包含模块名以NULL字符结尾的串,模块是.dll或.exe文件。如果文件扩展名省略,则增加默认的扩展名.dll。文件名串可以是省略号(...),表示模块名没有扩展名。这个串不是必须指定一个路径。当指定一个路径时,确定要用反斜线(\),而不是斜线(/)。这个模块名将和当前映射到调用进程地址...
阅读全文
摘要:论坛有会员用到了。,今天给大家说说CSring如何在非mfc下的调用第一:先要包含 #include "afx.h"包含之后会报windows.h重复定义我们需要把这个头文件包含在windows.h的前面第二:alt+f7 快捷键 设置---或者菜单--工程--设置---点击常规--使用MFC作为静态的 或者可以设置MFC为共享的DLL第三:alt+f7 快捷键 设置---或者菜单--工程--设置---切换到C\C++点击Code Generation --use-run-time library 选择MUltithranded如果你第二:选择的是MFC作为共享的dll的话
阅读全文
摘要:最近用到窗口变化的一些东西,遇到几个相关的消息函数,简要分析,作为备忘。3个消息分别是:WM_SIZE、WM_SIZING、WM_GETMINMAXINFO;分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。OnGetMinMaxInfo这个函数在窗口初始化的时候会被调用一次,当窗口大小发生改变的时候也会被调用。利用这个函数,可以比较方便的实现窗口最大最小尺寸的控制。参数lpMMI是一个结构体指针,其中包含了有关窗口的最大化大小
阅读全文
摘要:考虑单窗口情况: 假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序: 1. 手工调用pWnd->DestroyWindow(); 2. DestroyWindow会发送WM_DESTROY; 3. WM_DESTROY对应的消息处理函数是OnDestroy(); 4. DestroyWindow会发送WM_NCDESTROY; 5. WM_NCDESTROY对应的消息处理函数是OnNcDestroy; 6. OnNcDestroy最后会调用PostNcDestroy; 7. PostNcDestroy经常被用户重载以提供释放内存...
阅读全文
摘要:经过一番查找,最给力的参考是http://www.cnblogs.com/visoeclipse/archive/2010/02/27/1674866.html-----------------------以下为转载--------------------------------------------------------------首先感谢这位几仁兄的几篇博客: http://hi.baidu.com/fairysky/blog/item/130dda13db7b050a5aaf53be.html http://hi.baidu.com/fairysky/blog/item/e7a...
阅读全文
摘要:修改左上角的图标和任务栏里图标 在对话框构造函数中1 CTestDlg::CTestDlg(CWnd* pParent )2 : CDialog(CTestDlg::IDD, pParent)3 {4 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);5 } 改过后:1 CTestDlg::CTestDlg(CWnd* pParent )2 : CDialog(CTestDlg::IDD, pParent)3 {4 m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);5 ...
阅读全文