Возможно ли такое? И как это организовать
Smile, там есть каретка, ей можно управлять.
Ну, а если хочется работать ещё и с мышью то вот (http://forum.sources.ru/index.php?showtopic=287313)
http://www.break-people.ru/cmsmade/index.php?page=coding_mouse_console
вот)))
Smile, любопытно. Особенно #include<dos.h>, впрочем файл то нашёлся, а вот 'REGPACK' : undeclared identifier так что не для всех компиляторов ИМХО.
P.S.
IDE - Microsoft Visual C++ 2008 Express Edition
Ну я ее не использую так как мой колледж отстает в развитии. Попробуй библиотеку dos.h c Turbo C.
Smile спасибо, доступ к Turbo C есть.
А замена dos.h врятле позволит скомпилировать без ошибок предложенный код, ибо компиляторы слишком разные.
Там даже указанно, что б не пробовали применять код в более новых компиляторах от Борланд, куда уж там от MS.
Ну, а для MSVC будем примерно так
http://s46.radikal.ru/i112/0911/bf/7e66c737cae8.png
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK ConsoleFunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_MOUSEMOVE:
POINT curPoint = {0};
GetCursorPos(&curPoint);
RECT winRect = {0};
GetWindowRect(hWnd, &winRect);
CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
GetConsoleScreenBufferInfo((HANDLE)wParam, &csbi);
COORD coord = {0};
coord.X = (SHORT)(((curPoint.x - winRect.left) * csbi.dwSize.X)/650);
coord.Y = (SHORT)(((curPoint.y - winRect.top) * csbi.dwSize.Y)/325);
wchar_t Coords[25]=L"";
swprintf(Coords, 25, L"%i %i (MAX = {%i %i})", coord.X, coord.Y, csbi.dwSize.X, csbi.dwSize.Y);
SetConsoleTitle(Coords);
//wprintf(L"%i %i", coord.X, coord.Y);
//wprintf(L"\b\b\b\b\b\b");
coord.Y -= 100;
WORD wColors = 112;
DWORD cWritten;
WriteConsoleOutputAttribute((HANDLE)wParam, &wColors, 1, coord, &cWritten);
coord.X +=1;
WriteConsoleOutputAttribute((HANDLE)wParam, &wColors, 1, coord, &cWritten);
break;
}
return 0;
}
int main(int argc, wchar_t *argv[])
{
HWND hWndConsole = GetConsoleWindow();
WNDPROC OldWndProc = (WNDPROC)GetWindowLongPtr(hWndConsole, GWLP_WNDPROC);
SetWindowLongPtr (hWndConsole, GWLP_WNDPROC, (LONG_PTR)ConsoleFunc);
HANDLE hStdin = GetStdHandle (STD_INPUT_HANDLE);
INPUT_RECORD inrec = {0};
DWORD cWritten;
FlushConsoleInputBuffer(hStdin);
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
do
{
ReadConsoleInput(hStdin, &inrec, 1, &cWritten);
CallWindowProc (ConsoleFunc, hWndConsole, WM_MOUSEMOVE, (WPARAM)hStdout, 0L);
}
while(inrec.Event.KeyEvent.wVirtualKeyCode != VK_ESCAPE);
SetWindowLongPtr(hWndConsole, GWLP_WNDPROC, (LONG_PTR)OldWndProc);
return 0;
}По непонятной причине по вертикале нужно выравнивание coord.Y -= 100;, что бы хотя бы увидеть курсор, когда мышь на середине консольного окна. При этом чувствительность слишком большая: курсор уходит за пределы окна при незначительных изменениях положения в вертикальной плоскости.
Значения 650 и 325 получены экспериментальным путём, обеспечивают коррекцию координат, разделяя пиксель координату на экране. Переводя, таким образом, в позицию в консольном окне, где значения по горизонтали от 0 до 80 и от 0 до 300 по вертикали.
Конкретные граничные значение уточняет функция GetConsoleScreenBufferInfo()
А может бы и получилось)))
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.