2013-01-07 30 views
1

時,當在MSDN例子中,我得到以下錯誤使用GetWindowRect以同樣的方式, 「不能‘RECT’轉換爲‘tagRECT *’的參數‘2’到「BOOL GetWindowRect(HWND__ ,tagRECT)「」下面是代碼重現錯誤:您需要將您的RECT使GetWindowRect可以改變它的地址編譯器錯誤調用GetWindowRect

#include <windows.h> 
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); 
char szClassName[ ] = "WindowsApp"; 

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, 
       LPSTR lpszArgument, int nFunsterStil) 
{ 
HWND hwnd;    
MSG messages;    
WNDCLASSEX wincl;   

wincl.hInstance = hThisInstance; 
wincl.lpszClassName = szClassName; 
wincl.lpfnWndProc = WindowProcedure;  
wincl.style = CS_DBLCLKS;     
wincl.cbSize = sizeof (WNDCLASSEX); 

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); 
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); 
wincl.hCursor = LoadCursor (NULL, IDC_ARROW); 
wincl.lpszMenuName = NULL;     
wincl.cbClsExtra = 0;      
wincl.cbWndExtra = 0;      
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; 

if (!RegisterClassEx (&wincl)) 
    return 0; 

hwnd = CreateWindowEx (0, szClassName, "Windows App", WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, 
     hThisInstance, NULL); 

RECT blah; 
GetWindowRect (hwnd, blah); 

ShowWindow (hwnd, nFunsterStil); 

while (GetMessage (&messages, NULL, 0, 0)) 
{ 
    TranslateMessage(&messages); 
    DispatchMessage(&messages); 
} 

return messages.wParam; 
} 


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, 
LPARAM, lParam) 
{ 
switch (message)     
{ 
    case WM_DESTROY: 
     PostQuitMessage (0);  
     break; 
    default:      
     return DefWindowProc (hwnd, message, wParam, lParam); 
} 
return 0; 
} 
+1

錯誤消息告訴你什麼是錯的。 –

+0

我可以想象它是如何將'RECT'看作'tagRECT *',當它的真正含義是'RECT'到'RECT *'時,它有多混亂。這真的需要一些有用的錯誤。 – chris

回答

4

。該函數需要一個指向RECTRECT *)的指針,但是您傳遞的是RECT

修復這樣的:

RECT blah; 
GetWindowRect(hwnd, &blah); 
        ^

如果函數拿了RECT,它所做的任何更改將被丟棄,因爲它會按值傳遞(也就是你的對象的副本將被傳遞在)。 &blah會發生什麼情況是指針而不是對象通過值傳遞,但該值仍然是對象的相同地址,因此更改該地址處的內容仍然存在。因此,它是通過引用傳遞對象的一種概念,另一種是具有實際引用的概念。然而,由於Windows API主要是用C語言編寫的,所以它使用更多的C-ish方法來獲取指針,而不是引用,這在C++中通常更可取。