C语言回调函数在事件处理中的运用例程
时间: 2023-08-11 20:14:56 浏览: 81
以下是一个简单的C语言回调函数在事件处理中的运用例程,该例程使用了SDL库来实现图形界面和事件处理。
```c
#include <stdio.h>
#include <SDL2/SDL.h>
typedef void (*event_callback_t)(void *data);
typedef struct {
event_callback_t callback;
void *data;
} event_handler_t;
void button_clicked(void *data) {
printf("Button clicked\n");
}
void handle_event(SDL_Event event, event_handler_t *handler) {
switch (event.type) {
case SDL_QUIT:
printf("Quit event\n");
break;
case SDL_MOUSEBUTTONDOWN:
if (handler != NULL && handler->callback != NULL) {
handler->callback(handler->data);
}
break;
}
}
int main() {
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *window = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
event_handler_t handler = {
.callback = button_clicked,
.data = NULL
};
while (1) {
SDL_Event event;
while (SDL_PollEvent(&event)) {
handle_event(event, &handler);
}
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_Rect rect = { 100, 100, 100, 50 };
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderFillRect(renderer, &rect);
SDL_RenderPresent(renderer);
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
```
在上面的代码中,我们定义了一个event_handler_t结构体,该结构体包含了一个回调函数指针和一个void指针类型的数据。然后我们定义了一个button_clicked回调函数,在该函数中输出"Button clicked"。在handle_event函数中,我们根据不同的事件类型来处理事件,如果是鼠标点击事件,则调用回调函数处理该事件。
在主函数中,我们创建了一个SDL窗口和渲染器,并定义了一个event_handler_t类型的handler变量,该变量包含了button_clicked回调函数和空指针。然后我们进入了一个事件循环,不断地处理用户输入事件和绘制界面。在界面上,我们绘制了一个矩形,当用户点击该矩形时,程序会调用handler变量中的回调函数来处理该事件。
通过使用回调函数,我们可以将事件处理的逻辑和程序的其他部分分离开来,使代码更加清晰和易于维护。
阅读全文