Да, вроде не тяжело. Можно через стандартный Windows диалог:
Код:
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
BOOL InitD3DRM(HWND hWnd, int full_win, int wid, int hei, int bit, int yes_hw);
void ActivateD3DRM(WPARAM wParam);
void RenderD3DRM();
void SizeD3DRM(WPARAM wParam,LPARAM lParam);
void PaintD3DRM();
void DestroyD3DRM();
int st_full=1, st_win=0, st_next=0, wid=1024, hei=768, bit=32, st_hw=1, st_hel=0;
BOOL keys[256]; // Массив для процедуры обработки клавиатуры
BOOL mou_rbut;
BOOL mou_lbut;
int mou_y;
int mou_x;
LRESULT CALLBACK WndProc(
HWND hWnd,UINT message,WPARAM wParam, LPARAM lParam)
{
switch (message) // Тип сообщения
{
case WM_CREATE:
{
if ( InitD3DRM(hWnd,st_full,wid,hei,bit, st_hw)==0 )
{
MessageBox(0,"Ошибка инициализации D3DRM.","Ошибка",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
}
break;
}
case WM_DESTROY:
case WM_CLOSE:
{
DestroyD3DRM();
PostQuitMessage(0);
break;
}
case WM_KEYDOWN:
{
if ( wParam==VK_ESCAPE )
{
DestroyD3DRM();
PostQuitMessage(0);
break;
}
keys[wParam] = TRUE;
break;
}
case WM_KEYUP:
{
keys[wParam] = FALSE;
break;
}
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_MOUSEMOVE:
{
mou_lbut = (wParam&MK_LBUTTON?TRUE:FALSE);
mou_rbut = (wParam&MK_RBUTTON?TRUE:FALSE);
mou_x = LOWORD(lParam);
mou_y = HIWORD(lParam);
break;
}
case WM_SIZE:
{
SizeD3DRM(wParam,lParam);
break;
}
case WM_ACTIVATE:
{
ActivateD3DRM(wParam);
break;
}
case WM_PAINT:
{
PaintD3DRM();
break;
}
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0);
}
void start_win ( HINSTANCE hinstExe )
{
MSG msg; // Структура сообщения Windows
WNDCLASS wc; // Структура класса Windows для установки типа окна
HWND hWnd;// Сохранение дискриптора окна
DWORD dwStyle;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hinstExe;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "D3DRM WinClass";
if(!RegisterClass(&wc))
{
MessageBox(0,"Ошибка регистрации класса окна.","Ошибка",MB_OK|MB_ICONERROR);
return;
}
if ( st_full==1 )
dwStyle=WS_POPUP;
else
dwStyle=WS_OVERLAPPEDWINDOW;
hWnd = CreateWindow(
"D3DRM WinClass",
"Пример D3DRM", // Заголовок вверху окна
dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0, 0, // Позиция окна на экране
wid, hei, // Ширина и высота окна
NULL, NULL, hinstExe, NULL);
if(!hWnd)
{
MessageBox(0,"Ошибка создания окна.","Ошибка",MB_OK|MB_ICONERROR);
return;
}
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
SetFocus(hWnd);
while (1)
{
if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
{
if ( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else return;
}
RenderD3DRM();
}
}
BOOL DlgInit
( HWND hwnd, HWND hwndFocus, LPARAM lParam )
{
SendDlgItemMessage(hwnd, IDC_RADIO_FULL, BM_SETCHECK, st_full, 0);
SendDlgItemMessage(hwnd, IDC_RADIO_WIN , BM_SETCHECK, st_win , 0);
SendDlgItemMessage(hwnd, IDC_RADIO_HW, BM_SETCHECK, st_hw, 0);
SendDlgItemMessage(hwnd, IDC_RADIO_HEL , BM_SETCHECK, st_hel, 0);
// SendDlgItemMessage(hwnd, IDC_COMBO1 , CB_ADDSTRING, 0, (LPARAM)"1");
return TRUE;
}
void DlgCommand
( HWND hwnd, int id, HWND hwndCtl, UINT codeNotify )
{
switch ( id )
{
case IDC_NEXT :
{
st_full=SendDlgItemMessage(hwnd, IDC_RADIO_FULL, BM_GETCHECK, 0, 0);
st_win =SendDlgItemMessage(hwnd, IDC_RADIO_WIN , BM_GETCHECK, 0, 0);
st_hw=SendDlgItemMessage(hwnd, IDC_RADIO_HW, BM_GETCHECK, 0, 0);
st_hel =SendDlgItemMessage(hwnd, IDC_RADIO_HEL , BM_GETCHECK, 0, 0);
st_next=1;
EndDialog(hwnd,id);
break;
}
case IDC_QUIT :
{
st_next=0;
EndDialog(hwnd,id);
break;
}
case IDC_RADIO_FULL:
{
st_full=SendDlgItemMessage(hwnd, IDC_RADIO_FULL, BM_GETCHECK, 0, 0);
st_win=0;
break;
}
case IDC_RADIO_WIN:
{
st_win=SendDlgItemMessage(hwnd, IDC_RADIO_WIN, BM_GETCHECK, 0, 0);
st_full=0;
break;
}
case IDC_RADIO_HW:
{
st_hw=SendDlgItemMessage(hwnd, IDC_RADIO_HW, BM_GETCHECK, 0, 0);
st_hel=0;
break;
}
case IDC_RADIO_HEL:
{
st_hel=SendDlgItemMessage(hwnd, IDC_RADIO_HEL, BM_GETCHECK, 0, 0);
st_hw=0;
break;
}
}
SendDlgItemMessage(hwnd, IDC_RADIO_FULL, BM_SETCHECK, st_full, 0);
SendDlgItemMessage(hwnd, IDC_RADIO_WIN , BM_SETCHECK, st_win , 0);
SendDlgItemMessage(hwnd, IDC_RADIO_HW, BM_SETCHECK, st_hw, 0);
SendDlgItemMessage(hwnd, IDC_RADIO_HEL , BM_SETCHECK, st_hel, 0);
}
BOOL CALLBACK Dlg_Proc
( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
BOOL rc=TRUE;
switch ( uMsg )
{
HANDLE_MSG ( hDlg, WM_INITDIALOG, DlgInit );
HANDLE_MSG ( hDlg, WM_COMMAND, DlgCommand );
default:
rc=FALSE;
break;
}
return rc;
}
// Головная процедура определяющая диалог
int WINAPI WinMain
( HINSTANCE hinstExe, HINSTANCE hinstPrev,
LPSTR lpszCmdLine, int nCmdShow )
{
DialogBox ( hinstExe, MAKEINTRESOURCE(IDD_SCREEN), NULL, Dlg_Proc);
if ( st_next==1 ) start_win(hinstExe);
return 0;
}
А в OGL можно через сообщения case WM_KEYDOWN и WM_KEYUP.
https://www.opengl.org/discussion_board ... for-OpenGL