day06

一、定时器消息
1.定时器
1)在程序中设置定时器,当达到定时器的时间间隔时,窗口过程函数就会收到WM_TIMER消息。
2)定时器的精度可以达到毫秒级,但是精度很低。
2.消息参数
WM_TIMER
wParam - 定时器ID
lParam - 不用


3.使用定时器
1)创建定时器
UINT SetTimer (
HWND hWnd, //窗口句柄
UINT uIDEvent, //定时器ID
UINT uElapse, //时间间隔
TIMERPROC lpTimerProc //定时器处理函数指针 (如果NULL,则由窗口过程函数处理WM_TIMER消息。否则不再产生WM_TIMER消息,直接调用定时器处理函数)
);


成功:返回定时器ID,失败返回 0。 合理的定时器的ID一定是大于0的。


定时器处理函数原型
void CALLBACK TimerProc (
HWND hWnd, //窗口句柄
UINT uMsg, //消息ID,WM_TIMER(消息只能为它)
UINT idEvent, //定时器ID
DWORD dwTime //当前系统时间 (是秒数)
);




2)处理WM_TIMER消息 | 定义定时器处理函数
SetTimer (hWnd, 101, 1000, NULL);
case WM_TIMER:
if (wParam == 101) 
处理101事件


else if (wParam == 102)
处理102事件


break;
-----------------------------------------------------


SetTimer (hWnd, 101, 1000, MyTimerProc);
SetTimer (hWnd, 102, 1000, MyTimerProc);


void CALLBACK MyTimerProc (
HWND hWnd,
UINT uMsg,
UINT idEvent,
DWORD dwTime
)
{
if (idEvent == 101) {
处理101事件
}
else 
if (idEvent == 102) {
处理102事件
}
}


3)关闭定时器
BOOL KillTimer (
HWND hWnd, //窗口句柄
UINT nIDEvent //定时器ID
);


成功返回TRUE,失败返回FALSE


KillTimer (hWnd, 101);
KillTimer (hWnd, 102);


二、菜单的分类
1.顶层菜单:窗口标题栏下方的菜单
2.弹出式菜单:单击右键弹出菜单,下拉菜单
3.系统菜单:单击窗口左上角图标打开的菜单
二、菜单句柄和菜单标识
1.菜单对象(也是一种窗口), 通过菜单句柄加以标识 
2.菜单中每一个菜单项通过其唯一标识号 - 菜单ID - 加以区分


顶层菜单:
1.创建菜单
HMENU CreateMenu (void)
成功返回菜单句柄,失败返回NULL
2.添加菜单项
1)追加菜单项
BOOL AppendMenu {
HMENU hMenu, //菜单句柄
UINT uFlags. //菜单项标志
UINT uIDNewItem, //菜单项ID
LPCTSTR lpNewItem //菜单项名称
);
成功返回TRUE,失败返回FALSE
2)插入菜单项
BOOL InsertMenu (
HMWNU hMenu, //菜单句柄
UINT uPosition, //插入位置(在此菜单项之前插入(ID或位置))
UINT uFlags. //菜单项标志
UINT uIDNewItem, //菜单项ID
LPCTSTR lpNewItem //菜单项名称
);
成功返回TRUE,失败返回FALSE


3)菜单项标志 (uFlags)
MF_STRING - 点击后发出WM_COMMAND消息,通过uIDNewItem的值区分具体哪个菜单项被点击.
WM_POPUP - 可弹出子菜单,uIDNewItem参数为子菜单的句柄
MF_SEPARATOR - 分割线, uIDNewItem和lpNewItem 参数被忽略
MF_CHECKED - 勾选
MF_UNCHECKED - 撤选
MF_ENABLED - 激活
MF_DISABLED - 禁用
MF_CRAYED - 禁用且置灰
MF_BITMAP - 位图
MF_OWNERDRAW - 自绘
MF_BYCONMAND - uPosition 参数为菜单项ID
MF_BYPOSITION - uPosition 参数为菜单项位置


