| 建荣's profile空谷清音PhotosBlogLists | Help |
|
September, 2008 中秋回家September, 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_CUSTOMDRAWmsdn还是要阅读仔细阿!
最近在实现对树控件的某些特定节点改变字体的功能。众所周知,用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
这段话,在每次查阅的时候都轻易的放弃了。 在添加上了remarks中的相应代码后,一切ok! SelectObject(pnmtvcd->nmcd.hdc, hSpecialFont);
LONG lr = (LONG)::SendMessage(pnmtvcd->nmcd.hdr.hwndFrom, CCM_SETVERSION, 5, 0);
再没有头绪的时候,放松心情,运动运动,也许灵感就来了! |
|
|