Russian Qt Forum

Qt => Общие вопросы => Тема начата: Vladimir от Октябрь 07, 2011, 09:47



Название: Создание WinAPI окна с Qt формы
Отправлено: Vladimir от Октябрь 07, 2011, 09:47
Добрый день! Подскажите пожалуйста, как по нажатию на кнопку с формы Qt создать правильно WinAPI окно?


Название: Re: Создание WinAPI окна с Qt формы
Отправлено: Пантер от Октябрь 07, 2011, 09:49
Что делаешь и что не получается? Зачем вообще WinAPI юзать?


Название: Re: Создание WinAPI окна с Qt формы
Отправлено: Vladimir от Октябрь 07, 2011, 09:55
Что делаешь и что не получается? Зачем вообще WinAPI юзать?

Задание такое дали.. Создать Qt форму на ней пару кнопок.. по нажатию на одной из них открывается WinAPI окошко, где будут рисоваться примитивы OpenGL!


Название: Re: Создание WinAPI окна с Qt формы
Отправлено: Rem Norton от Октябрь 07, 2011, 13:55
Если я ничего не путаю, то Qt с отрисовкой примитивов OpenGL прекрасно справляется и без WinAPI. Или это у постановщика задачи фетиш такой: заставлять народ ежа с ужом скрещивать? ;D


Название: Re: Создание WinAPI окна с Qt формы
Отправлено: Vladimir от Октябрь 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;
}
 }
}
}


Название: Re: Создание WinAPI окна с Qt формы
Отправлено: Vladimir от Октябрь 07, 2011, 14:03
Или это у постановщика задачи фетиш такой: заставлять народ ежа с ужом скрещивать? ;D

наверное))