3.将菜单安装到窗口上
BOOL SetMenu (
HWND hWnd, //窗口句柄
HMENU hMenu //菜单句柄
);
成功返回TRUE,失败返回FALSE


4.菜单命令的处理.
WM_COMMAND - 命令消息
wParam - HIWORD (通知码(控件)/0 (菜单)/1(加速键))
 LOWORD 控件/菜单/加速键的ID
LPARAM - 句柄(控件)/0(其他)


5.菜单项的状态
激活/禁用/置灰态、选取/非选取态、


1)在添加的菜单项的时候设置初始状态。
AppendMenu (hmenuWeb, MF_STRING | MF_CHECKED, IDM_WEB_ENABLED, "激活(&E)");
2)动态改变菜单项的状态
1 改变菜单项的勾选状态
DWORD Check (
HMENU hMenu, //菜单句柄
UINT uIDCheckItem, //菜单项ID (也可能位置)
UINT uCheck //勾选/撤选 (通过MF_BYCONMAND还是MF_BYPOSITION)
);
成功返回原来的勾选状态。失败返回-1
uCheck 取值
MF_CHECKED - 勾选
MF_UNCHECKED - 撤选
MF_BYCONMAND - uIDCheckItem为菜单项ID
MF_BYPOSITION - uIDCheckItem为菜单项位置


2 改变菜单项的可用状态
DWORD EnableMenuItem (
HMENU hMenu, //菜单句柄
UINT uIDEnableItem, //菜单ID或位置
UINT uEnable //可用/禁用/置灰
);
uEnable 取值:
MF_ENABLED - 可用
MF_DISABLED - 禁用
MF_BYCOMMAND - uIDCheckItem参数为菜单项ID
MF_BYPOSITION - uIDCheckItem参数为菜单项位置


6.菜单的弹出初始化
WM_INITMENUPOPUP - 弹出式菜单被激活旦还未显示,窗口过程函数会收到这个消息,在此消息中根据应用逻辑动态的对菜单项的状态动态调整。
wParam - 弹出菜单的句柄
lParam - LOWORD 弹出菜单那在上层菜单中的索引,HIWORD 是否是窗口菜单。(顶层菜单和系统菜单)


四、系统菜单
1.获取/恢复系统菜单
HMENU GetSystemMenu (
HWND hWnd, //句柄
BOOL bRevert //TRUE恢复系统菜单为缺省状态,FALSE获取系统菜单
);
如果bRever = TRUE,返回NULL,
如果bRever = FALSE,返回系统菜单句柄
2.修改系统菜单
1)追加/插入菜单项
AppendMenu/InsertMenu
2)删除菜单项
BOOL DeleteMenu (
HMENU hMenu, //菜单句柄
UINT uPosition //菜单项的ID或位置
UINT uFlags //按照ID删除还是按位置删
);
uFlags的取值:
MF_BYCOMMAND - 按菜单项ID删除
MF_BYPOSITION - 按菜单项位置删除


3)处理系统菜单
WM_SYSCOMMAND - 点击系统菜单会触发此消息。
wParam - 具体命令,如SC_CLOSE
lParam - 当前鼠标位置,LOWORD水平坐标,HIWORD垂直坐标




五、右键菜单(上下文菜单)
1.创建菜单
HMENU CreatePopupMenu (void);
成功返回菜单句柄,失败返回NULL
2.增删修改状态与顶层菜单一样
AppendMenu/InsertMenu/DeleteMenu/EnableMenuItem/CheckMenuItem
3.显示菜单
BOOL TrackPopupMenu (
HMENU hMenu, //菜单句柄
UINT uFlags, //显示方式
int x,
int y, //显示位置
int nReserved, //保留
HWND hWnd, //处理菜单消息的窗口句柄
const RECT* prcRect //忽略
);
成功返回TRUE,失败返回FALSE
uFlags取值:
TPM_LEFTALIGN \
TPM_CENTERALIGN  > 菜单显示在鼠标光标的右,中,左
TPM_RIGHTALIGN /


TPM_TOPALIGN \
TPM_VCENTERALIGN  > 菜单显示在鼠标光标的下中上
TPM+BOTTOMALIGN /


TPM_RETURNCMD - 函数返回所选菜单项ID或0(取消), 不会触发菜单消息.


TPM_LEFTBUTTOM - 只能用鼠标左键选择菜单项
TOM_RIGHTBUTTOM - 可以用左右两个键选择选择菜单项


4.在收到WM_RBUTTONUP弹出右键菜单
WM_RBUTTONUP消息lParam参数中的鼠标位置坐标是以窗口左上角为坐标原点,而
TrackPopupMenu函数所需要菜单位置是以屏幕左上角为原点。


BOOL ClientToScreen (
HWND hWnd, //窗口句柄
LPPOINT lpPoint, //点结构体(输入输出)
);
成功返回TRUE,失败返回FALSE




BOOL ScreenToClient (
HWND hWnd, //窗口句柄
LPPOINT lpPoint, //点结构体(输入输出)
);
成功返回TRUE,失败返回FALSE











































































































































































































































### 关于苍穹外卖 Day06 的教程或资料 目前,关于苍穹外卖项目的官方文档和公开资源主要集中在前五天的内容上[^2]。然而,在实际开发过程中,后续的课程通常会涉及更复杂的业务逻辑和技术细节,例如分布式事务处理、微服务架构优化以及性能调优等内容。 如果需要了解 **苍穹外卖 Day06** 的相关内容,可以尝试以下几个方向: #### 1. 微服务框架扩展 在第六天的学习中,可能会深入讲解如何通过 Spring Cloud 或 Dubbo 实现微服务之间的通信机制。这部分内容可能包括但不限于: - 使用 Feign 进行声明式 REST 调用。 - 配置负载均衡策略以提高系统的可用性和稳定性。 ```java @FeignClient(name = "order-service") public interface OrderServiceClient { @GetMapping("/orders/{id}") public ResponseEntity<Order> getOrderById(@PathVariable Long id); } ``` 上述代码片段展示了如何定义一个简单的 Feign 客户端来调用远程订单服务。 --- #### 2. 数据库分片与读写分离 随着项目规模的增长,数据库的压力也会逐渐增大。因此,Day06 可能会引入 ShardingSphere 或 MyCat 来实现数据分片和读写分离的功能。以下是配置文件的一个简单示例: ```yaml spring: shardingsphere: datasource: names: ds_0,ds_1 ds_0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db_0?serverTimezone=UTC&useSSL=false username: root password: 123456 ds_1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db_1?serverTimezone=UTC&useSSL=false username: root password: 123456 ``` 此部分重点在于提升数据库访问效率并降低单点故障风险。 --- #### 3. 缓存设计优化 缓存作为高性能系统的重要组成部分,其合理应用能够显著减少数据库查询次数。在 Day06 中,预计会对 Redis 缓存的设计进一步深化,比如利用 Redis Stream 处理实时消息队列或者采用布隆过滤器防止缓存穿透等问题。 以下是一个基于 RedisConfiguration 类的基础设置实例: ```java @Configuration public class RedisConfiguration { @Bean public LettuceConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(); } @Bean public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); return template; } } ``` 这段代码用于初始化 Redis 连接池及相关模板工具类。 --- #### 4. 日志监控体系搭建 为了更好地追踪线上问题,构建完善的日志收集与分析平台显得尤为重要。ELK (Elasticsearch, Logstash, Kibana) 堆栈可能是该阶段的重点之一,帮助开发者快速定位异常情况并提供可视化报表支持。 --- 尽管当前未找到明确标注为“苍穹外卖 Day06”的具体材料[^1],但从整体技术路线推测以上几个方面均有可能成为教学的核心主题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值