我正在创建一个程序,我想在窗口的右下角附近放置一个按钮。我正在使用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);
}
编译代码并运行程序后,我无法看到按钮。请帮忙。
答案 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参数。