fumlead | Дата: Суббота, 13.07.2013, 12:30 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: Offline
| Всем доброго времени суток. Потребовалось объединить в одном окне SDL-окно и интерфейс WinAPI (либо любую другую доступную библиотеку для создания интерфейса). Собственно, сделать это никак не получается, поиск ничего не дал. Прошу помощи.
|
|
| |
haav | Дата: Суббота, 13.07.2013, 21:37 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Привет fumlead!
Если хочется юзать WinApi интерфейс рядом с окном SDL, нужно создать основное окно, в нем окно SDL где будет графика и оставшееся место под контролы WinApi. При попытках пихать контролы в само графическое окно скорее всего ничего хорошего не выйдет. Вообще WinApi GUI не для этого. Я не знаю ни одной полноценной халявной либы для создания интерфейса в играх, демках и пр. Есть одна симпотная, но опять же в ней лишь некоторые контролы и она заточена под OpenGL. Завтра я ее выложу на основном своем сайте.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
haav | Дата: Воскресенье, 14.07.2013, 10:01 | Сообщение # 3 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Я тут по быстрому на коленке написал принцип того, что описал выше. Код выглядит конечно коряво, но основную суть передает:
Код '' '' SDL pixel ploting example ''
#Include "SDL\SDL_syswm.bi" #Include "SDL\SDL.bi" Const SCR_WIDTH = 320*1 Const SCR_HEIGHT = 240*1
Declare Sub doRender (ByVal video As SDL_Surface Ptr) Declare Sub SDLDRAW(iparam As Any Ptr)
Dim result As Unsigned Integer Dim Shared video As SDL_Surface Ptr Dim Shared event As SDL_Event
result = SDL_Init(SDL_INIT_EVERYTHING) If result <> 0 Then End 1 End If
video = SDL_SetVideoMode( SCR_WIDTH, SCR_HEIGHT, 32, SDL_NOFRAME) If video = 0 Then SDL_Quit End 1 End If
Dim As SDL_SysWMinfo wmInfo
SDL_GetWMInfo(@wmInfo)
Dim As HWND hwndSDL = wmInfo.window Dim As hwnd mainhwnd Dim msg As MSG Dim As WNDCLASSEX wc Dim As String NameClass="MyClass"
Function wndproc(hwnd As HWND, msg As UInteger,_ wparam As WPARAM, lparam As LPARAM) As Integer Select Case msg Case WM_DESTROY PostQuitMessage(0) Case WM_COMMAND End End Select Return DefWindowProc(hwnd,msg,wparam,lparam) End Function
With wc .cbSize=SizeOf(WNDCLASSEX) .style=CS_HREDRAW Or CS_VREDRAW .lpfnWndProc=@wndproc .hIcon=LoadIcon(0,IDI_QUESTION) .hCursor=LoadCursor(0,IDC_HELP) .hbrBackground=Cast(HBRUSH,COLOR_WINDOWFRAME) .lpszClassName=StrPtr(NameClass) .hIconSm=.hIcon End With
If RegisterClassEx(@wc)=0 Then Print "Register error, press any key" Sleep End EndIf
mainhwnd = CreateWindowEx(0,NameClass,"SDLPARENT",_ WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,400,400,0,0,0,0) Var button = CreateWindowEx(0,"Button","Âûõîä",_ WS_VISIBLE Or WS_CHILD,30,300,80,20,mainhwnd,1,0,0)
SetParent(hwndSDL, mainhwnd) ThreadCreate(@SDLDRAW) MoveWindow(hwndSDL, 10, 10, 320, 240, FALSE)
While GetMessage(@msg,0,0,0) TranslateMessage(@msg) DispatchMessage(@msg) Wend
Sub SDLDRAW(iparam As Any Ptr) Do
doRender video
SDL_Flip video
SDL_PumpEvents Loop Until( (SDL_PollEvent( @event ) <> 0) And ((event.type = SDL_KEYDOWN) Or (event.type = SDL_MOUSEBUTTONDOWN)) ) End Sub
Sub doRender( ByVal video As SDL_Surface Ptr ) Dim buffer As UInteger Ptr Dim x As Integer, y As Integer Dim c As UInteger Dim i As Integer
SDL_LockSurface( video )
For i = 1 To 1000 x = Rnd * (SCR_WIDTH-1) y = Rnd * (SCR_HEIGHT-1) c = (Rnd * 256) Shl 8 ' 2^24
buffer = video->pixels + y * video->pitch + x * Len( Integer )
*buffer = c Next i
SDL_UnlockSurface( video )
End Sub
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
fumlead | Дата: Воскресенье, 14.07.2013, 12:35 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: Offline
| haav, спасибо большое, то что нужно. Код понятен.
|
|
| |