三种自定义消息数值范围

在优快云上看到一贴关于自定义消息的讨论:
  【http://topic.youkuaiyun.com/u/20080417/11/9e091cfe-3978-4b73-a1bd-ff5e7d508917.html】 

第一种楼主的方法是通过WM_USER自定义消息,这个方法,比较常用,也是容易知道的。楼主的5个步骤:
    1.#define wm_user_message wm_user+int (shift)语句后不能加";"号;
    2.上述shift 为1~1000以内的 整数值;
    3.该值的选择与系统消息,窗口消息,控件消息等无关;
    4.消息映射必须在BEGIN_MESSAGE_MAPS()和END_MESSAGE_MAPS()之内;
    5.消息处理的声明以及代码添加必须在指定的类中.
是正确的,不过这也说明楼主没有系统学过MFC,对MFC了解的不是很熟悉,如果在还没有熟悉MFC的情况下,就在MFC中定义自己的消息,不能称之为一个好办法。

第二种方法是WM_APP,这个消息我没有用过,查MSDN: 

WM_APP

The WM_APP constant is used by applications to help define private messages, usually of the form WM_APP+X, where X is an integer value.  (WM_APP常量在应用程序中帮助定义私有消息,常用WM_APP+X方式定义,其中X为整数值)
#define WM_APP       0x8000

在此文后面还有消息的范围,一并摘录,便于了解:
There are five ranges of message numbers: 五种消息范围数值

RangeMeaning
0 through WM_USER – 1Messages reserved for use by the system.系统保留消息
WM_USER through 0x7FFFInteger messages for use by private window classes.私有定义窗口类整数消息
WM_APP through 0xBFFFMessages available for use by applications.应用程序可获取消息
0xC000 through 0xFFFFString messages for use by applications.应用程序字符串消息
Greater than 0xFFFFReserved by the system for future use.保留消息

从这儿可以看到,楼主的整数说明不是很确切了,而WM_USER与WM_APP的使用范围也是有差别的,其应用范围也是不一样的。WM_USER用在窗口消息中,而WM_APP用在程序消息中,当然由于是自己定义的消息,自己爱怎么用就怎么用,不过,如果想管理好自己的代码,建议按MSDN推荐方式做。

第三种方法:RegisterWindowMessage
RegisterWindowMessage

The RegisterWindowMessage function defines a new window message that is guaranteed to be unique throughout the system. The returned message value can be used when calling the SendMessage or PostMessage function.  (RegisterWindowMessage函数定义了新的在系统内唯一的窗口消息,这个消息可以在SendMessage和PostMessage函数中使用)

UINT RegisterWindowMessage(
  LPCTSTR lpString   // address of message string
);
Parameters
lpString

Pointer to a null-terminated string that specifies the message to be registered. (指向NULL结尾的指定消息注册的字符串)
Return Values

If the message is successfully registered, the return value is a message identifier in the range 0xC000 through 0xFFFF.(如果消息成功注册,返回值将在0xC000和0xFFFF之间。
If the function fails, the return value is zero. To get extended error information, call GetLastError.
如果函数失败,返回值为0,获取下扩展消息信息,调用GetLastError,

在上面的消息数值范围表格中我们可以知道,这个消息是处于string消息范围之中的。

综上所述,这三个自定义消息都是可以使用的,而且是三个不同数值范围要求的三个消息。

 

### 三级标题:Django Admin 中实现自定义数值范围过滤器 在 Django Admin 中实现自定义数值范围过滤器,可以通过继承 `admin.SimpleListFilter` 类来完成。此类允许开发者定义特定字段的筛选逻辑,适用于如学生管理系统中根据分数范围查找记录的需求,使用 `__range` 查询表达式进行范围过滤 [^2]。 以下是一个实现自定义数值范围筛选器的示例代码: ```python from django.contrib import admin class NumericRangeFilter(admin.SimpleListFilter): title = '数值范围筛选' # 显示在 Admin 页面上的标题 parameter_name = 'numeric_range' # URL 中使用的参数名称 def lookups(self, request, model_admin): # 定义筛选器的选项 return ( ('0-10', '0 到 10'), ('11-50', '11 到 50'), ('51-100', '51 到 100'), ) def queryset(self, request, queryset): # 根据选择的过滤查询集 if self.value() == '0-10': return queryset.filter(score__range=(0, 10)) elif self.value() == '11-50': return queryset.filter(score__range=(11, 50)) elif self.value() == '51-100': return queryset.filter(score__range=(51, 100)) return queryset ``` 上述代码中,`lookups` 方法定义了筛选器的选项,用户在 Admin 页面上可以选择不同的数值范围。`queryset` 方法则根据用户选择的范围,使用 `filter(score__range=(start, end))` 查询表达式来筛选数据 。 ### 三级标题:在 Admin 中使用自定义数值范围筛选器 定义好自定义筛选器后,需要将其应用到 Admin 类中。通过在 `list_filter` 中添加自定义筛选器,即可在 Admin 页面上使用: ```python @admin.register(Student) class StudentAdmin(admin.ModelAdmin): list_filter = [NumericRangeFilter] # 添加自定义数值范围筛选器 ``` 通过这种方式,可以轻松地为 Django Admin 添加数值范围筛选功能,提高后台数据管理的效率和灵活性。 ### 三级标题:扩展功能 如果需要更灵活的范围输入方式,可以考虑使用第三方库如 `django-admin-rangefilter`,它提供了更直观的日期和数值范围过滤功能,只需简单配置即可快速集成 [^1]。 此外,还可以结合用户权限动态调整筛选器行为,例如超级用户可以访问更广泛的筛选选项。在 `__init__` 方法中进行权限检查,可以实现不同用户角色看到不同的筛选选项 [^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值