В GetClientRect rect.bottom rect.right не правильно - PullRequest
0 голосов
/ 31 января 2012

Я создаю программу, в которой я хочу разместить кнопку в правом нижнем углу окна. Я использую 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 Ответ

4 голосов
/ 31 января 2012

Это назначение hWndMain выглядит так, как будто оно в вашем основном коде:

hWndMain = CreateWindowEx (WS_EX_APPWINDOW,

Пока это в WndProc:

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

Однако сообщение WM_CREATE получено и обработано в течение вызова метода CreateWindow, поэтому оно еще не возвращено и поэтому назначение hWndMain еще не выполнено. Таким образом, вы, вероятно, вызываете GetClientRect () с недопустимым или равным NULL hWndMain, и, скорее всего, он завершается с ошибкой и возвращает ошибку, которую вы игнорируете. Вместо этого используйте параметр hwnd, который передается в WndProc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...