2013-01-07 32 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++中通常更可取。