本帖最后由 轻舟过 于 2012-12-21 21:11 编辑
转自:http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
LZ看了这篇文章才知道有python有装饰器这种东西存在,真是孤陋寡闻啊,下面是正文:
今天来讨论一下装饰器。装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
1. 装饰器入门
1.1. 需求是怎么来的?
装饰器的定义很是抽象,我们来看一个小例子。
[mw_shl_code=python,true]def foo():
print 'in foo()'
foo()[/mw_shl_code]
这是一个很无聊的函数没错。但是突然有一个更无聊的人,我们称呼他为B君,说我想看看执行这个函数用了多长时间,好吧,那么我们可以这样做:
[mw_shl_code=python,true]import time
def foo():
start = time.clock()
print 'in foo()'
end = time.clock()
print 'used:', end - start
foo()[/mw_shl_code]
很好,功能看起来无懈可击。可是蛋疼的B君此刻突然不想看这个函数了,他对另一个叫foo2的函数产生了更浓厚的兴趣。
怎么办呢?如果把以上新增加的代码复制到foo2里,这就犯了大忌了~复制什么的难道不是最讨厌了么!而且,如果B君继续看了其他的函数呢?
1.2. 以不变应万变,是变也还记得吗,函数在Python中是一等公民,那么我们可以考虑重新定义一个函数timeit,将foo的引用传递给他,然后在timeit中调用foo并进行计时,这样,我们就达到了不改动foo定义的目的,而且,不论B君看了多少个函数,我们都不用去修改函数定义了!
[mw_shl_code=python,true]import time
def foo():
print 'in foo()'
def timeit(func):
start = time.clock()
func()
end =time.clock()
print 'used:', end - start
timeit(foo)[/mw_shl_code]
看起来逻辑上并没有问题,一切都很美好并且运作正常!……等等,我们似乎修改了调用部分的代码。原本我们是这样调用的:foo(),修改以后变成了:timeit(foo)。这样的话,如果foo在N处都被调用了,你就不得不去修改这N处的代码。或者更极端的,考虑其中某处调用的代码无法修改这个情况,比如:这个函数是你交给别人使用的。
1.3. 最大限度地少改动!
既然如此,我们就来想想办法不修改调用的代码;如果不修改调用代码,也就意味着调用foo()需要产生调用timeit(foo)的效果。我们可以想到将timeit赋值给foo,但是timeit似乎带有一个参数……想办法把参数统一吧!如果timeit(foo)不是直接产生调用效果,而是返回一个与foo参数列表一致的函数的话……就很好办了,将timeit(foo)的返回值赋值给foo,然后,调用foo()的代码完全不用修改!
[mw_shl_code=python,true]#-*- coding: UTF-8 -*-
import time
def foo():
print 'in foo()'
# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法
def timeit(func):
# 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
def wrapper():
start = time.clock()
func()
end =time.clock()
print 'used:', end - start
# 将包装后的函数返回
return wrapper
foo = timeit(foo)
foo()[/mw_shl_code]
这样,一个简易的计时器就做好了!我们只需要在定义foo以后调用foo之前,加上foo = timeit(foo),就可以达到计时的目的,这也就是装饰器的概念,看起来像是foo被timeit装饰了。在在这个例子中,函数进入和退出时需要计时,这被称为一个横切面(Aspect),这种编程方式被称为面向切面的编程(Aspect-Oriented Programming)。与传统编程习惯的从上往下执行方式相比较而言,像是在函数执行的流程中横向地插入了一段逻辑。在特定的业务领域里,能减少大量重复代码。面向切面编程还有相当多的术语,这里就不多做介绍,感兴趣的话可以去找找相关的资料。
这个例子仅用于演示,并没有考虑foo带有参数和有返回值的情况,完善它的重任就交给你了 :)
2. Python的额外支持
2.1. 语法糖
上面这段代码看起来似乎已经不能再精简了,Python于是提供了一个语法糖来降低字符输入量。
[mw_shl_code=python,true]import time
def timeit(func):
def wrapper():
start = time.clock()
func()
end =time.clock()
print 'used:', end - start
return wrapper
@timeit
def foo():
print 'in foo()'
foo()[/mw_shl_code]
重点关注第11行的@timeit,在定义上加上这一行与另外写foo = timeit(foo)完全等价,千万不要以为@有另外的魔力。除了字符输入少了一些,还有一个额外的好处:这样看上去更有装饰器的感觉。
2.2. 内置的装饰器
内置的装饰器有三个,分别是staticmethod、classmethod和property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多,除非你想要完全的面向对象编程。而属性也不是不可或缺的,Java没有属性也一样活得很滋润。从我个人的Python经验来看,我没有使用过property,使用staticmethod和classmethod的频率也非常低。
[mw_shl_code=python,true]class Rabbit(object):
def __init__(self, name):
self._name = name
@staticmethod
def newRabbit(name):
return Rabbit(name)
@classmethod
def newRabbit2(cls):
return Rabbit('')
@property
def name(self):
return self._name[/mw_shl_code]
这里定义的属性是一个只读属性,如果需要可写,则需要再定义一个setter:
[mw_shl_code=python,true]@name.setter
def name(self, name):
self._name = name[/mw_shl_code]
2.3. functools模块
functools模块提供了两个装饰器。这个模块是Python 2.5后新增的,一般来说大家用的应该都高于这个版本。但我平时的工作环境是2.4 T-T
2.3.1. wraps(wrapped[, assigned][, updated]):
这是一个很有用的装饰器。看过前一篇反射的朋友应该知道,函数是有几个特殊属性比如函数名,在被装饰后,上例中的函数名foo会变成包装函数的名字wrapper,如果你希望使用反射,可能会导致意外的结果。这个装饰器可以解决这个问题,它能将装饰过的函数的特殊属性保留。
[mw_shl_code=python,true]import time
import functools
def timeit(func):
@functools.wraps(func)
def wrapper():
start = time.clock()
func()
end =time.clock()
print 'used:', end - start
return wrapper
@timeit
def foo():
print 'in foo()'
foo()
print foo.__name__[/mw_shl_code]
首先注意第5行,如果注释这一行,foo.__name__将是'wrapper'。另外相信你也注意到了,这个装饰器竟然带有一个参数。实际上,他还有另外两个可选的参数,assigned中的属性名将使用赋值的方式替换,而updated中的属性名将使用update的方式合并,你可以通过查看functools的源代码获得它们的默认值。对于这个装饰器,相当于wrapper = functools.wraps(func)(wrapper)。
2.3.2. total_ordering(cls):
这个装饰器在特定的场合有一定用处,但是它是在Python 2.7后新增的。它的作用是为实现了至少__lt__、__le__、__gt__、__ge__其中一个的类加上其他的比较方法,这是一个类装饰器。如果觉得不好理解,不妨仔细看看这个装饰器的源代码:
[mw_shl_code=python,false]53 def total_ordering(cls):
54 """Class decorator that fills in missing ordering methods"""
55 convert = {
56 '__lt__': [('__gt__', lambda self, other: other < self),
57 ('__le__', lambda self, other: not other < self),
58 ('__ge__', lambda self, other: not self < other)],
59 '__le__': [('__ge__', lambda self, other: other <= self),
60 ('__lt__', lambda self, other: not other <= self),
61 ('__gt__', lambda self, other: not self <= other)],
62 '__gt__': [('__lt__', lambda self, other: other > self),
63 ('__ge__', lambda self, other: not other > self),
64 ('__le__', lambda self, other: not self > other)],
65 '__ge__': [('__le__', lambda self, other: other >= self),
66 ('__gt__', lambda self, other: not other >= self),
67 ('__lt__', lambda self, other: not self >= other)]
68 }
69 roots = set(dir(cls)) & set(convert)
70 if not roots:
71 raise ValueError('must define at least one ordering operation: < > <= >=')
72 root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__
73 for opname, opfunc in convert[root]:
74 if opname not in roots:
75 opfunc.__name__ = opname
76 opfunc.__doc__ = getattr(int, opname).__doc__
77 setattr(cls, opname, opfunc)
78 return cls[/mw_shl_code]
本文到这里就全部结束了,有空的话我会整理一个用于检查参数类型的装饰器的源代码放上来,算是一个应用吧 :)
[查看全文]
本帖最后由 Whisper1166 于 2012-12-10 23:23 编辑
Thinking in Java Fourth Edition
Bruce Eckel
作者:(美)埃克尔著 陈昊鹏 译
出版社:机械工业出版社
关于书的介绍:http://baike.baidu.com/view/568958.htm
很久之前看过的
感觉还不错
拿出来分享一下
百度网盘:
[查看全文]
本内容已隐藏,回复后刷新可见哦
两个Windows7和Vista的侧边栏小工具的开发资料
有兴趣的可以下载来学一下 不是很难的说
百度网盘:
本帖最后由 墨霺 于 2013-8-2 00:27 编辑
吾辈继续壮哉我android党
不来一发么?
====================
咳咳,有人说挂了,不知道为毛直接分享不了,需要密码提取,so~pw:WVRB
[查看全文]
我边上那个帖子(反正只有两个,不懂得进子版块。。。)给大家推荐的那一本,并不适合初学者看。有看回帖的人里面又有那么多人,对学习IOS望而却步。心里大发感慨(咳)(不要理这句)。我想各位从最开始,到进阶逐步进行推荐书籍。
本文中提到的书籍,都是比较大众化的,(京东,淘宝,当当,z.cn,百度什么的都能找到PDF,我就不发链接了(我的都是英文实体书)(不建议看网络上的盗版中文,有的地方有错))
1.C语言
这个不用我说了,一切语言的基础中的基础,大家应该都会,论坛里有教的,我就不说了。
2.OC
全称Objective-C。面向对象的语言。比C理解起来容易。写所有的Mac osx系统的和IOS系统的软件所必需用的语言。
在此推荐这本(图是中文版的,建议看英文的,英文的更新的比较快。但中文的无伤大雅,读懂才是最重要的。)
这一本介绍的都比较基础,适合对OC各种认识程度的人。
3.了解IOS系统。
这里说的了解IOS系统,不单单是讲IOS有什么功能,最重要的是,在开发者的角度,怎么用到这些功能。也就是以后构建软件的大体模式。
推荐:
对设计模式进行了比较相近的解析,相对而言比较容易理解。
4:
实战
理论说的再多,还不如直接来一炮。(呵呵,懂意思就可以了,不要在意细节。)最后一本,教会你实战。(这本我没看过,听说不错。但是可有可无。)
总的而言,假如不想报班学习,这几本书,足够将你带入IOS开发的门槛。剩下的就是你的想象力,和逻辑思维。
注:IOS开发软件(xcode)是免费的,自带模拟器。自己写的无法在真机上测试(除非有99$的开发者证书,或者自制的假证书。)
PS。自己写的,所以有点散。图灵系列的书有很多,都是跟计算机技术有关的,大家感兴趣也可以看看其他的。有对IOS其他方面感兴趣的,也可以在这套书里(基本上),找到各自所需。
写的可能不好,大家给点鼓励什么的(只要不喷就行了)。
[查看全文]
给大家分享一本老书——《大话设计模式》(真的好老啊喂你确定不是来骗回复?
希望对各位学习和优化代码结构有所帮助 看过的可以略过(其实我最近还在看 。。。
这本书通过幽默诙谐的口吻 一个个生动的小故事 给大家详细讲解了各种设计模式@@35!!
这本书算是程序书里面相当有趣的一类了 (大家看了应该不会吐吧?
废话不多说 没事瞅两眼
当然 召唤隐藏菌是必要的@@33!!
本帖最后由 Evanue 于 2013-1-3 20:43 编辑
CreateWindowEx function
在WINDOWS平台下 创建一个窗口要使用的接口
目标:了解各个参数的意义,取值,使用方法,和应该注意的地方
学习资源:网页版 MSDN
字幕组 :幽幽碗字幕组 --- 技术宅自己翻译<高中英语能力(150满分 普遍60-70分)> + 有道词典 + 度娘 + 谷哥
先建楼 后面一边学习一边更新
有BUG的地方请各位大神强烈指出并调教 =1452=
先贴上 MSDN 地址 http://msdn.microsoft.com/zh-cn/library/ms632680(v=VS.80).aspx
接口说明
生肉:
Creates an overlapped, pop-up, or child window with an extended window style; otherwise, this function is identical to the CreateWindow function. For more information about creating a window and for full descriptions of the other parameters of CreateWindowEx, see CreateWindow.
熟肉:
使用扩展的窗口风格来创建一个重叠的,弹出式的或者子级的窗口;在其他方面,该函数和 CreateWindow 函数是一样的。
更多的 关于创建窗口的信息 和 CreateWindowEx 中其他参数的全名描述,请参看 CreateWindow 。
幽幽碗:
意思应该是说,使用该接口,可以使用扩展窗口风格来创建重叠的窗口或者弹出式窗口或子窗口,其实子窗口CreateWindow也可以
创建的,这里应该说的带扩展风格的子窗口。然后除了扩展风格参数外,其他参数和 CreateWindow 里的参数是一样的。
由于提示 想更全面的了解 创建窗口和各个参数的信息 要参考 CreateWindow 接口。所以我后面会结合2个接口一起看 一起学习。
语法
[mw_shl_code=cpp,false]HWND WINAPI CreateWindowEx
(
_In_ DWORD dwExStyle,
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName,
_In_ DWORD dwStyle,
_In_ int x,
_In_ int y,
_In_ int nWidth,
_In_ int nHeight,
_In_opt_ HWND hWndParent,
_In_opt_ HMENU hMenu,
_In_opt_ HINSTANCE hInstance,
_In_opt_ LPVOID lpParam
);[/mw_shl_code]
返回值
类型: HWND --- 是个 窗口的句柄值
生肉:
If the function succeeds, the return value is a handle to the new window.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
This function typically fails for one of the following reasons:
- an invalid parameter value
- the system class was registered by a different module
- The WH_CBT hook is installed and returns a failure code
- if one of the controls in the dialog template is not registered, or its window window procedure fails WM_CREATE or WM_NCCREATE
熟肉:
如果函数执行成功,返回值就是一个新窗口的句柄。
如果函数执行失败,返回值是 NULL。调用 GetLastError 函数以获取相关错误信息。
该函数通常会因为以下的某个原因而失败:
· 传入了一个无效的参数值
· 系统类被一个不同的 组件/模块 注册
· WH_CBT 钩子已经被安装并且返回了一个错误代码 <本人哇嘎达哪一>
· 如果对话框模版中某个控件没有被注册,或者窗口的窗口过程在执行 WM_CREATE 消息 或 WM_NCCREATE 消息
时失败了
插入介绍
_In_
_In_opt
在WINDOS API 函数里 很多 甚至基本全部的API 的参数在类型前都有 _In_ 或 _In_opt 这样形式的一些说明
可能一些人不知道是什么 这里就简要说明下 不做全面讲解 因为本贴主要讲 窗口创建的API
这些说明性的东西其实就是 SAL<source-code annotation language >(代码注解语言)
SAL 提供了一组注释来描述 代码应该如何使用这些被 SAL修饰的对象,像修饰参数的 都表示函数该如何对待这些参数
至少 WINDOS API 按照微软的SAL的规定来做
SAL 以一种低开销的方式 来 让编译器帮助检查代码 而且可以增加代码的可阅读性。
SAL 不是程序语言的一部分 并且只是编译器在编译期间对代码检查时有作用
完全不参与代码生成和执行,并且跟平台还有关系,WINDOS API 的 SAL都是微软的 你拿带IOS平台下就不见得管用了
这里就介绍下上面的2个吧 以后有遇到的可以再宁做介绍
_In_
· 指定 “只读” 属性, 函数只会对修饰的参数进行只读操作
· 修饰的参数 必须是有效的,并且不会再发生改变
· 调用者必须提供有效的值进行初始化
幽幽碗:
对于一般的参数而言 重要的是 “调用者必须提供有效的值进行初始化 ”,因为一般才参数已经是函数的
局部变量了,外面是无法更改这些变量的值的,所有函数使用 这些被 有效初始化的值是没什么问题的。
但是对应指针或是引用一类的代表一些缓冲区,或是其他地方存储信息的参数。那么就要小心了。
因为外面是可以更改的,而且指针可能传入NULL值,也可能传入一些无效的指针。
编译器在检查的时候,如果发现传入NULL参数那么就会出现编译错误。所以要额外注意。
_opt_ 表示修饰的对象是可选的
幽幽碗:
查了下资料 这个注解貌似只会用于修饰 指针和引用类的缓冲区的参数。
表示该注解修饰的参数的值可以是 NULL 所以,对有这样的注解的参数传入 NULL值,编译器在检查的时候是不会报错的。
以上是自己查资料所了解的姿势,可能不是很好。
想了解更多的 可以当网上搜搜相关的了解,这里贴上一些MSDN地址
http://social.msdn.microsoft.com/search/en-us?query=SAL
http://msdn.microsoft.com/en-us/library/ms235402(v=VS.100).aspx
http://msdn.microsoft.com/en-us/library/hh916383.aspx
幽幽碗:
其实对SAL没兴趣的 可以完全不给与理会,因为这个只是在编译期间检查代码错误性的东西。
不参与代码编译和运行。
而作为一个程序员 正真的要避免错误的方式不是依靠 各种各样的检查工具,而且从自身良好的
编程能力做起。
个人认为SAL重要的是 增加代码的可阅读性 在看了相应的注解后,可以更好的了解应该怎么样对待被注解的对象。
参数介绍
_In_ DWORD dwExStyle
生肉:
dwExStyle [in] Type: DWORD
The extended window style of the window being created. For a list of possible values,see Extended Window Styles.
熟肉:
dwExStyle [in<输入 只读 有效初始化>]
类型:DWORD
正在被创建的窗口的扩展风格。要一览可以使用的风格,查看 Extended Window Styles 。
幽幽碗:
以下是这些风格的地址: http://msdn.microsoft.com/en-us/library/ff700543(v=vs.85).aspx 。
这里全部列出现在已有的情况。蛮多的 并不能完全翻译 请大家见谅。
WS_EX_ACCEPTFILES 0x00000010L
生肉:
The window accepts drag-drop files.
熟肉:
窗口接受拖放文件。
WS_EX_APPWINDOW 0x00040000L
生肉:
Forces a top-level window onto the taskbar when the window is visible.
熟肉:
当窗口是可见的时候,关联一个顶层窗口到任务栏上。
幽幽碗:
这个不太明白,好像是说当窗口可见的时候,会将一个顶层窗口关联到任务栏上。我个人试了下,发下和不指定这个参数没什么区别,就是任务栏上出现了一个喜闻乐见的图标而已 囧~
个人怀疑是不是 和子窗口和附属窗口有关系。普遍的说 在一个窗口里弹出 附属窗口或是子窗口 的时候,在任务栏是没有
这个附属窗口或是子窗口的图标的,但是指定了这个风格后,就会有图标出现在任务栏上。比较典型的就是 我们常用的QQ
当我们和多个人聊天的时候,就会出现多个两天窗口,而且每个聊天窗口都会在任务栏有个小图标。但是现在的QQ版本
可以将多个聊天对象和在一个窗口上,但是最多好像只有5个。而且我们从中拖出一个有。任务栏上就会多出一个窗口。
我打算马上在附属窗口上试试 看看指定和不指定的区别。
刚刚测试了下,果然是那样的。
下面放2个截图
这个是没有指定该风格的附属窗口
这个是指定了该风格的
这样就知道这个风格的作用了吧。
WS_EX_CLIENTEDGE 0x00000200L
生肉:
The window has a border with a sunken edge.
熟肉:
窗口带有一个凹陷边缘的窗体。
幽幽碗:
嘛~到底是什么样的呢试试看呢。
WIN7上试了下 不明显,其实就是边框厚度不一样,其他没什么 不知道XP上是什么样的。
WS_EX_COMPOSITED 0x02000000L
生肉:
Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
Windows 2000: This style is not supported.
熟肉:
使用双缓冲机制以从最底层到最顶层的顺序绘制窗口以及窗口的所有子代窗口。关于更多的信息,请查看备注<备注在所有参数介绍完后的地方出现>。该窗口风格不能用于创建拥有的CS_OWNDC和CS_CLASSDC的任意一种窗口类风格的窗口。
Windows 2000: 不支持使用该姿势。
幽幽碗:
不知道第一句翻译对了没,因为 descendants 词语查了下意思是子孙后代的意思,再加上提到双缓冲机制。
所以理解为所有延伸的子级窗口。就是子窗口以及子窗口的子窗口。。。。
所以“ bottom-to-top <最底层到最顶层的顺> ”的意思就是 从最低子级到最初的父级的顺序。可以理解为从辈分最低
到辈分最高的顺序,先绘制孙子级别的窗口,再绘制儿子级别的,最后绘制父窗口。
希望没有翻译错。如果谁发现错了,请立即通知我,我相应的更改。
WS_EX_CONTEXTHELP 0x00000400L
生肉:
The title bar of the window includes a question mark. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
熟肉:
窗口的标题栏会有一个问号按钮。当用户点击问号后,鼠标就会变成带有一个问号的指示器(箭头)。
如果用户接着点击了一个子窗口,该子窗口就会收到一个 WM_HELP 消息。子窗口应该将这个消息传递给父窗口的
应该使用 HELP_WM_HELP 命令来调用 WinHelp 函数的 窗口过程。该帮助应用程序显示一个 一般来说包含关于
那个子窗口的帮助的 弹出式窗口。
WS_EX_CONTEXTHELP 风格不能和 WS_MAXIMIZEBOX 风格或 WS_MINIMIZEBOX 风格一起使用。
意思就是有 WS_EX_CONTEXTHELP 风格的不能使用 WS_MAXIMIZEBOX 和 WS_MINIMIZEBOX 风格
那么有WS_EX_CONTEXTHELP 的窗口就会没有在标题栏上没最大化和最小化按钮。
幽幽碗:
其实感觉蛮复杂的。大概流程还是蛮清楚的,不过打算以后具体要弄的时候对这个风格出个学习笔记吧。
里面说的那个“The Help application ”应该是指调用 WinHelp 函数后会出现的那个 “pop-up window ”。
送上一直图片吧:
WS_EX_CONTROLPARENT 0x00010000L
生肉:
The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
熟肉:
窗口本身包含应该参加对话框导航的子窗口。如果该风格被指定,当执行诸如 TAB键 ,方向键,键盘助记符等的到导航操作时,对话框管理器会递归进入窗口的子窗口里。
幽幽碗:
以下为自己的感觉吧。
感觉倒懂倒不懂的,名字可以看出指的是 控件の哦多桑 大概就是专门用来放空间的窗口的。窗口上会有很多控件,这些控件都是窗口的子窗口,当在窗口上按TAB或方向键或其他的器作用的键的时候,对话框管理器会帮助我们选定那些控件。
WS_EX_DLGMODALFRAME 0x00000001L
生肉:
The window has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
熟肉:
窗口有一个双边框;窗口可以选择性的和一个 通过在dwStyle 参数里指定WS_CAPTION 风格时指定的标题栏 一起被创建。
幽幽碗:
经过测试 ,感觉不出来有什么用 指定和没指定 WS_CAPTION 结果都是一样的。唔。。。。
留待后期慢慢观察吧。
WS_EX_LAYERED 0x00080000
生肉:
The window is a layered window. This style cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
Windows 8: The WS_EX_LAYERED style is supported for top-level windows and child windows. Previous Windows versions support WS_EX_LAYERED only for top-level windows.
熟肉:
该窗口是一个分层的窗口。如果窗口拥有 CS_OWNDC 或者 CS_CLASSDC 中的某个窗口类风格,那么该风格不可以使用。
Windows 8: WS_EX_LAYERED 风格支持顶层窗口和子窗口。而在之前的WINDOWS版本中,WS_EX_LAYERED 风格值只支持顶层窗口,不支持子窗口。
幽幽碗:
个人很喜欢这个风格,这个风格可以让你完全自定义自己的窗口,因为指定窗口的时候,不带窗体的话,那么生成窗口的时候桌面上什么的都没有,而只能在任务栏上看到一个应用程序的图标。顶层窗口和子窗口 是2中普通窗口风格。是另外一个参数的。
WS_EX_LAYOUTRTL 0x00400000L
生肉:
If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the horizontal origin of the window is on the right edge. Increasing horizontal values advance to the left.
熟肉:
如果shell语言是希伯来语,阿拉伯语或其他支持阅读顺序对齐的语言,那么窗口的水平原点在右边界上。通过递加水平值来往左边推移。
幽幽碗:
请允许我先不翻译,发表下感想,感觉比较难翻译,不懂是什么意思,只是觉得跟语言排版什么的有关系。
哎···米娜上 锅妹。
WS_EX_LEFT 0x00000000L
生肉:
The window has generic left-aligned properties. This is the default.
熟肉:
窗口拥有普遍的左对齐属性。这是默认的。
幽幽碗:
我不懂左对齐是什么依稀。。。
WS_EX_LEFTSCROLLBAR 0x00004000L
生肉:
If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
熟肉:
如果shell语言是希伯来语,阿拉伯语或其他支持阅读顺序对齐的语言, 那么垂直滚动条就在窗口客户区的左边。对此外的其他语言,该风格会被忽略。
幽幽碗:
我试用了下这个风格,没有滚动条。
WS_EX_LTRREADING 0x00000000L
生肉:
The window text is displayed using left-to-right reading-order properties. This is the default.
熟肉:
窗口的文字是使用的从左到右的阅读顺序属性来显示的。这个是默认的。
WS_EX_MDICHILD 0x00000040L
生肉:
The window is a MDI child window.
熟肉:
窗口是 MDI 子窗口。
幽幽碗:
MDI 不知道是什么意思,有兴趣的可以去攻略下。自己试着用这个创建子窗口,但是创建失败了。哎。。
WS_EX_NOACTIVATE 0x08000000L
生肉:
A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
To activate the window, use the SetActiveWindow or SetForegroundWindow function.
The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
熟肉:
一个使用该风格创建的顶层窗口在用户点击他它的时候,不会切换到前台来。当用户最小化或关掉前台窗口的时候,系统也不会将该窗口切换到前台来。
使用SetActiveWindow 或 SetForegroundWindow 函数 可以激活该窗口。
该窗口默认不会出现在任务栏上。要强制窗口出现在任务栏上的话,就使用 WS_EX_APPWINDOW 风格。
幽幽碗:
使用了下,暂时觉得没什么用处。
WS_EX_NOINHERITLAYOUT 0x00100000L
生肉:
The window does not pass its window layout to its child windows.
熟肉:
窗口不将自己的窗口布局传递给子窗口。
幽幽碗:
不明意义。
WS_EX_NOPARENTNOTIFY 0x00000004L
生肉:
The child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
熟肉:
使用该风格创建的子窗口在自己被创建或销毁的时候不会发送 WM_PARENTNOTIFY 消息给它的父窗口。
WS_EX_NOREDIRECTIONBITMAP 0x00200000L
生肉:
The window does not render to a redirection surface. This is for windows that do not have visible content or that use mechanisms other than surfaces to provide their visual.
熟肉:
窗口不渲染到重定向表面。这是为了让 那些没有可见内容的或是使用其他不同于表面的机制 的窗口 提供他们的可视化。
幽幽碗:
翻译比较死板,也不懂什么意思。
WS_EX_OVERLAPPEDWINDOW (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
生肉:
The window is an overlapped window.
熟肉:
该窗口是一个重叠的窗口。
幽幽碗:
就是同时拥有 WS_EX_WINDOWEDGE 和 WS_EX_CLIENTEDGE 两种风格的窗口。
怎么说呢,用了下 除了边框厚了点,就没什么了。
WS_EX_PALETTEWINDOW (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
生肉:
The window is palette window, which is a modeless dialog box that presents an array of commands.
熟肉:
该窗口是一个显示了一组命令的非模态对话框调色板窗口。
幽幽碗:
见图见真相 最小化 和最大化按钮没了 4个角是直角,窗口大小根据普通窗口风格可以选择是否可以改变大小
由于有 WS_EX_TOPMOST 风格 所有 该窗口会在其他没有使用WS_EX_TOPMOST 风格的才窗口的前面
比如你的QQ是挡不住他的。
WS_EX_RIGHT 0x00001000L
生肉:
The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
熟肉:
窗口拥有广泛的“右对齐”属性。这取决与使用的注册的窗口类。如果shell语言是希伯来语,阿拉伯语或其他支持阅读顺序对齐的语言, 那么该风格就会起到效果。对此外的其他语言,该风格会被忽略。
对静态或编辑控件 使用 WS_EX_RIGHT 风格 拥有和单独地使用 SS_RIGHT 或 ES_RIGHT 风格一样的效果。
对按钮控件使用该风格拥有 和使用 BS_RIGHT 加 BS_RIGHTBUTTON 风格的一样效果。
幽幽碗:
其实我对 SS_RIGHT ES_RIGHT BS_RIGHT BS_RIGHTBUTTON 不懂~。
有兴趣的可以自己查查吧。
WS_EX_RIGHTSCROLLBAR 0x00000000L
生肉:
The vertical scroll bar (if present) is to the right of the client area. This is the default.
熟肉:
垂直滚动条(如果存在的话)在窗口客户区的右侧。这是默认的。
WS_EX_RTLREADING 0x00002000L
生肉:
If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
熟肉:
如果shell语言是希伯来语,阿拉伯语或其他支持阅读顺序对齐的语言, 那么窗口的文本就被使用从右到左的阅读顺序来显示。对此外的其他语言,该风格会被忽略。
WS_EX_STATICEDGE 0x00020000L
生肉:
The window has a three-dimensional border style intended to be used for items that do not accept user input.
熟肉:
窗口拥有一个为不接受用户的输入的项目所准备使用的三维边框。
幽幽碗:
也就是说 窗口具有一个三维边框, 准备给不接受用户输入的项目。我试试 看看是什么样子。
结果测试外表没什么感觉呢~
但是最大化的时候,窗口的边角会过度的出去一些呢。
WS_EX_TOOLWINDOW 0x00000080L
生肉:
The window is intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
熟肉:
该窗口的准备被作为一个浮动的工具栏来用。一个工具窗口 拥有一个 比正常的标题栏短的标题栏,并且窗口的标题使用一个较小的字体绘制。一个工具窗口不会出现在任务栏上,或在出现当用户按下ALT+ TAB时出现的对话框中。如果一个工具窗口有一个系统菜单,它的图标不会显示在标题栏。但是,您可以通过右键单击或键入ALT+ SPACE显示系统菜单。
WS_EX_TOPMOST 0x00000008L
生肉:
The window should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
熟肉:
该窗口应该被放在所有 非顶层窗口 的上面,并且保持在它们上面,甚至当该窗口是未激活的状态。要添加或移除该风格,请使用SetWindowPos 函数。
幽幽碗:
聊下QQ试试
WS_EX_TRANSPARENT 0x00000020L
生肉:
The window should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
To achieve transparency without these restrictions, use the SetWindowRgn function.
熟肉:
窗口不应该被绘制直到该窗口下的兄弟姊妹窗口(被同一线程所创建的)被绘制。窗口看起来像是透明的因为其下的子窗口的一些已经被绘制了。
要不经过这些限制来实现透明,请使用 SetWindowRgn 函数。
幽幽碗:
不懂,翻译吃力。
WS_EX_WINDOWEDGE 0x00000100L
生肉:
The window has a border with a raised edge.
熟肉:
该窗口有一个凸起边缘的窗体。
幽幽碗:
真心觉得没什么。。
_In_opt_ LPCTSTR lpClassName
生肉:
lpClassName [in, optional] Type: LPCTSTR
A null-terminated string or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in the low-order word of lpClassName; the high-order word must be zero. If lpClassName is a string, it specifies the window class name. The class name can be any name registered with RegisterClass or RegisterClassEx, provided that the module that registers the class is also the module that creates the window. The class name can also be any of the predefined system class names.
熟肉:
幽幽碗:
[查看全文]
