随笔分类 - MFC
摘要:项目中对话框收集完信息要通过网络发送出去,发送之前需要对用户信息做一些格式化处理。索性直接开个线程,在新线程中处理所有的事情(包括取得信息+格式化信息+网络发送信息)。过程中却发现新线程中GetDlgItem总是不能取得正确控件对象解决方法:保证GetDlgItem和对话框创建在统一线程即可。具体原因应该是MFC使用了TLS(线程局部存储)。具体有时间再详细看看吧。
阅读全文
摘要:参考:http://download.csdn.net/download/zhuyf87/6859133想要实现一个可拖动的按钮,就像拖动标题栏一样拖动主窗口(按钮父窗口)。记录鼠标状态是否是按下,如果是则在鼠标移动的同时向父窗口发送WM_NCLBUTTONDOWN消息。可是却发现鼠标只能响应拖动消息,却不能响应按下消息。通过参考上面的实例程序,发现需要在响应拖动函数中调用系统API :ReleaseCapture();这样的效果是按钮响应拖动之后会忽略点击消息,如果想在拖动之前先出现点击效果可以在ReleaseCapture()之前向自身发送WM_LBUTTONUP消息。关键代码:virtu
阅读全文
摘要:1.按钮好像被半透明白色罩住了。解决方法就是相应ON_WM_ERASEBKGND,仅仅返回TRUE即可。2.使用ATL CImage类, Load(LPCTSTR) 方法加载一个图片,可以发现图片透明部分显示为白色。这是因为显示每像素实际像素值需要和ALPHA值做预乘,而该方法没做ALPHA值混合,也就相当于和纯白色值混合,所以透明部分会现白色(http://blog.csdn.net/mergerly/article/details/4710676)。3.ALPHA值混合:if(_tcsicmp(pszFileName+(_tcslen(pszFileName)-4), _T(".
阅读全文
摘要:某些时候我们需要改变窗口的默认行为,就需要改变窗口过程(子类化窗口),总结了以下三种方法,欢迎讨论。1)最简单的方法,可以通过传递GWL_WNDPROC调用SetWindowLong来改变窗口过程,可是这个函数还需要窗口句柄作为参数,而句柄只有在窗口创建成功后才合法,所以这种做法只能当不用改变默认WM_CREATE行为(以及一些窗口创建过程中的动作)的时候才适用。2)窗口过程是在窗口类注册时确定的,要改变窗口函数就需要注册一个新类(参考DuiLib中的Edit空控件实现):首先调用系统API获得窗口类的详细信息,结果放在lpwcx指向的内存区中。BOOL WINAPI GetClassInfo
阅读全文
摘要:背景:win7系统中可以在设置窗口底部有阴影效果,这样使得窗口看起来更有立体感。如果我们自定义窗口,没有用到系统默认的边框,这时阴影效果也随着没有了。我们需要在这样的窗口上加上阴影效果。方法:1)创建一个WS_EX_TRANSPARENT样式的窗口,该类窗口具有鼠标穿透的效果(这样的效果也可以用SetWindowRgn实现,但是我们这里比较特殊,只能使用前者)。2)将窗口绘制成阴影,这个可以用GDI+来实现。3)跟随目标窗口,这里需要处理这些消息:show、hide、minimize、maximize、paint、resize。这里采用的做法是hook目标窗口的窗口处理函数。这比编写代码是接受
阅读全文
摘要:有时候程序需要做成单例的,就是系统中只能存在一份运行的示例,这个可以通过系统内核对象Metux来实现。让我们检测到系统中已有一份运行的实例时,最好的做法是将那个进程的主窗口显示给用户。首先想到的是调用SetForgroundWindow(),改方法可以将窗口变为前景窗口,即用户可以交互的窗口。但是当目标窗口是最小化的时候(而不是在他窗口的后面)这个调用并没有使窗口显示。解决方法是模拟点击任务栏的窗口图标,像该窗口发送WM_SYSCOMMAND消息,SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE ,0);
阅读全文
摘要:在MFC或者WTL工程里,如果使用了RichEdit控件,会发现程序无法启动,编译器却没给出任何警告或错误。在网上找了下资料,原来是没有加载支持RichEdit的动态库。在MFC下面添加:AfxInitRichEdit();在WTL下面添加:HMODULE hRichDll = LoadLibrary(_T("riched20.dll"));程序结束时:if(hRichDll){ FreeLibrary(hRichDll); hRichDll= NULL;}-------------------------------------------我是分割线-----------
阅读全文
摘要:MFC中的视图文档结构有CHtmlView,可以展示网页,其原理是IWebBrowser的封装,我们当然可以自己封装一个html控件,不多利用现有类来派生更加简单。 由于CHtmlView是视图文档结构中的一部分,需要CHtmlView视图从中剥离出来。只用重载下面三个函数。 1 BEGIN_MESSAGE_MAP(CHTMLCtrl, CHtmlView) 2 //{{AFX_MSG_MAP(CHTMLCtrl) 3 ON_WM_DESTROY() 4 ON_WM_MOUSEACTIVATE() 5 //}}AFX_MSG_MAP...
阅读全文
摘要:现在需要实现窗口屏幕边缘吸附的效果,现在只考虑屏幕右边缘。思路如下:当窗口右侧与屏幕右侧距离小于某个值(假设是20px)的时候,改变窗口的水平位置,使窗口右边框紧贴屏幕右侧。这个动作时通过WM_MOVING消息实现的,当窗口移动时,窗口会收到这个消息,我们可以在这个消息中通过参数修改窗口位置。这样实现的话问题就出现了,拖动窗口到右侧可以看到吸附效果,可是向左拽不动窗口了。将屏幕最右侧20px像素矩形区域作为一个特殊区域(就叫做吸附区吧),只要窗口右侧落到这个区域内,就移动窗口至屏幕右边缘。如果想要拖动窗口离开边缘,需要下面两个状态值:窗口是否已经停靠在右侧鼠标是否是向左拖动窗口很明显,如果上面
阅读全文
摘要:附上上篇文章----C++调用JS:http://www.cnblogs.com/aishangxue/p/3397781.htmlJS可以调用C++编写的函数,需要以下步骤:1)定义一个组件类,需要实现IDispatch接口。2)在GetExternal 函数中返回上面定义组件。3)在定义的组件类中实现GetIDsOfNames,GetIDsOfNames( __RPC__in REFIID riid, __RPC__in_ecount_full(cNames ) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_f
阅读全文
摘要:需要删除一个为注册为com组件的dll,反注册过程神马的都已经写好了。现在需要在删除之前确定组件是否是好的。ProgId,dll名称以及ClsId都是知道的。首先,在网上查找相关资料,有两种方式:1)通过查找注册表,因为所有的com组件都注册在HKEY_CLASS_ROOT下面,通过查看注册该组件的键值是否存在来判断。2)通过CoCreateInstance函数来创建这个com组件的对象,创建成功说明正常。在此选择第二种方式。因为第一种仅仅判断了该com组件注册过而且注册信息还保留着,文件是否仍然存在、键值是否损坏没有考虑。判断的过程很顺利,不过删除出现了问题,发现dll文件可以正常删除,可以
阅读全文
摘要:在WebBrowser中C++可以和JS互相通信,下面说一下怎样实现C++调用JS。所有的网页全局函数均是window的一个方法,所以首先获取到页面的window对象。将所调用的JS方法名转换为ID,IDispatch对象的GetIDsOfNames方法。通过函数ID调用JS函数,IDispatch对象的Invoke方法。一下是DuiLib中的WebBrowser具体实现:1)继承CWebBrowserUI创建一个新类。这里说下这个函数 1 IDispatch* DuiLib::CWebBrowserUI::GetHtmlWindow() 2 { 3 IDispatch* pDp = ...
阅读全文
浙公网安备 33010602011771号