CDateTimeUI Xp下的bug修复

Stella981
• 阅读 590

CDateTimeUI 的bug修复。修改CDateTimeWnd的HandleMessage方法

if(WM_NOTIFY==uMsg)
{
    ::SetFocus(m_hWnd);
}
if( uMsg == WM_KILLFOCUS /**/)
{
      ::OutputDebugString("WM_KILLFOCUS\n");
      if( uMsg == WM_KILLFOCUS /**/)
       {
            //这里肯可能需要优化,因为FindWindow找出来的窗口不一定是本进程的窗口
            HWND hh=::FindWindow(_T("SysMonthCal32"),NULL);
            if(::IsWindow(hh))
            {
                 MCHITTESTINFO pp;
                 memset(&pp,0,sizeof(pp));
                 //pp.uHit=MCHT_CALENDAR;
                 GetCursorPos(&pp.pt);
                 ::ScreenToClient(hh,&pp.pt);
                 pp.cbSize=sizeof(pp);
                 MonthCal_HitTest(hh,&pp);
                 //下一个月
                 if(pp.uHit==MCHT_TITLEBTNNEXT)
                 {
                     return 1;
                 }
                 //上一个月
                 if(pp.uHit==MCHT_TITLEBTNPREV)
                 {
                     return 1;
                 }
            }else{
                POINT pt;
                ::GetCursorPos(&pt); 
                RECT rt;
                ::GetWindowRect(m_hWnd,&rt);
                if(
                    !(pt.x>=rt.left&&pt.x<=rt.right)||
                    !(pt.x>=rt.top&&pt.x<=rt.bottom)
                 )
                {
                    ::OutputDebugString("CLose\n");
                    lRes= OnKillFocus(uMsg,wParam, lParam,bHandled);
                }
             }
       }
}

完整代码:

LRESULT CDateTimeWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        LRESULT lRes = 0;
        BOOL bHandled = TRUE;
        /**xpBug***/
        DWORD ProcessId;
        if(WM_SETFOCUS==uMsg)
        {
            ::OutputDebugString("WM_SETFOCUS\n");
        }
        if(WM_NOTIFY==uMsg)
        {
            ::SetFocus(m_hWnd);
        }
        if( uMsg == WM_KILLFOCUS /**/)
        {
            ::OutputDebugString("WM_KILLFOCUS\n");
            if( uMsg == WM_KILLFOCUS /**/)
            {
                //这里肯可能需要优化,因为FindWindow找出来的窗口不一定是本进程的窗口
                HWND hh=::FindWindow(_T("SysMonthCal32"),NULL);
                //Isdel=true;
                if(::IsWindow(hh))
                {
                    MCHITTESTINFO pp;
                    memset(&pp,0,sizeof(pp));
                    GetCursorPos(&pp.pt);
                    ::ScreenToClient(hh,&pp.pt);
                    pp.cbSize=sizeof(pp);
                    MonthCal_HitTest(hh,&pp);
                    //下一个月
                    if(pp.uHit==MCHT_TITLEBTNNEXT)
                    {
                        return 1;
                    }
                    //上一个月
                    if(pp.uHit==MCHT_TITLEBTNPREV)
                    {
                        return 1;
                    }
                }else
                {
                    POINT pt;
                    ::GetCursorPos(&pt); 
                    RECT rt;
                    ::GetWindowRect(m_hWnd,&rt);
                    if(
                        !(pt.x>=rt.left&&pt.x<=rt.right)||
                        !(pt.x>=rt.top&&pt.x<=rt.bottom)
                        )
                    {
                        ::OutputDebugString("CLose\n");
                        lRes= OnKillFocus(uMsg,wParam, lParam,bHandled);
                    }
                            
                }
             }
        }
        else/**/ if (uMsg == WM_KEYUP && (wParam == VK_DELETE || wParam == VK_BACK))
        {
            LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
            m_pOwner->m_nDTUpdateFlag = DT_DELETE;
            m_pOwner->UpdateText();
            PostMessage(WM_CLOSE);
            return lRes;
        }
        else if (uMsg == WM_KEYUP && wParam == VK_ESCAPE)
        {
            LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
            m_pOwner->m_nDTUpdateFlag = DT_KEEP;
            PostMessage(WM_CLOSE);
            return lRes;
        }
        else 
            bHandled = FALSE;

        if(!bHandled ) 
        {
            return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
        }
        return lRes;
    }
