随笔分类 -  图形界面编程

摘要:项目中对话框收集完信息要通过网络发送出去,发送之前需要对用户信息做一些格式化处理。索性直接开个线程,在新线程中处理所有的事情(包括取得信息+格式化信息+网络发送信息)。过程中却发现新线程中GetDlgItem总是不能取得正确控件对象解决方法:保证GetDlgItem和对话框创建在统一线程即可。具体原因应该是MFC使用了TLS(线程局部存储)。具体有时间再详细看看吧。 阅读全文
posted @ 2014-02-21 19:30 ssp1024 阅读(323) 评论(0) 推荐(0)
摘要:这几天修改旧项目,在原来MFC封装框架之上添加PNG透明支持。使用GDI+中的 Image 和 Graphics 类的画图方法:Status DrawImage( [in] Image *image, [in] INT x, [in] INT y, [in] INT srcx, [in] INT srcy, [in] INT srcwidth, [in] INT srcheight, [in] Unit srcUnit);发现画出的某些图片(具体是某些旧项目下面的BMP图片)比实际尺寸大,但是调用Image类方法GetWidth()和GetHeight()返回的尺寸是正确的。解... 阅读全文
posted @ 2014-02-17 21:37 ssp1024 阅读(682) 评论(0) 推荐(0)
摘要:参考:http://download.csdn.net/download/zhuyf87/6859133想要实现一个可拖动的按钮,就像拖动标题栏一样拖动主窗口(按钮父窗口)。记录鼠标状态是否是按下,如果是则在鼠标移动的同时向父窗口发送WM_NCLBUTTONDOWN消息。可是却发现鼠标只能响应拖动消息,却不能响应按下消息。通过参考上面的实例程序,发现需要在响应拖动函数中调用系统API :ReleaseCapture();这样的效果是按钮响应拖动之后会忽略点击消息,如果想在拖动之前先出现点击效果可以在ReleaseCapture()之前向自身发送WM_LBUTTONUP消息。关键代码:virtu 阅读全文
posted @ 2014-02-12 11:39 ssp1024 阅读(1287) 评论(0) 推荐(0)
摘要:背景:win7系统中可以在设置窗口底部有阴影效果,这样使得窗口看起来更有立体感。如果我们自定义窗口,没有用到系统默认的边框,这时阴影效果也随着没有了。我们需要在这样的窗口上加上阴影效果。方法:1)创建一个WS_EX_TRANSPARENT样式的窗口,该类窗口具有鼠标穿透的效果(这样的效果也可以用SetWindowRgn实现,但是我们这里比较特殊,只能使用前者)。2)将窗口绘制成阴影,这个可以用GDI+来实现。3)跟随目标窗口,这里需要处理这些消息:show、hide、minimize、maximize、paint、resize。这里采用的做法是hook目标窗口的窗口处理函数。这比编写代码是接受 阅读全文
posted @ 2014-01-16 21:06 ssp1024 阅读(2059) 评论(0) 推荐(0)
摘要:有时候程序需要做成单例的,就是系统中只能存在一份运行的示例,这个可以通过系统内核对象Metux来实现。让我们检测到系统中已有一份运行的实例时,最好的做法是将那个进程的主窗口显示给用户。首先想到的是调用SetForgroundWindow(),改方法可以将窗口变为前景窗口,即用户可以交互的窗口。但是当目标窗口是最小化的时候(而不是在他窗口的后面)这个调用并没有使窗口显示。解决方法是模拟点击任务栏的窗口图标,像该窗口发送WM_SYSCOMMAND消息,SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE ,0); 阅读全文
posted @ 2014-01-12 20:02 ssp1024 阅读(281) 评论(0) 推荐(0)
摘要:在MFC或者WTL工程里,如果使用了RichEdit控件,会发现程序无法启动,编译器却没给出任何警告或错误。在网上找了下资料,原来是没有加载支持RichEdit的动态库。在MFC下面添加:AfxInitRichEdit();在WTL下面添加:HMODULE hRichDll = LoadLibrary(_T("riched20.dll"));程序结束时:if(hRichDll){ FreeLibrary(hRichDll); hRichDll= NULL;}-------------------------------------------我是分割线----------- 阅读全文
posted @ 2014-01-02 20:18 ssp1024 阅读(1140) 评论(0) 推荐(0)
摘要:WTL提供了一个很棒的对话框扩充类CDialogResize,可以使对话框控件随对话框大小改变而改变(包括大小和位置,只能选一个)。该类定义在:atlframe.h一个很棒的教程:Using WTL's Built-in Dialog Resizing Class还有一个可以在MFC中实现同样效果:Using WTL's Built-in Dialog Resizing Class for MFC步骤如下:1.继承列表加入CDialogResize,如:2.添加控件到表格中,跟MFC中的消息映射表是同样的道理:3.初始化相关数据,可以在InitDialog中进行:4.把这个类加 阅读全文
posted @ 2013-12-26 19:41 ssp1024 阅读(973) 评论(0) 推荐(0)
摘要: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... 阅读全文
posted @ 2013-12-04 20:18 ssp1024 阅读(878) 评论(0) 推荐(0)
摘要:现在需要实现窗口屏幕边缘吸附的效果,现在只考虑屏幕右边缘。思路如下:当窗口右侧与屏幕右侧距离小于某个值(假设是20px)的时候,改变窗口的水平位置,使窗口右边框紧贴屏幕右侧。这个动作时通过WM_MOVING消息实现的,当窗口移动时,窗口会收到这个消息,我们可以在这个消息中通过参数修改窗口位置。这样实现的话问题就出现了,拖动窗口到右侧可以看到吸附效果,可是向左拽不动窗口了。将屏幕最右侧20px像素矩形区域作为一个特殊区域(就叫做吸附区吧),只要窗口右侧落到这个区域内,就移动窗口至屏幕右边缘。如果想要拖动窗口离开边缘,需要下面两个状态值:窗口是否已经停靠在右侧鼠标是否是向左拖动窗口很明显,如果上面 阅读全文
posted @ 2013-11-07 19:46 ssp1024 阅读(1504) 评论(0) 推荐(0)
摘要:附上上篇文章----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 阅读全文
posted @ 2013-11-06 18:25 ssp1024 阅读(1339) 评论(0) 推荐(0)
摘要:在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 = ... 阅读全文
posted @ 2013-10-30 21:24 ssp1024 阅读(2936) 评论(0) 推荐(0)
摘要:问题:程序中有如下逻辑:向网络请求数据,然后获取响应的部分HTML代码,此时获取到的数据为宽字节字符(wchar_t)。需要对获取到的部分HTML代码进行分析,但是处理逻辑只接受多字节字符(char),这个就需要进行编码转换,使用ATL提供的转换函数(其实是个模板类)CW2A。并且使用默认的code page :CP_THREAD_ACP。分析过程会从HTML中解析出一些属性值,当然这些属性值是以多字节字符返回的。程序其他地方需要使用这些属性值,我们又得把多字节字符转换成宽字节字符,使用CA2W。在中文操作系统下面一切正常,可是到了英文系统下就会出现HTML中的中文属性值乱码。解决方法:在使用 阅读全文
posted @ 2013-10-30 13:05 ssp1024 阅读(991) 评论(0) 推荐(0)
摘要:困扰了一周的问题竟然是这个原因:在 TrackPopoMenu 调用之前调用 SetForegroundWindow 。参考:http://www.slyar.com/blog/tray-menu-exit.html 阅读全文
posted @ 2013-10-13 10:17 ssp1024 阅读(296) 评论(0) 推荐(0)