本篇要讲的是windows编程里面的灵魂,消息响应处理。windows中各种事物或者外部输入等等这些东西的数据传输都是通过消息响应的机制实现的,那么现在我们将会为我们的黑白棋游戏添加鼠标响应处理,从鼠标点击窗口的消息中获取我们需要的坐标信息。
下面看看我们需要看的代码:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
int x=0;
int y=0;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
case WM_LBUTTONDOWN:
x=LOWORD(lParam);
y=HIWORD(lParam);
g_OthelloMain.OnClick(x,y);//调用主类的鼠标单击响应函数
break;
可以对比自己的源码看到添加了一个case WM_LBUTTONDOWN这一列。
了解过windows消息响应机制的基础的应该清楚,每一个case对应的是Message的一个消息。这个消息是用宏定义的,方便大家使用,这里的WM_LBUTTONDOWN就是响应鼠标左键按下的宏,响应的有响应右键,响应键盘等等,这些宏大家可以去查一下手册或者百度都很容易找到自己想要的。上诉代码会在鼠标左键按下的时候运行那一列case所对于的语句,所以我们在下面写下需要进行的各种功能。
那么我们如何知道鼠标按下的坐标呢?孙鑫老师第一课视频讲过
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
这个函数,其中wParam和lParam都是参数,用于传递消息自己所具有的各种数据,在这里我们需要获取的是鼠标按下的坐标,那么这个数据存在lParam中。取低位位lParam是鼠标按下对应的横坐标,高位对应的是纵坐标,注意原点是窗口客户区左上角的顶点。
那么我们给主类创建一个响应鼠标按下操作的函数:
void OnClick(int x, int y);
我们需要把这个响应传递给逻辑类进行处理,那么对于逻辑类也添加一个函数:
int COthelloLogic::PlayChess(int x, int y)
在主类中调用逻辑类的这个函数进行坐标传递,所以这个函数就要处理坐标变换而且要处理上一篇遗留的问题:
int COthelloLogic::PlayChess(int x, int y)
{
Pos_X = x/60; //根据鼠标的坐标得出点击的是那个棋子的位置
Pos_Y = y/60;
if((Color[Pos_X][Pos_Y] == 1) || (Color[Pos_X][Pos_Y] == 2))
{
return 3;//返回一个错误3,即这个位置有棋子
}
if(Color[Pos_X][Pos_Y] == 0)
{
int message = Judgement( Pos_X, Pos_Y);
return message; //返回一个执行了Judgement函数的返回值1为落子正确,2为落子无解
}
return 0;
}
这样我们的程序的逻辑处理也就几乎完备了。
这一篇内容较少,专注讲这个消息响应,那么下一篇我们将把逻辑和视图联系起来。
敬请期待~