共4页: 1 2 3 4 
re: 博客一周年纪念贴 Richard Wei 2013-05-02 19:40
@lwch
嗯,说得好。 确实会收到一些邀请 ^_^
re: 博客一周年纪念贴 Richard Wei 2013-05-01 17:25
@万连文
确实,无论你写什么东西,网上都或多或少的有人写过,但是很多时候你可能是似懂而非懂, 如果你能以别人看的懂的方式写出来, 就表示你真的懂了。

阅读优秀源码我觉的确实是一种除写博客之外的积累技术好方法, 当然阅读源码的前提是你已经有了比较好的技术积累, 你能真正看懂这些源码,理解作者的想法,理论上通过源码你可以达到国外技术专家的水平。

另外,不愿分享我觉得也是国内一些技术人员的“通病”, 学了一点“小技巧”就当成宝贝藏着掖着,实际上这样反而阻碍了自己的成长。
mark, 拜膜...
re: 山寨STL Richard Wei 2013-04-18 09:29
@Rick
这个我觉得没有标准答案, 跟你的C++功底和STL的使用频率有关,而且个人觉得STL的学习方式既可以走"瀑布"模型,也可以走"敏捷"模型,。
所谓瀑布指的是每步都走踏实之后再进入下一步,比如STL用的很熟练之后再深入原理。所谓敏捷是指先把所有的东西都走一遍,知道大概情况之后再深入每个阶段。我觉得两种方式各有利弊, 主要还是看个人情况。
@春秋十二月
受益就好, 其实关于菜单的原理我也是想了好久才明白的 ^_^
做了几年客户端开发,一直想学游戏开发, 无奈数学都忘光了.
如果进入游戏公司不搞核心,只是写写逻辑,感觉也没啥意思.
博主在该领域混,不知有啥建议?
re: google的开源项目总结(转载) Richard Wei 2013-04-09 21:45
应该是机器翻译的,看起来挺费劲。
@jacky
这是系统系统的默认行为。
当然我上面的是简化版的实现, 实际情况要考虑更多问题, 具体可以参考MFC里DoModal的实现源码
分析的不错,支持下.
@waiting4you

对, OnIdle如果是放在Timer里是没有影响的 ,如果是自己在在消息循环里调用, 就只能写成全局函数,然后在这里调用了。

Windows系统对于菜单的实现应该不是用SetCapture的方式, 调用TrackPopupMenu后也是阻塞式的,至于父窗口有保持没有激活可以看标题栏是不是保持高亮。
@waiting4you
SetCapture的方法应该是不正确定。
菜单弹出时焦点当然还在父窗口上,这是菜单窗口是没有获得焦点的, 菜单窗口的键盘消息需要父窗口转发给他。我的测试代码基本上已经完整的模拟了菜单的行为。
re: 软件换肤的原理 Richard Wei 2013-03-05 08:59
@mike

这个看产品定位吧?
GDI最通用, 各个系统上都能直接跑;
GDI+稍微有点依赖,但是一般问题不大,开发也方便很多;
D2D性能和效果都不错,如果自己开发DirectUI的界面库可以考虑,另外它也不支持XP;
WPF依赖.net, 程序大小和性能方面都有些限制,但是开发效率和效果都不错。

