LRESULT CALLBACK WinProc(
 HWND hwnd, 
 UINT uMsg, 
 WPARAM wParam, 
 LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(uMsg)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_BOTTOM) ;
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}这是一段代码,RECT rect,这里定义了一个rect结构,GetClientRect(hwnd,&rect);这里用获取客户区坐标函数,获得了这个结构,那么这个rect的值是什么。还有一直在说客户区,客户区到底是什么,

解决方案 »

  1.   

    [out] Pointer to a RECT structure that receives the client coordinates. The left and top members are zero. The right and bottom members contain the width and height of the window. rect中存放客户区左上角坐标位置客户区就是程序的整个界面
      

  2.   

    GetClientRect(hwnd,&rect);这里用获取客户区坐标函数,获得了这个结构,那么这个rect的值是什么
    ==============
    rect里面是客户区的坐标,也就是客户区的上、下、左、右的位置。还有一直在说客户区,客户区到底是什么
    ==============
    客户区是指窗口菜单栏以下的部分。
      

  3.   

    RECT rect定义的这个矩形区域,它的初始化的值是多少,
      

  4.   

    就上面的代码而言,RECT rect是不用初始值的,因为GetClientRect的作用是获取客户区的大小并存放在rect中,rect是不用初始化的。
      

  5.   

    也就是说GetClientRect获得了客户区的坐标,然后赋值给了rect.bottom rect.top rect.right rect.left  对吗? 如果是这样的话,那么GetClient得到的客户区的坐标是不是随机的,也就是我运行程序的时候,生成的窗口在哪里,GetClientRect就得到了这个客户区的坐标。
      

  6.   

    也许我该这么问,运行程序的时候,生成了一个窗口,这个窗口的位置是随机的,那么GetClientRect也就得到了窗口随机位置的坐标。
      

  7.   

    也就是说GetClientRect获得了客户区的坐标,然后赋值给了rect.bottom rect.top rect.right rect.left 对吗?
    ============
    对的如果是这样的话,那么GetClient得到的客户区的坐标是不是随机的,也就是我运行程序的时候,生成的窗口在哪里,GetClientRect就得到了这个客户区的坐标。
    ===========
    不对,客户区坐标是相对于窗口左上角而言的,所以你得到的rect.left和rect.top都是0,而rect.right是客户区宽度,rect.bottom是客户区的高度。
      

  8.   

    你还是没有明白,GetClientRect得到并不是窗口的坐标,而是窗口中客户区的坐标,而这个坐标是相对于窗口的左上角而言的,所以不管你的窗口显示时在什么桌面的什么地方,GetClientRect得到的值都是固定的。
      

  9.   

    不对,客户区坐标是相对于窗口左上角而言的,所以你得到的rect.left和rect.top都是0,而rect.right是客户区宽度,rect.bottom是客户区的高度。
    =================
    这也就是说把运行出来的窗口客户区赋值给了rect,然后 DrawText 就再这个rect矩形里输出文字 对吧
      

  10.   

    这么说GetClientRect(hwnd,&rect);的主要作用就是用来赋值的,为什么我在这里直接给RECT rect={35.68,98,56};赋值,然后把 // GetClientRect(hwnd,&rect);这句注释起来,就输出不了文字了,难道是DrawText 只能在RECT结构中输出文字而不能像画一个图形那样,直接在窗口客户区绘制图形。
      

  11.   

    为什么我在这里直接给RECT rect={35.68,98,56};赋值,然后把 // GetClientRect(hwnd,&rect);这句注释起来,就输出不了文字了,
    ================
    应该是RECT rect的范围太小了的原因吧,你换别的数试试
      

  12.   

    刚才没有仔细看,RECT rect={35.68,98,56};这个明显有问题啊,你的top=68,而bottom=56,底必须要大于顶才对啊
      

  13.   

    那几个值是我随便给的,如果我赋值正确了,是不是可以把这句// GetClientRect(hwnd,&rect);不要,也就可以了。
    ===
    如果Bottom 
        Left 
        Right 
        Top 给这几个赋值,Bottom  Left 是坐标点, Right Top 是宽度和高度?譬如说这个RECT rect={35.68,98,56};前两个表示的是坐标的位置,那么后两个是宽度和高度的具体值还是说也是一个坐标点
      

  14.   

    可以不用GetClientRect的。
    RECT的四个成员中,left代表矩形的左边,right代表右边,top代表顶部,bottom代表了底部。
    由于一般情况下,水平方向的正方向是向右的,竖直方向的正方向是向下的,所以一个具体的RECT变量中,right当然要大于left,bottom当然要大于top.
      

  15.   

    恩 终于明白了,最后一个弱智问题
    =====
    窗口客户区中,水平方向表示X轴,竖直方向表示Y值,知道了一个点的x和Y的坐标才能真正确定一个点,为什么rect中, rect={35.68,98,56};这样就确定了一个矩形,而不是rect={{12,35},{23,56},{,},{,}}这样去赋值。
      

  16.   

    这个和RECT的定义有关,RECT定义矩形时用的上下左右,而不是用坐标来定义的。
    你看一下MSDN中关于RECT的定义就知道了。
    typedef struct _RECT { 
      LONG left; 
      LONG top; 
      LONG right; 
      LONG bottom; 
    } RECT, *PRECT;