| PMG http://forum.pmg.org.ru/ |
|
| подключение консоли к проекту http://forum.pmg.org.ru/viewtopic.php?f=1&t=9484 |
Страница 1 из 1 |
| Автор: | Nikita [ 14 авг 2014 11:31 ] |
| Заголовок сообщения: | подключение консоли к проекту |
Здравствуйте, задался вопросом, как можно добавить консоль в проект, что бы можно было прописывать команды, а программа их выполняла. (например: вводишь"load model 1 ", программа показывала модель) но возникла сложность как именно подключить консоль или если без нее как захватывать напечатанный текст при исполнении самой программы. (например: нажав на кнопку "Q" программа начинает записывать в переменную текст который печатает пользователь, потом проверяет и выполняет заданную команду) если знаете напишите пожалуйста |
|
| Автор: | MagicWolf [ 15 авг 2014 09:27 ] |
| Заголовок сообщения: | Re: подключение консоли к проекту |
Бывает по принципу командной строки, бывает на основе языка программирования, например, Lua. Есть исходники Doom или Quake в сети в них есть командная строка. Можно посмотреть в книге Микроарт, Хонич, Как самому создать трехмерную игру, 1996. Смысл прост. Вводиться команда, она интерпретируется отдельной функцией, где каждой команде прописан свой код или своя функция, затем она вызывается с параметрами и вуаля. |
|
| Автор: | Nikita [ 15 авг 2014 13:15 ] |
| Заголовок сообщения: | Re: подключение консоли к проекту |
большое спасибо |
|
| Автор: | Nikita [ 18 авг 2014 17:08 ] |
| Заголовок сообщения: | Re: подключение консоли к проекту |
у меня получилось подключить консоль и через нее посылать команды в программу. но через консоль неудобно хочу попробовать через саму программу, т.е. при выполнении самой программы(без консоли) можно было задавать ей команды (Например: нажав на определенную кнопку программа переключается на захват печатающего текста, пользователь пишет команду, программа выполняет) но вот как реализовать захват печатающегося текста в переменную не знаю (единственное что нашел, что можно как-то через keyhandler ) если знаете напишите пожалуйста. |
|
| Автор: | MagicWolf [ 19 авг 2014 10:12 ] |
| Заголовок сообщения: | Re: подключение консоли к проекту |
Да, вроде не тяжело. Можно через стандартный 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 |
|
| Автор: | Nikita [ 22 авг 2014 09:31 ] |
| Заголовок сообщения: | Re: подключение консоли к проекту |
огромное спасибо
|
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|