Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
returnless
26 / 26 / 3
Регистрация: 05.08.2012
Сообщений: 83
#1

GetWindowRect() Почему возвращается не тот размер окна? - C++

03.09.2012, 18:55. Просмотров 1659. Ответов 6
Метки нет (Все метки)

почему возвращается не тот размер окна что я задавал ранее? 800х600 задавал 806х625 вернула ф-я.
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    int GetWidth() 
    {
        RECT r;
        GetWindowRect(WindowHandle, &r);
        return r.right - r.left;
    };
 
    int GetHeight() 
    {
        RECT r;
        GetWindowRect(WindowHandle,&r);
        return r.bottom - r.top;    
    };
окно создается так
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
GameWindow :: GameWindow()
{
 
        const char* ClassName = "GameWindowClass";
        const char* WindowTitle = "GameWindow";
        const int Width = 800;
        const int Height = 600;
 
        HINSTANCE m_hInstance = GetModuleHandle(NULL);
 
        SelfWindow = this;
        WNDCLASSEX wc = {   sizeof(wc), CS_OWNDC | CS_HREDRAW | CS_VREDRAW,
                            WndProc, 0, 0, m_hInstance, NULL, NULL, NULL, NULL, ClassName, NULL };
 
        RegisterClassEx(&wc);
 
        int x = (GetSystemMetrics(SM_CXSCREEN) - Width)  / 2;
        int y = (GetSystemMetrics(SM_CYSCREEN) - Height) / 2;
 
        RECT rc;
        rc.left                 = x;
        rc.right                = x + Width;
        rc.top                  = y;
        rc.bottom               = y + Height;
 
        int Style       = WS_CAPTION | WS_MINIMIZEBOX; // | WS_SYSMENU
        int ExStyle     = WS_EX_APPWINDOW;
 
        AdjustWindowRectEx (&rc, Style, FALSE, ExStyle);
 
        WindowHandle = CreateWindowEx ( ExStyle, ClassName, WindowTitle, Style,
                                        rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
                                        NULL, NULL, m_hInstance, NULL);
 
        ShowWindow ( WindowHandle, SW_SHOWDEFAULT );
        SetForegroundWindow ( WindowHandle );
        SetFocus ( WindowHandle );
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2012, 18:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос GetWindowRect() Почему возвращается не тот размер окна? (C++):

Почему ничего не возвращается? - C++
Помогите, пожалуйста, разобраться, почему на выходе ничего не возвращается..:cry: #include <iostream> #include <cmath> using...

Почему при передаче по ссылке возвращается *this, а не this? - C++
Доброго времени суток! Изучаю перегрузку операции присваивания с указателем *this (ниже). Возврат идёт по ссылке на объект, то есть...

Разработать шаблон функции, в которую передается массив и размер и возвращается индекс минимального элемента - C++
Разработать шаблон функции, в которую передается массив и размер и возвращается индекс минимального элемента массива.

Почему не возвращается значение через указатель из метода класса? - C++
Вот решил проверить поведение указателя в программе (я только учу C++), как оказалось после выхода из метода, указатель не указывает на...

Почему вызывается не тот метод? - C++
При вызове метода Highlight() у экземпляра SomrClass вызывается базовая реализация class cBackLightListener { public: ...

Почему авторы диалоговых окон стараются сделать свои окна максимально похожими на стандартные окна? - C++
Начал рассматривать множество программ на С++ и заметил, что программисты стараются сделать почти все диалоговые окна максимально похожими...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
03.09.2012, 18:59 #2
попробуй менять экран и мерять его
*W=GetSystemMetrics(SM_CXSCREEN);
*H=GetSystemMetrics(SM_CYSCREEN);
0
returnless
26 / 26 / 3
Регистрация: 05.08.2012
Сообщений: 83
03.09.2012, 19:10  [ТС] #3
попробуй менять экран и мерять его
*W=GetSystemMetrics(SM_CXSCREEN);
*H=GetSystemMetrics(SM_CYSCREEN);
w=1600
h = 900
это размеры текущего видео режима экрана к окну это не имеет отношения. ктому же я не меняю видео режим, просто окно создаю и там все рисую.

мне для перспективной матрицы нужны текущие размеры окна
C++
1
2
3
4
5
6
7
8
9
            //perspective = GLPerspectiveProjection(60.0f, 1.33f, 0.1f, 100.0f);
            perspective = GLOrthographicProjection(0, GetWidth() , 0, GetHeight(), 0,100);
            //perspective = Matrix4D_Identity;
            xcenter = GetWidth() /2;
            ycenter = GetHeight() /2;
            
            glMatrixMode(GL_PROJECTION_MATRIX);
            perspective = transpose(perspective);
            glLoadMatrixf( (float*) &perspective);
а ф-ии фигней страдают( вот, от куда 806 и 625 берутся Оо?
0
returnless
26 / 26 / 3
Регистрация: 05.08.2012
Сообщений: 83
03.09.2012, 19:45  [ТС] #4
обнаружилась засада.
В любом окне для Win32 имеется понятие о двух областях. Первая область - это область всего окна. Во всю область окна входит клиентская часть и не клиентская часть. Заголовок окна, строка меню, меню окна, минимизирующие и максимизирущие кнопки, границы являются неклиентской областью.
поправил теперь норм.
3
Изображения
 
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
03.09.2012, 21:37 #5
GetClientRect(&rc) возвращает размер клиентской части окна
(rc.right - ширина, rc.bottom - высота).
GetWindowRect(&rc) возвращает координаты всего окна
(rc.top,rc.left)-левая верхняя точка,
(rc.bottom,rc.right)-правая нижняя точка.

Вопрос: А как теперь получить координаты клиентской части?
0
returnless
26 / 26 / 3
Регистрация: 05.08.2012
Сообщений: 83
04.09.2012, 05:08  [ТС] #6
>А как теперь получить координаты клиентской части?
Отправить запрос в саппорт майкрософта пускай разродятся координатами.

Не по теме:

ну или повычитать структуры друг из друга

0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
04.09.2012, 10:29 #7
Цитата Сообщение от returnless Посмотреть сообщение
повычитать структуры друг из друга
Не получится. Поскольку они в разных координатах.
Первый - в относительных, второй - в абсолютных.
Тупой способ известен - узнать размер заголовка, тулбара и т.д.
и только потом повычитать. Но уж очень геморройно....
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2012, 10:29
Привет! Вот еще темы с ответами:

Объяснить почему выводит на экран не тот элемент массива, который ожидается - C++
#include <iostream> using namespace std; int main() { int mas = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }; cout << mas << endl; cout...

Почему перегруженные шаблоны функций должны возвращать один и тот же тип? - C++
Так как я еще очень плохо знаю шаблоны и никак не могу понять. Почему у всех перегруженных шаблонных функций с одинаковыми именами так же...

Почему выводится один и тот же адрес памяти при одновременных запусках одной программы - C++
Здравствуйте, уважаемые программисты У меня к вам такой вопрос: при запуске программы, которая содержит указатель на некую переменную...

Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? - C++
К примеру : int main() { int x=3, y=4; swap(&x,&y); return 0; } void swap(int* a, int* b){ int tmp = *a; *a...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.09.2012, 10:29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru