2012-01-31 24 views
0

我正在創建一個程序,我要在窗口的右下角附近放置一個按鈕。我使用GetClientRect獲取窗口的頂部,底部,左側和右側。頂部和左側工作正常,但底部和右側不工作。這是我的代碼:在GetClientRect rect.bottom矩形不正確

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); 
} 

在編譯代碼並運行程序後,我無法看到按鈕。請幫忙。

+0

什麼「不起作用」?調用GetCLientRect函數後,MaxSize的值是多少? – 2012-01-31 05:34:20

回答

4

這種分配hWndMain看起來像它在您的主線代碼:

hWndMain = CreateWindowEx (WS_EX_APPWINDOW, 

雖然這是WndProc中:

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

然而,當接收到並在的處理WM_CREATE消息調用CreateWindow,所以它還沒有返回,所以對hWndMain的賦值還沒有發生。所以你可能會用一個無效或NULL的hWndMain調用GetClientRect(),它很可能失敗並返回一個你忽略的錯誤。相反,使用傳遞給WndProc的hwnd參數。

+0

謝謝BredanMcK ...你的答案奏效了......我用GetClientRect(hWnd,&Size)替換了GetClientRect(hWndMain,&Size),程序現在工作正常......再次感謝...... – 2012-01-31 15:45:43