点赞
收藏
评论区
推荐文章
待兔 待兔
12个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
NHibernate 的 SetResultTransformer 方法在Oracle下的Bug修复
    NHibernate的SetResultTransformer方法在Oracle下会出现“Couldnotfindasetterforproperty”错误,这是Nhibernate在Oracle下使用的一个Bug。针对此Bug我可以自己进行修复。    下载NHibernate源码,将Property下的“ChainedPro
Stella981 Stella981
3年前
BeetlSQL 3.0.9 发布,Idea 插件发布
本次发布修复了bug以及发布了可在idea社区和专业版使用的BeetlSQL插件修复代码生成到本地路径错误的Bug修复FetchOne抓取数据错误。Idea插件发布<dependency<groupIdcom.ibeetl</groupId<artifactIdbeetlsql</artifactId<version3.0.9
Wesley13 Wesley13
3年前
gnome
从2014.8.14到2014.11.11,在David的帮助下共修复了两个bug。三个月以来,也有过挫折,也想过放弃,但更多的是编程过程中的喜悦和坚持。三个月,自己从其中收获了很多。好久也没有来写blog了,就着刚刚修复一个bug的小空闲,来这里记录下自己的收获。第一个bug的链接:https://bugzilla.gnome.org/show
Stella981 Stella981
3年前
Nepxion Discovery 5.4.2 发布
发布日志版本更新:升级SpringBoot到2.1.9.RELEASE服务端更新:增加服务本身的权重路由修复叠加执行权重规则和版本区域策略会失效的Bug修复DiscoveryEnabledStrategy中apply方法执行两次的Bug
Wesley13 Wesley13
3年前
3天两版 Spring Boot 2.2.4 发布!紧急修复Spring Cloud Hoxton.SR1 兼容问题
SpringBoot2.2.4发布了,可以从repo.spring.io和MavenCentral获取。此版本修复了6个bug,进行了一些文档改进和依赖性升级,解决了Gradle5.3至5.6的依赖性解析问题。🐞Bug修复1.@ActiveProfiles与@SpringBootTest使用,覆盖s
Wesley13 Wesley13
3年前
CComboUI bug修复
duilibCComboUI 有时鼠标拖动不准bylssaint  次bug修复比较简单,但比较难找到原因先贴源码:  在 CComboWnd中找到HandleMessage方法。将if( uMsg  WM_KEYDOWN ) {        switch( wParam ) {    
Stella981 Stella981
3年前
Beetl 3.2.4.RELEASE,Java 模板引擎 Beetl
修复了3.2.1版本调增后,不兼容API的bug修复升级到3后,脚本引擎执行不支持Java直接调用的Bug<dependency<groupIdcom.ibeetl</groupId<artifactIdbeetl</artifactId<version3.2.4.RELEASE
Wesley13 Wesley13
3年前
ueditor1.4.3 springmvc图片上传
ueditor:百度富文本编辑器,地址:ueditor.baidu.com版本选择,之所以选择1.4.3,是因为ueditor1.4.2才修复在bootstrap环境下图片拖拽异常,看到1.4.3也修复了不少的bug,没敢使用1.4.2,稍微看了下源码,1.4.3里面很多todo注释,ueditor一直在改进,不太成熟,既然这么多bug,为什么要选ue
Stella981 Stella981
3年前
HSVS 第一周更新
!(https://oscimg.oschina.net/oscnet/4b484fb58aea45c1beee3d80ecd0175c.png)HSVS第一周更新更新内容\放出ElasticSearch6Kibana6版本的镜像(k6v1.1)\修复混杂模式下P选项不生效的BUG\修复磁盘IO