Russian Qt Forum
Ноябрь 26, 2024, 09:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание WinAPI окна с Qt формы  (Прочитано 6763 раз)
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« : Октябрь 07, 2011, 09:47 »

Добрый день! Подскажите пожалуйста, как по нажатию на кнопку с формы Qt создать правильно WinAPI окно?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 07, 2011, 09:49 »

Что делаешь и что не получается? Зачем вообще WinAPI юзать?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #2 : Октябрь 07, 2011, 09:55 »

Что делаешь и что не получается? Зачем вообще WinAPI юзать?

Задание такое дали.. Создать Qt форму на ней пару кнопок.. по нажатию на одной из них открывается WinAPI окошко, где будут рисоваться примитивы OpenGL!
Записан
Rem Norton
Гость
« Ответ #3 : Октябрь 07, 2011, 13:55 »

Если я ничего не путаю, то Qt с отрисовкой примитивов OpenGL прекрасно справляется и без WinAPI. Или это у постановщика задачи фетиш такой: заставлять народ ежа с ужом скрещивать? Смеющийся
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #4 : Октябрь 07, 2011, 14:02 »

в общем работает так))

Код:
#include "servgl.h"
#include <QMessageBox.h>


HINSTANCE hInst;
static HGLRC hRC; // Постоянный контекст рендеринга
static HDC hDC; // Приватный контекст устройства GDI


bool RegisterClass(HINSTANCE hInstance);



ServGL::ServGL(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
setupUi(this);
connect(crWinGL, SIGNAL(clicked()), SLOT(slotCreateWindowGL()));

hInst = GetModuleHandle(NULL);
RegisterClass(hInst);
   
}

ServGL::~ServGL()
{
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
GLuint PixelFormat;
PAINTSTRUCT ps;

static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR), // Размер этой структуры
1, // Номер версии (?)
PFD_DRAW_TO_WINDOW |// Формат для Окна
PFD_SUPPORT_OPENGL |// Формат для OpenGL
PFD_DOUBLEBUFFER,// Формат для двойного буфера
PFD_TYPE_RGBA, // Требуется RGBA формат
32, // Выбор 16 бит глубины цвета
0, 0, 0, 0, 0, 0,// Игнорирование цветовых битов (?)
0, // нет буфера прозрачности
0, // Сдвиговый бит игнорируется (?)
0, // Нет буфера аккумуляции
0, 0, 0, 0, // Биты аккумуляции игнорируются (?)
32, // 16 битный Z-буфер (буфер глубины)  
0, // Нет буфера траффарета
0, // Нет вспомогательных буферов (?)
PFD_MAIN_PLANE, // Главный слой рисования
0, // Резерв (?)
0, 0, 0 // Маски слоя игнорируются (?)
};
switch (message) // Тип сообщения
{
case WM_CREATE:
hDC = GetDC(hWnd); // Получить контекст устройства для окна
PixelFormat = ChoosePixelFormat(hDC, &pfd);
// Найти ближайшее совпадение для нашего формата пикселов
if (!PixelFormat)
{
MessageBox(0,TEXT("Can't Find A Suitable PixelFormat."),TEXT("Error"),MB_OK|MB_ICONERROR);
PostQuitMessage(0);
// Это сообщение говорит, что программа должна завершится
break; // Предтовращение повтора кода
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
{
MessageBox(0,TEXT("Can't Set The PixelFormat."),TEXT("Error"),MB_OK|MB_ICONERROR);
PostQuitMessage(0);
break;
}
hRC = wglCreateContext(hDC);
if(!hRC)
{
MessageBox(0,TEXT("Can't Create A GL Rendering Context."),TEXT("Error"),MB_OK|MB_ICONERROR);
PostQuitMessage(0);
break;
}
if(!wglMakeCurrent(hDC, hRC))
{
MessageBox(0,TEXT("Can't activate GLRC."),TEXT("Error"),MB_OK|MB_ICONERROR);
PostQuitMessage(0);
break;
}
InitGL();
paintGL();
SwapBuffers( hDC );    // Меняем буфер (двойная буферизация)
break;

case WM_DESTROY:
    PostQuitMessage(0);
    break;

case WM_PAINT:
//
                break;


default:
       return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0);
}

bool RegisterClass(HINSTANCE hInstance)
{
WNDCLASS wc;   // Структура класса Windows для установки типа окна
   
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
        wc.hInstance = hInst;
wc.hIcon = NULL;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+2);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("OpenGL WinClass");


if(!RegisterClass(&wc))
{
  MessageBox(0,TEXT("Failed To Register The Window Class."),TEXT("Error"),MB_OK|MB_ICONERROR);
  return false;
}

return true;
}


bool ServGL::slotCreateWindowGL()
{

     MSG msg;  // Структура сообщения Windows
HWND hWnd; // Сохранение дискриптора окна

hWnd = CreateWindow(TEXT("OpenGL WinClass"),
                    TEXT("OpenGL"), // Заголовок вверху окна
                    WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME,
                     200, 200, // Позиция окна на экране
                    640, 480, // Ширина и высота окна
                    NULL,
                    NULL,
                    hInst,
                    NULL
                   );

if(!hWnd)
{
  MessageBox(0,TEXT("Window Creation Error."),TEXT("Error"),MB_OK | MB_ICONERROR);
}

ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
SetFocus(hWnd);

while (1)
{
// Обработка всех сообщений
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
 {
if (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
return true;
}
 }
}
}
« Последнее редактирование: Октябрь 07, 2011, 14:16 от Vladimir » Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #5 : Октябрь 07, 2011, 14:03 »

Или это у постановщика задачи фетиш такой: заставлять народ ежа с ужом скрещивать? Смеющийся

наверное))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 23.