所以一般来说如果你开发的是通用软件,比如QQ或者迅雷,既要考虑性能还要考虑各个平台的支持,在XP没有消亡之前还是会选择GDI(+)。
如果你做是项目型的管理软件, 要考虑开发效率, 一般会选择WPF。
如果你是自己开发DirectUI界面库, 可以考虑同时支持GDI(+)和Direct2D。
re: 基于WinDbg的内存泄漏分析 Richard Wei 2013-03-01 20:08
@zuhd
懂得程序运行的原理是关键, 工具都差不多, 用GCC和VC一样可以写C++代码。
@路人甲
是的, C#语言本身支持property, C++中只能通过Get,Set函数了, COM也是这么做的。
re: 基于WinDbg的内存泄漏分析 Richard Wei 2013-02-27 17:30
@Hunter
需要memleaktest.exe的pdb符号文件,我用Vs2008, release版也会默认生成,如果没有生成就要在编译选项里设置了。
re: 开源一套DirectUI界面库 Richard Wei 2013-02-25 20:49
这里有内存泄露 :
else if(info.wParam == WPARAM_KILL_TIMER)
{
if(pTimerRet != NULL)
{
::KillTimer(m_hWnd, pTimerRet->nTimerIndex);
m_arTimer.erase(std::remove(m_arTimer.begin(), m_arTimer.end(), pTimerRet), m_arTimer.end());
delete pTimerRet; //内存泄露
lRet = S_OK;
}
}
@a_very_big_graywolf
只是总结, 以后再用到会方便一些。
不错, 前2个需求也可以用继承来实现, 但是如果该特化函数基类内部有调用,就可能要搞成虚函数了。
@korall
不错 ,这种可能更通用, 虽然我一直没用。
已在文章后面加上你提的方案。:)
re: 范型编程杂谈 Richard Wei 2013-02-19 17:11
@华夏之火
不错, 从C++11的变化可以看到好多新特性都是针对模板编程的,范型编程是C++编程的趋势
@lwch
惭愧, 虽然工作好多年,最近才开始研究模板,准备稍微深入一下。
@lwch
不懂, 什么意思?
不过看了你的博客,学习了 ^_^
re: 在C++中实现事件(委托) Richard Wei 2013-02-07 17:03
@Jeff Chen
惭愧, 没研究过boost。
可能优点就是简单,可以自己掌控吧,实际上好多公司是禁用boost的。
re: 在C++中实现事件(委托) Richard Wei 2013-02-01 17:05
@zdhsoft
恩,本身就是借助c++11的 function和bind进行封装
re: 在C++中实现事件(委托) Richard Wei 2013-01-31 17:36
@lierlier
多谢指点,感觉你的实现方式对外界比较灵活,性能也比较高。
而我的实现更强调封装,适合于在某个框架中使用。
re: 在C++中实现事件(委托) Richard Wei 2013-01-31 14:49
@lierlier
确实, 所以.Net里的事件返回类型都都void。这里带返回值的事件适用于只有一个函数绑定。
re: 2012龙年之旅 Richard Wei 2013-01-27 22:00
牛, 一个人把微软一帮人的事情都做了。

啥时候写文章介绍下微软RPC内部的实现原理, 对这个比较有兴趣, 呵呵。
re: 理解WinRT Richard Wei 2013-01-13 17:47
WinRT的API看MSDN, 大部分和Xaml相关,其实没多少东西: http://msdn.microsoft.com/en-us/library/windows/apps/br211377.aspx
re: 理解WinRT Richard Wei 2013-01-13 17:44
@bukebushuo
WinRT的定义看这里:http://en.wikipedia.org/wiki/Windows_Runtime

Windows Runtime, or WinRT, is a platform-homogeneous application architecture on the Windows 8 and Windows RT operating systems.
re: QQ截图时窗口自动识别的原理 Richard Wei 2012-12-20 13:11
@嘿嘿
是的, QQ这种实时的方式如果启动截图后, 后台窗口一变, 识别出来的就是错误的了.
我这种在启动截图时保存所有窗口Rect的做法才是可靠的.
re: QQ截图时窗口自动识别的原理 Richard Wei 2012-11-17 20:12
看到有些人对窗口识别的代码感兴趣,在博文最后加上了通过Enum方式查询窗口的代码
还是直接用C++ 11中的function吧
re: 范型编程杂谈 Richard Wei 2012-11-11 23:56
@r.h
用GP实现运行时多态在C++ 中现在来说还做不到,ATL同时用了GP和OO。
有兴趣的话可以看下这篇http://www.cppblog.com/longshanks/archive/2007/12/06/37915.aspx
re: C++模板会使代码膨胀吗 Richard Wei 2012-11-09 08:42
@溪流
继承和模板在一定程度上都可以实现代码重用, 我想我们平时所说的模板使代码膨胀是相对OO里的继承而言.
re: GacUI 0.4.0.0 发布啦 Richard Wei 2012-10-19 15:09
Hoho, 支持下大牛
re: 消息耦合还是接口耦合 Richard Wei 2012-10-15 10:25
@zaccheo

接口的管理,我感觉有2种方式: 一种是基于COM的引用计数,大家都可以保存接口指针,这里要避免循环引用;还有一种是让Module Manger统一管理,也就是只有Module Manager保存有接口指针,其他模块不保存接口指针,要使用时统一向Module Manger要。

第一种高效,第二种相对安全
re: 消息耦合还是接口耦合 Richard Wei 2012-10-13 22:28
@123
我们是客户端应用,各模块内部却确实会有多线程,但是各模块间的调用及事件触发都是跑在主线程里,所以这种情况下,如果走消息,基本上要给每个消息维护一个数组,内部保存哪些人订阅了该消息,当该消息到达时进行依次分发,所以这里无论是内存大小还是性能都会比接口直接调用消耗更多。

接口每个方法都有各自不同的明确的参数定义, 消息的话因为要求所有消息参数一致,所以会导致参数含义不明确,内部保存的指针需要强制转换才能使用。

"客户端小规模应用";是相对“大规模Server集群”, 其实我们要做的东西本身也挺大挺复杂,好几十人同时开发。
在Win7的Aero模式下因为桌面的窗口层次有变化, 上面的代码会找不到窗口"SHELLDLL_DefView"窗口

简单改了下,未完全测试:
HWND GetShellDLLForWin7()
{
HWND hWndShell = NULL;
HWND hWndDesktop = GetDesktopWindow();
if(hWndDesktop == NULL) return NULL;

HWND hWndWorkerW = NULL;
while(TRUE)
{
hWndWorkerW = FindWindowEx(hWndDesktop, hWndWorkerW, _T("WorkerW"), NULL);
if(hWndWorkerW == NULL) break;

if(::GetWindowLong(hWndWorkerW, GWL_STYLE) & WS_VISIBLE)
{
break;
}
else
{
continue;
}
}

if(hWndWorkerW != NULL)
{
hWndShell = FindWindowEx(hWndWorkerW, NULL, _T("SHELLDLL_DefView"), NULL);
}

return hWndShell;
}

BOOL CheckParent(HWND hWnd)
{
static HWND s_hWndOldParent = NULL;

HWND hWndProgram = NULL;
HWND hWndShellDLL = NULL;
hWndProgram = FindWindow(_T("Progman"), _T("Program Manager"));
if(hWndProgram != NULL)
{
hWndShellDLL = FindWindowEx(hWndProgram, NULL, _T("SHELLDLL_DefView"), NULL);

//Win7
if(hWndShellDLL == NULL)
{
hWndShellDLL = GetShellDLLForWin7();
}
}

if(hWndShellDLL != NULL
&& hWndShellDLL != s_hWndOldParent)
{
SetWindowLong(hWnd, GWL_HWNDPARENT, (LONG)hWndShellDLL);
s_hWndOldParent = hWndShellDLL;
return TRUE;
}

return FALSE;
}
@春秋十二月
多谢,总结的挺好
@万连文
确实,C++11里把这个叫住Alias templates
good
re: 理解程序内存 Richard Wei 2012-09-20 19:25
@春秋十二月
没看过windows高级调试一书, 但是感觉比较经典的书是<<软件调试>>
re: API Hook在TA中的应用 Richard Wei 2012-09-19 19:14
@birdhsy
不好意思,因为是公司代码,所以不好外传
re: QQ截图时窗口自动识别的原理 Richard Wei 2012-09-06 12:47
@m775@sina.com
其实我用enum的方式已经自己实现了,参考http://www.cppblog.com/weiym/archive/2012/08/21/187801.html
@毕达哥拉斯半圆
貌似上面的朋友 溪流 写过,http://www.cppblog.com/Streamlet/archive/2010/10/24/131064.aspx
共4页: 1 2 3 4