大家先看原文:
本节介绍另一个绘制字符的函数DrawText(),表2-4给出了该函数的使用说明。
// 2-4-1.c
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hDC, "Hello, Welcome to Windows!", -1,
&rect, DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER);
EndPaint(hwnd, &ps);
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0L;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
上面的程序有一个小问题,窗口对象每当收到WM_PAINT消息时都要调用函数GetClientRect()来获得用户区的大小。这样,对程序的效率有些影响,因为窗口对象在大多数情况下收到WM_PAINT消息时,用户区的大小(或说整个窗口的大小)并没有改变,例如,在窗口被对话框覆盖的情况下等。
每当窗口的大小发生变化时,Windows都要向窗口对象直接发送一条WM_SIZE消息(不通过应用程序的消息队列),消息的lParam参数的低位字中含有用户区的宽度,而高位字中含有用户区的高度,并使用设备单位(像素)表示(有关设备单位的内容在第三章介绍)。在Windows.h中定义的宏LOWORD和HIWORD可用来分离参数lParam的高位字和低位字。下面是使用WM_SIZE消息重新设计的程序。
// 2-4-2.c
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
static RECT rect;
switch(message)
{
case WM_SIZE:
rect.right = LOWORD(lParam);
rect.bottom = HIWORD(lParam);
return 0L;
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hDC, "Hello, Welcome to Windows!", -1,
&rect, DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER);
EndPaint(hwnd, &ps);
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0L;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
以上是书上的原文,我觉得重新设计的2-4-2.c程序还是有问题,
GetClientRect(hwnd, &rect)函数不是每当消息处理函数收到WM_PAINT消息后还是再次被调用,跟2-4-1.c中的不是一个样吗?还更加烦了!程序效率反而低了。我觉得因该把GetClientRect()放到上面WM_SIZE的分支下执行,当窗口大小改变后,用GetClientRect()来更新DrawText()中的&rect,我把程序改为下面:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
static RECT rect;
switch(message)
{
case WM_SIZE:
rect.right = LOWORD(lParam);
rect.bottom = HIWORD(lParam);
GetClientRect(hwnd, &rect);
return 0L;
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
DrawText(hDC, "Hello, Welcome to Windows!", -1,
&rect, DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER);
EndPaint(hwnd, &ps);
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0L;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
请各位高手帮忙,我是刚入门的菜鸟,现在在学API,还有哪有下API大全的,最好是很详细的那种,我现在只看见函数名,都不知道函数在干些什么!特别是函数的参数是怎么传递的?
本节介绍另一个绘制字符的函数DrawText(),表2-4给出了该函数的使用说明。
// 2-4-1.c
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hDC, "Hello, Welcome to Windows!", -1,
&rect, DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER);
EndPaint(hwnd, &ps);
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0L;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
上面的程序有一个小问题,窗口对象每当收到WM_PAINT消息时都要调用函数GetClientRect()来获得用户区的大小。这样,对程序的效率有些影响,因为窗口对象在大多数情况下收到WM_PAINT消息时,用户区的大小(或说整个窗口的大小)并没有改变,例如,在窗口被对话框覆盖的情况下等。
每当窗口的大小发生变化时,Windows都要向窗口对象直接发送一条WM_SIZE消息(不通过应用程序的消息队列),消息的lParam参数的低位字中含有用户区的宽度,而高位字中含有用户区的高度,并使用设备单位(像素)表示(有关设备单位的内容在第三章介绍)。在Windows.h中定义的宏LOWORD和HIWORD可用来分离参数lParam的高位字和低位字。下面是使用WM_SIZE消息重新设计的程序。
// 2-4-2.c
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
static RECT rect;
switch(message)
{
case WM_SIZE:
rect.right = LOWORD(lParam);
rect.bottom = HIWORD(lParam);
return 0L;
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hDC, "Hello, Welcome to Windows!", -1,
&rect, DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER);
EndPaint(hwnd, &ps);
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0L;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
以上是书上的原文,我觉得重新设计的2-4-2.c程序还是有问题,
GetClientRect(hwnd, &rect)函数不是每当消息处理函数收到WM_PAINT消息后还是再次被调用,跟2-4-1.c中的不是一个样吗?还更加烦了!程序效率反而低了。我觉得因该把GetClientRect()放到上面WM_SIZE的分支下执行,当窗口大小改变后,用GetClientRect()来更新DrawText()中的&rect,我把程序改为下面:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
static RECT rect;
switch(message)
{
case WM_SIZE:
rect.right = LOWORD(lParam);
rect.bottom = HIWORD(lParam);
GetClientRect(hwnd, &rect);
return 0L;
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
DrawText(hDC, "Hello, Welcome to Windows!", -1,
&rect, DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER);
EndPaint(hwnd, &ps);
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0L;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
请各位高手帮忙,我是刚入门的菜鸟,现在在学API,还有哪有下API大全的,最好是很详细的那种,我现在只看见函数名,都不知道函数在干些什么!特别是函数的参数是怎么传递的?
是《Win程序设计》的例子吧
----------------------------------
waiting
----------------------------------==〉MSDN呵呵,在另外一个网站看到了同样的问题。