主事件循环

主循环一般如此写:
while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}


首先在这个主循环之间,main函数已经对当前窗口类定制了其对应的消息处理函数WndProc 。
这个消息循环中的第一个函数 GetMessage(),从窗口消息队列头获得下一条消息,直到GetMessage()返回0。
 BOOL GetMessage(
       LPMSG lpMsg,   // 检索到的消息
       HWND  hWnd,    // 窗口指向
       UINT  wMsgFilterMin, // 消息范围的下界限参数
       UINT  wMsgFilterMax  // 上界限参数
);


第一个参数一般设置为 &msg,而其他的参数没太大作用,一般设置为NULL或0.这里的参数msg是Windows用于放置文本消息的储存空间,是一个复杂的数据结构MSG,而不是之前的一个消息ID:
typedef struct tagMSG {
    HWND        hwnd; // 窗口句柄
    UINT        message; // 消息ID
    WPARAM      wParam; //详细信息
    LPARAM      lParam;//详细信息
    DWORD       time;//事件发生时间
    POINT       pt;//鼠标位置
#ifdef _MAC
    DWORD       lPrivate;
#endif
} MSG



当一个程序中有一定的快捷键时,当按下快捷键时,调用TranslateAccelerator函数,将本身的按键消息跟快捷键表中定义的按键进行比较,如果发现快捷键,就将这个按键消息转换为快捷键表中定义的消息。
接下来调用TranslateMessage()函数,这个函数是一个虚拟加速键转换器,进行消息的翻译。
最后调用 DispatchMessage()函数发送消息,这个函数中调用WinProc,并根据之前的MSG来发送给WinProc函数适当的参数。
### Python Turtle 图形库中主事件循环的使用 在 `turtle` 库中,主事件循环用于处理图形界面中的各种交互操作。通过调用特定函数可以启动并维持这个循环。 #### 启动主事件循环 为了保持窗口打开直到用户关闭它,在程序结束前应当调用 `turtle.done()` 函数来进入主事件循环[^1]: ```python import turtle # 创建画布 screen = turtle.Screen() # ... (绘制代码) # 进入主事件循环 turtle.done() ``` 当执行到这一步时,程序会等待用户的进一步动作,比如点击屏幕上的关闭按钮。如果在此之前退出,则不会显示完整的图像。 #### 结合定时器功能 除了简单地停留在最后的画面外,还可以利用 `ontimer` 方法设置周期性的回调函数,从而实现动画效果或其他基于时间的操作[^2]: ```python def update(): # 更新逻辑... screen.update() # 刷新画面 # 设置下一次更新的时间间隔(毫秒) screen.ontimer(update, delay=100) update() # 开始第一次更新 turtle.done() ``` 这里定义了一个名为 `update` 的函数负责定期刷新内容,并通过 `ontimer` 安排其重复执行。注意每次都要重新安排下次调用以形成连续的过程。 #### 处理鼠标键盘输入 对于更复杂的互动需求,可以通过绑定相应的按键或鼠标的响应函数至指定事件上,使得用户能够控制正在运行的应用程序[^3]: ```python def move_forward(): t.forward(50) t = turtle.Turtle() # 将 'w' 键按下事件与前进命令关联起来 screen.onkey(move_forward, "w") # 让监听生效 screen.listen() turtle.done() ``` 上述例子展示了如何让玩家按 `'w'` 来使乌龟向前移动一段距离;同样也可以为其他方向键设定类似的映射关系以便于导航。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值