Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > WinAPI
Перезагрузить страницу Создание универсального окна
Ответ
 
Опции темы Опции просмотра
  (#16 (permalink)) Старый
daniilpetrov daniilpetrov вне форума
Member
 
Аватар для daniilpetrov
 
Сообщений: 213
Сказал(а) спасибо: 33
Поблагодарили 3 раз(а) в 2 сообщениях
Регистрация: 10.06.2011
Адрес: Россия
По умолчанию 23.11.2011, 06:26

Ну я вроде ещё с ума не сошёл, чтоб не отличить WinAPI от VCL вот пример кода в WinAPI, который бы хотелось довести до ума:
cpp Код:
GLuint      PixelFormat;
    WNDCLASS    wc;
    DWORD       dwExStyle;
    DWORD       dwStyle;
    RECT        WindowRect;

    WindowRect.left = (long) 0;
    WindowRect.right = (long) width;
    WindowRect.top = (long) 0;
    WindowRect.bottom = (long) height;

    fullscreen = fullscreenflag;

    hInstance           = GetModuleHandle(NULL);
    wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc      = (WNDPROC) WndProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = hInstance;
    wc.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
    wc.hCursor          = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));
    wc.hbrBackground    = NULL;
    wc.lpszMenuName     = NULL;
    wc.lpszClassName    = "OpenGL";

    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, "Failed To Register The Window Class.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return false;
    }
    if (fullscreen)
    {
        DEVMODE dmScreenSettings;
        memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
        dmScreenSettings.dmSize = sizeof(dmScreenSettings);
        dmScreenSettings.dmPelsWidth = width;
        dmScreenSettings.dmPelsHeight = height;
        dmScreenSettings.dmBitsPerPel = bits;
        dmScreenSettings.dmFields= DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
        if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
        {
            if (MessageBox(NULL, "The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?",
            "NeHe GL", MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
            {
                fullscreen = false;
            } else {
                MessageBox(NULL, "Program Will Now Close.", "ERROR", MB_OK | MB_ICONSTOP);
                return false;
            }
        }
    }
    if (fullscreen)
    {
        dwExStyle   = WS_EX_APPWINDOW;
        dwStyle     = WS_POPUP;
        ShowCursor(false);
    } else {
        dwExStyle   = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
        dwStyle     = WS_OVERLAPPEDWINDOW;
    }
    AdjustWindowRectEx(&WindowRect, dwStyle, false, dwExStyle);

    if (!(hWnd = CreateWindowEx(dwExStyle,
        _T("OpenGL"),
        "FPS Engine v.0.0.8",
        WS_CLIPSIBLINGS |
        WS_CLIPCHILDREN |
        dwStyle,
        0, 0,
        WindowRect.right-WindowRect.left,
        WindowRect.bottom-WindowRect.top,
        NULL,
        NULL,
        hInstance,
        NULL)))
    {
        KillGLWindow();
        MessageBox(NULL, "Window Creation Error.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return false;
    }
Тут напрочь отсутствуют компоненты, а компоненты типа TForm существуют исключительно VCL, тем более, что Delfi VCL-ориентированная
Ответить с цитированием
  (#17 (permalink)) Старый
daniilpetrov daniilpetrov вне форума
Member
 
Аватар для daniilpetrov
 
Сообщений: 213
Сказал(а) спасибо: 33
Поблагодарили 3 раз(а) в 2 сообщениях
Регистрация: 10.06.2011
Адрес: Россия
По умолчанию 23.11.2011, 07:37

P.S. Я прекрасно знаю, как работать с окном средствами VCL я даже привёл код в WinAPI, мне нужен совет профи, который знает наверняка, можно ли менять режим без пересоздания окна! В VCL это похоже делается автоматически, а вот на WinAPI всё делается вручную и перезагружать при смене режима массу игровых данных довольно долго, а в FallOut 3, рамка то появляется, то исчезает, скорее всего косяк, но это получается без пересоздания окна!
Ответить с цитированием
  (#18 (permalink)) Старый
daniilpetrov daniilpetrov вне форума
Member
 
Аватар для daniilpetrov
 
Сообщений: 213
Сказал(а) спасибо: 33
Поблагодарили 3 раз(а) в 2 сообщениях
Регистрация: 10.06.2011
Адрес: Россия
По умолчанию 23.11.2011, 07:59

Сообразил! Чтоб не пересоздавать окно, в обоих случаях оно создаётся с рамкой, но чтоб рамки не было видно, окно создаётся с отрицательными координатами, остаётся только понять, как создавать окно поверх всего, чтоб прятался бар с кнопкой пуск, а потом только меняется режим монитора и положение окна!
Ответить с цитированием
  (#19 (permalink)) Старый
mss mss вне форума
Member
 
Сообщений: 163
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
Регистрация: 11.06.2010
По умолчанию 23.11.2011, 11:20

Это же кошмар какой ты трудный)

От всей VCL в этом примере в классе TFullScreenHandler используются только Sreeen.Width/Height и WinControl.Handle.

Это наверно очень сложно дотумкать что для исключения зависимости от VCL вместо Sreeen.Width/Height достаточно вызывать GetSystemMetrics(), а на WinControl на вообще не смотреть, ибо от него требуется только св-во Handle - хендл того самого окна, о котором идет у тебя речь.

А, ну и еще вместо WinСontrol.ClientRect напрямую вызывать GetClientRect()

Последний раз редактировалось mss; 23.11.2011 в 11:23
Ответить с цитированием
  (#20 (permalink)) Старый
daniilpetrov daniilpetrov вне форума
Member
 
Аватар для daniilpetrov
 
Сообщений: 213
Сказал(а) спасибо: 33
Поблагодарили 3 раз(а) в 2 сообщениях
Регистрация: 10.06.2011
Адрес: Россия
По умолчанию 24.11.2011, 02:52

Я просто всё просматривать не стал спасибо за настойчивость, кое-чего понял, осталось теперь довести свой код до ума и жить спокойно... Разобрался, как скрыть/показать панель задач, остальное - ерунда, я решил не менять свойства окна, можно только менять разрешение экрана и позицию окна!

Последний раз редактировалось daniilpetrov; 24.11.2011 в 02:58
Ответить с цитированием
Ads.
  (#21 (permalink)) Старый
daniilpetrov daniilpetrov вне форума
Member
 
Аватар для daniilpetrov
 
Сообщений: 213
Сказал(а) спасибо: 33
Поблагодарили 3 раз(а) в 2 сообщениях
Регистрация: 10.06.2011
Адрес: Россия
По умолчанию 24.11.2011, 03:23

Сам отвечаю на свой вопрос:
Функция SetWindowLong изменяет атрибут указанного окна. Функция также устанавливает 32-битное (long) значение по указанному смещению в дополнительной памяти окна.
Трудно же было полистать описаловку по WinAPI! Прошу прощения за мою лень, я во многом ещё ламмер, потому и обращаюсь к светилам науки
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание окна в DLL disassembler Вопросы начинающих программистов 0 18.01.2011 14:09
Создание окна и запуск 3d анимации IEshua C++ Builder 1 21.11.2008 03:31
Создание собственного стиля окна Hroft Visual C++ 3 19.02.2008 21:42
Создание простого окна в C++ Slooz Вопросы начинающих программистов 5 07.11.2007 21:09
Создание окна с рамкой BC 3.1 for DOS eugira С/С++ 5 21.09.2007 10:59
MBR написание универсального разработчика Explod Железо. Написание драйверов 0 22.01.2007 22:01
Динамическое создание окна Media Player поверх обычного окна evilbeaver Visual C++ 5 28.11.2006 21:26
Создание дискриптора окна Palmman Visual C++ 0 22.06.2006 14:19
ComboBox создание дочернего окна Jonano WinAPI 2 23.06.2005 02:36
Создание немодального окна в .Net sia .NET 1 23.04.2004 10:34
Динамическое создание окна snaky Visual C++ 1 19.06.2003 17:17
Создание модального окна Anonymous Oberon 4 21.03.2003 10:43



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов