windows程序设计 第7章中的 CHECKER4 中。主窗口:
hwnd=CreateWindow(
szAppName,
TEXT("Checker4 Mouse Hit-Test Demo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
子窗口:
hwndChild[x][y]=CreateWindow(
szChildClass,
NULL,
WS_CHILDWINDOW | WS_VISIBLE,
0,0,0,0,
hwnd,(HMENU)(y<<8 | x),
(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);hwnd是主窗口柄。那么子窗口的回调函数中:LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//...
switch(message)
{
        case WM_SETFOCUS:
idFocus=GetWindowLong(hwnd,GWL_ID);
                return 0;
         }
//....
}
中的GetWindowLong(hwnd,GWL_ID)是什么意思。
获得主窗口的ID吗,可以主窗口哪有ID啊,不是NULL吗?那么GetWindowLong(hwnd,GWL_ID)得到的到底是什么?

解决方案 »

  1.   

    GetWindowLong(hwnd,GWL_ID)就是获取窗口ID
    虽然你设的是NULL
    但这个函数的功能还是那样
      

  2.   


     idFocus=GetWindowLong(hwnd,GWL_ID);
    执行后idFocus应该是0才对啰.但调试时,击键后(0,0)块除外,iFocus就不等于0.全代码如下:
    #include <Windows.h>#define DIVISIONS 5LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
    LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
    TCHAR szChildClass[]=TEXT("Checker3_Child");
    int idFocus=0;int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd )
    {
    static TCHAR szAppName[]=TEXT("temp");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass; wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hInstance=hInstance;
    wndclass.lpfnWndProc=WndProc;
    wndclass.lpszClassName=szAppName;
    wndclass.lpszMenuName=NULL;
    wndclass.style=CS_HREDRAW | CS_VREDRAW; if(!RegisterClass(&wndclass))
    {
    MessageBox(NULL,TEXT("注册失败"),szAppName,MB_ICONERROR);
    return 0;
    }
    wndclass.hCursor=LoadCursor(NULL,IDC_HAND);
    wndclass.lpfnWndProc=ChildWndProc;
    wndclass.hIcon=NULL;
    wndclass.cbWndExtra=sizeof(long);
    wndclass.lpszClassName=szChildClass;
    if(!RegisterClass(&wndclass))
    return 0; hwnd=CreateWindow(
    szAppName,
    TEXT("Checker4 Mouse Hit-Test Demo"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,
    CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nShowCmd);
    UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.wParam;
    }LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    static HWND hwndChild[DIVISIONS][DIVISIONS];
    int cxBlock,cyBlock,x,y;
    switch(message)
    {
    case WM_CREATE:
    for(x=0;x<DIVISIONS;x++)
    for(y=0;y<DIVISIONS;y++)
    hwndChild[x][y]=CreateWindow(
    szChildClass,
    NULL,
    WS_CHILDWINDOW | WS_VISIBLE,
    0,0,0,0,
    hwnd,(HMENU)(y<<8 | x),
    (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
    return 0;
    case WM_SIZE:
    cxBlock=LOWORD(lParam)/DIVISIONS;
    cyBlock=HIWORD(lParam)/DIVISIONS;
    for(x=0;x<DIVISIONS;x++)
    for(y=0;y<DIVISIONS;y++)
    MoveWindow(hwndChild[x][y],x*cxBlock,y*cyBlock,cxBlock,cyBlock,TRUE);
    return 0;
    case WM_LBUTTONDOWN:
    MessageBeep(MB_ICONERROR);
    return 0;
    case WM_SETFOCUS:
    SetFocus(GetDlgItem(hwnd,idFocus));
    return 0;
    case WM_KEYDOWN:
    x=idFocus & 0xFF;
    y=idFocus>>8;
    switch(wParam)
    {
    case VK_UP:
    y--;
    break;
    case VK_DOWN:
    y++;
    break;
    case VK_END:
    x=y=DIVISIONS-1;
    break;
    case VK_HOME:
    x=y=0;
    break;
    case VK_LEFT:
    x--;
    break;
    case VK_RIGHT:
    x++;
    break;
    default:
    return 0;
    }
    x=(x+DIVISIONS)%DIVISIONS;
    y=(y+DIVISIONS)%DIVISIONS;
    idFocus=y<<8 | x;
    SetFocus(GetDlgItem(hwnd,idFocus));
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
    }
    LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    switch(message)
    {
    case WM_CREATE:
    SetWindowLong(hwnd,0,0);
    return 0;
    case WM_KEYDOWN:
    if(wParam!=VK_RETURN && wParam !=VK_SPACE)
    {
    SendMessage(GetParent(hwnd),message,wParam,lParam);
    return 0;
    }
    case WM_LBUTTONDOWN:
    SetWindowLong(hwnd,0,1^GetWindowLong(hwnd,0));
    SetFocus(hwnd);
    InvalidateRect(hwnd,NULL,FALSE);
    return 0;
    case WM_SETFOCUS:
    idFocus=GetWindowLong(hwnd,GWL_ID);
    case WM_KILLFOCUS:
    InvalidateRect(hwnd,NULL,TRUE);
    return 0;
    case WM_PAINT:
    hdc=BeginPaint(hwnd,&ps);
    GetClientRect(hwnd,&rect);
    Rectangle(hdc,0,0,rect.right,rect.bottom);
    if(GetWindowLong(hwnd,0))
    {
    MoveToEx(hdc,0,0,NULL);
    LineTo(hdc,rect.right,rect.bottom);
    MoveToEx(hdc,0,rect.bottom,NULL);
    LineTo(hdc,rect.right,0);
    }
    if(hwnd==GetFocus())
    {
    rect.left+=rect.right/10;
    rect.right-=rect.left;
    rect.top+=rect.bottom/10;
    rect.bottom-=rect.top;
    SelectObject(hdc,GetStockObject(NULL_BRUSH));
    SelectObject(hdc,CreatePen(PS_DASH,0,0));
    Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
    DeleteObject(SelectObject(hdc,GetStockObject(BLACK_PEN)));
    }
    EndPaint(hwnd,&ps);
    return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
    }
      

  3.   

    应该是传入NULL后系统自动分配的
      

  4.   

    LZ没认真吧hwnd=CreateWindow(...)这个hwnd是WinMain的局部变量idFocus=GetWindowLong(hwnd,GWL_ID);的hwnd是ChildWndProc(HWND hwnd,...)的参数而ChildWndProc是子窗口处理函数
    GetWindowLong(hwnd,GWL_ID)就是获取子窗口ID,当然不为0咯
      

  5.   


    一语点醒!!
    再问一句,点子窗口时,子窗口是不是先获得WM_FOCUS,再获得WM_KEYDOWN.
      

  6.   


    原来没用过Spy++,刚下了一个,怎么对窗口发送消息?
    只看见里面有一堆父窗口句柄,上一个窗口句柄之类的东西,没看到有WM_SETFOCUS、WM_LBUTTONDOWN: