在GetClientRect rect.bottom rect.right不正确

时间:2012-01-31 05:28:40

标签: winapi

我正在创建一个程序,我想在窗口的右下角附近放置一个按钮。我正在使用GetClientRect来获取窗口的顶部,底部,右侧和左侧。顶部和左侧工作正常但底部和右侧不起作用。这是我的代码:

WNDCLASSEX Program;
/*Class declaration*/
hWndMain = CreateWindowEx (WS_EX_APPWINDOW,
                        "Program",
                        "Program",
                        WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX,
                        GetSystemMetrics(SM_CXSCREEN)/2-210,
                        GetSystemMetrics(SM_CYSCREEN)/2-135,
                        420,270,
                        HWND_DESKTOP,
                        NULL,hInstance,NULL);
//Window Procedure
WM_CREATE:
{
 RECT MaxSize;
 GetClientRect(hWndMain,&MaxSize);

 /*Menu declaration using CreateMenu, AppendMenu etc*/

 HWND hCalculate = CreateWindowEx(0,WC_BUTTON,
                                           "Calculate",
                                           WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_DEFPUSHBUTTON | 0x00000001,
                                           MaxSize.right-156,MaxSize.bottom-51,140,30,
                                           hWnd,(HMENU)IDC_BUTTON1,
                                           GetModuleHandle(NULL), 0);
}

编译代码并运行程序后,我无法看到按钮。请帮忙。

1 个答案:

答案 0 :(得分:4)

对hWndMain的这个分配看起来像是在你的主线代码中:

hWndMain = CreateWindowEx (WS_EX_APPWINDOW,

虽然这是在WndProc中:

//Window Procedure
WM_CREATE:
{
    ...
    GetClientRect(hWndMain,&MaxSize);

但是,在对CreateWindow的调用中接收并处理了WM_CREATE消息,因此它尚未返回,因此尚未对hWndMain进行分配。因此,您可能使用无效或NULL hWndMain调用GetClientRect(),并且可能会失败并返回您忽略的错误。而是使用传递给WndProc的hwnd参数。