Welcome

首页 / 软件开发 / VB.NET / API入门系列之七 -完善MessageBox

API入门系列之七 -完善MessageBox2010-01-04 cnblogs beyondcode各位不好意思,前几天有些事很忙,昨天才稍稍有时间空闲下来,所以我将我的API入门系列文章继续下去,上一篇《自己实现MessageBox》中我们基本已经实现了一个对话框了,可以在中央显示自己的文字,并且显示一个确定按钮,可是,上一篇完的时候我留下了一个问题,那就是那个确定按钮并不会根据窗口的大小的改变而改变。那么我们怎么来解决这个问题呢?

我给出了提示可以通过处理WM_SIZE来完成这个目的。那么今天我们就来完成这一遗留的问题。所要使用到的新的API函数也不多,就两个,要处理的消息也就两个WM_SIZE和WM_COMMAND

GetDlgItem

MoveWindow

这么两个,至于其他的API函数,都是我们以前接触过的,如果你忘记了,可以自己复习一下使用方 法。

首先,我们先看WM_SIZE消息处理函数是怎么写的

case WM_SIZE:
{
const int buttonWidth = 80;
const int buttonHeight = 25;
int buttonx, buttony;
RECT rctClient;
GetClientRect( hwnd, &rctClient );
buttonx = rctClient.right/2 - buttonWidth/2;
buttony = rctClient.bottom/2 - buttonHeight/2;
HWND hButton = GetDlgItem( hwnd, 2 );
MoveWindow( hButton, buttonx, buttony, buttonWidth, buttonHeight, TRUE );
}
break;

由于这篇文章内容比较少,那么我就可以详细的介绍一下WM_SIZE这个消息处理函数中实现按钮始终 保持居中的代码。WM_SIZE这个消息是当一个窗口的size也就是大小被改变后而被发送到该窗口的消息处 理函数的。我们在这里通过截获WM_SIZE就可以在每次窗口大小被改变的时候进行一些处理,我们这里的 处理就是将该窗口上的一个子窗口,也就是那个确定按钮移动到中央。

首先,我们还是老规矩,定义buttonWidth,和buttonHeight两个常整形来存放确定按钮的长和高。然 后定义了两个整形变量buttonx,和buttony用来存放后面通过计算得到的确定按钮的左上角的坐标位置 。

然后定义了一个RECT结构体用来保存后面通过GetClientRect API函数获取的窗口的长宽,其中 rctClient中right就保存了窗口的长,bottom就保存了窗口的高。我们为了让按钮保持在主窗口的中央 ,那么我们就需要让按钮的左上角的x坐标位置在主窗口的长的一半再减去按钮的长的一半的位置。高也 是一样的原理。所以 buttonx = rctClient.right/2 - buttonWidth/2; buttony = rctClient.bottom/2 - buttonHeight/2; 这两句就是根据当前主窗口的长和高计算按钮应该在的位 置。

计算完成后,我们就只需要移动按钮就可以了。可是移动按钮之前,我们需要获得按钮的句柄,这个 句柄怎么获得呢,有很多中方法,这里我就用GeDlgItem这个API函数来获取,它需要两个参数,第一个 参数是一个主窗口的句柄,这里我们就传递按钮的主窗口的句柄hwnd,第二个参数是按钮的一个标识符 ,因为我们在前一篇文章中用CreateWindowEx创建子窗口的时候给按钮指定的标识符是2,所以这里我们 就传递2,那么这样GetDlgItem返回的就是这个按钮的句柄了。

得到了句柄后,我们就需要用MoveWindow来移动这个子窗口按钮,到我们需要的位置了。第一个参数 是这个字窗口的句柄,也就是我们上面获得的句柄,第二个参数和第三个参数是移动到的x,y坐标。这 里我们传递buttonx和buttony,第四个和第五个是移动的窗口的长和高,如果同时还需要改变窗口的长 和高,那么这里也可以传递改变后的长和高的值,我们这里只移动位置,不改变大小,所以就传递 buttonWidth和buttonHeight。最后一个参数是一个BOOL型的,指示是否需要重绘,这里传递TRUE,也就 是让它在移动后进行重绘。