建荣's profile空谷清音PhotosBlogLists Tools Help

Blog


    September, 2008

    中秋回家

         这次中秋节,特意请了五天假,回家过中秋节,仔细算下来,已经十几年没有和全家人一起过中秋节了,怀念小时候的芝麻月饼,磨砂月饼,好吃不腻。现在的月饼啊,越做越漂亮,味道也越来越甜,甜的让人吃不下。
         老家的变化也越来越大,黄衢南高速公路从家后山经过,可惜于村里没有任何好处,还不如修一条省道更能给村里带来便利。希望下次回家能够有固定的车次,能够方便和城里的来往。20080913148200809131492008091315320080913160200809131612008091316220080913163200809131642008091416820080914169200809141702008091517320080915174200809151752008091517620080915177200809151782008091517920080915180200809151822008091518320080915184200809151852008091518620080915187200809182182008091821920080918220200809182212008091822220080918224大舅舅哥哥黄衢南高速姐夫老家大门妈妈和姐姐在做寿果妈妈在做寿果寿果淘气的悦悦外甥女小舅妈在做寿果小舅妈在做寿果1姨夫姨夫和悦悦悦悦悦悦1悦悦2在高速路上芝麻糖侄子
    September, 2008

    我家的花

    为了让家中增添新气息,上个月跑到花卉市场逛了一圈,由于对花不懂,只好买了几盘菊花来养,听说菊花比较好养。经过一个多月的浇水照料,一度以为要枯死的菊花终于被我养出了活气,也感到挺开心的。
    20080824131200808241322008082413320080824134200809061382008090613920080906140
    May, 2008

    无题

    梦由心生,心由梦乱,乱而不能静
     
    September, 2007

    PreTranslateMessage & SendMessage

    消息分为队列消息(进入线程的消息队列)和非队列消息(不进入线程的消息队列)。对于队列消息,最常见的是鼠标和键盘触发的消息,例如 WM_MOUSERMOVE,WM_CHAR等消息;还有例如:WM_PAINT、WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统负责把消息加入到相应线程的消息队列中,于是就有了消息循环(从消息队列中读取并派送消息)。还有一种是非队列消息,他绕过系统队列和消息队列,直接将消息发送到窗口过程。例如,当用户激活一个窗口系统发送 WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。创建窗口时发送WM_CREATE消息

    PreTranslateMessage()的处理过程如下:  首先判断该消息是否是一个线程消息(消息的窗口句柄为空的消息),如果是,交给 DispatchThreadMessageEx()处理。只有穿过消息队列的消息才受PreTranslateMessage()影响,采用 SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在

    October, 2006

    vista下程序的权限

    在win2000/xp下,大家对注册表的操作一般情况下都会成功,但是在vista下,即使你以administrator登录,也不能成功的操作。从微软的官方网站上,可以了解到vista对于权限的控制更加的严格了,administrator用户登录,不代表所有的程序都拥有administrator的权限(http://www.microsoft.com/technet/windowsvista/security/uac.mspx)。
          那么,如何在vista下,让自己的程序能够对注册表进行正常的操作呢?第一个方法就是对程序文件的属性进行设置,把run this program as administrator勾上。第二个方法就需要对自己的程序作一些修改了:为自己的程序添加mainfest:
     
    <requestedExecutionLevel
       level="asInvoker|highestAvailable|requireAdministrator"
       uiAccess="true|false"/>
     
    按照这篇文章上介绍的,给程序加入了mainfest:
     
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
      <assemblyIdentity version="1.0.0.0"
         processorArchitecture="X86"
         name="IsUserAdmin"
         type="win32"/> 
    
      <description>Description of your application</description> 
      <!-- Identify the application security requirements. -->
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel
              level="requireAdministrator"
              uiAccess="false"/>
            </requestedPrivileges>
           </security>
      </trustInfo>
    </assembly>
    

    但是在实际的结果中,发现还是不行,这回程序彻底不能被运行了。在此翻阅msdn,找到了一篇帖子:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=463884&SiteID=1

    其中对于这个问题进行了讨论,把xmlns的v3修改为v2即可,不知道微软的官方网站是否会给出这方面的说明呢。

     

     

    May, 2006

    树控件的NM_CUSTOMDRAW

    msdn还是要阅读仔细阿!
        最近在实现对树控件的某些特定节点改变字体的功能。众所周知,用NM_CUSTOMDRAW可以实现这点,确实,通过对CDDS_ITEMPREPAINT中设置新的字体,特定的节点的字体确实改变了。
        LPNMTVCUSTOMDRAW pnmtvcd = ...;
        ...
        switch(pnmtvcd->nmcd.dwDrawStage)
        {
        case CDDS_PREPAINT:
              return CDRF_NOTIFYITEMDRAW;
        case CDDS_ITEMPREPAINT:
             if( IsSpecialItemNode(pnmtvcd->nmcd.dwItemSpec) )
            {
                  SelectObject(pnmtvcd->nmcd.hdc, hSpecialFont);
                  return CDRF_NEWFONT;
            }
            break;
        ....
        }
        如果没有意外,那么就没有这篇文章了。
        在运行中,发现了一个bug,当该满足条件的节点的文本过长的时候,实际只显示了部分的文本。这让我百思不得其解,翻阅各种资料,google搜索,结果网上的资料都表明这些代码足以满足需求了,没有人提到了会出现这种情况,似乎大家都很好的实现了自己需求。
        就在没有丝毫头绪的时候,我再次仔细的查阅了msdn,结果在msdn中找到了下面这段话:
     

    Remarks

    Version 5.80. If you change the font by returning CDRF_NEWFONT, the tree-view control might display clipped text. This behavior is necessary for backward compatibility with earlier versions of the common controls. If you want to change the font of a tree-view control, you will get better results if you send a CCM_SETVERSION message with the wParam value set to 5 before adding any items to the control.

     

    这段话,在每次查阅的时候都轻易的放弃了。

          在添加上了remarks中的相应代码后,一切ok!

        SelectObject(pnmtvcd->nmcd.hdc, hSpecialFont);

        LONG lr = (LONG)::SendMessage(pnmtvcd->nmcd.hdr.hwndFrom, CCM_SETVERSION, 5, 0);
        if ( lr >= 0 )
        {
         return lr;
        }
        return CDRF_NEWFONT;

     

    再没有头绪的时候,放松心情,运动运动,也许灵感就来了!