В http://www.firststeps.ru/mfc/winapi/r.php?6 написано, что сабж возможен, а нифига не рисует. Код (Text): #include <windows.h> #include <stdio.h> void main() { char c; int x, y; HWND hwnd; HDC hdc; HPEN pen; COLORREF cr1, cr2; OSVERSIONINFO v; // Ищем консольное окошко с именем GRAFCON GetVersionEx(&v); if (v.dwPlatformId==VER_PLATFORM_WIN32_NT) hwnd=FindWindow("ConsoleWindowClass","C:\grafcon.exe"); else hwnd=FindWindow("tty","GRAFCON"); if (!hwnd) printf("\nWindow not found %u", GetLastError()); // По хэндлу получаем контекст hdc=GetDC(hwnd); if (!hdc) printf("\nGet context error %u", GetLastError()); // Рисуем серенький квадратик for (x=50;x<100;x++) { for (y=50;y<100;y++) { cr1=SetPixel(hdc, x, y, RGB(128, 128, 128) ); cr2=SetPixel(hdc, 150-x, y, RGB(128, 128, 128) ); if ((cr1==-1)||(cr2==-1)) { printf("\nSetPixel error %u", GetLastError()); goto ex; } } } ex: scanf("%c", &c); ReleaseDC(hwnd, hdc); } В Win98 выдает странную ошибку "SetPixel error 0" и вообще ничего не рисует. В Win2K не находит окошка, а квадратик все-таки рисует, но на раб. столе. Ни се во ни па ни маю. Где я накосячил? Или пните туда, где эта тема обсуждалась (что-то на васме не нашел).
Консоль поддерживается на уровне ядра и не имеет отношения к GDI, поэтому рисовать в ней не получится (также, как создавать контроллы).
Консоль ядром не поддерживается! Консоль - обычное окно с обычными свойствами, просто принадлежит csrss. GetWindowDC используй, когда-то давно я это пробовал.
Ничего сложного, вот код, всё работает: Код (Text): TCHAR Str[]=_T("TestString"); TCHAR UniqueTitle[]=_T("some_unique_value"); TCHAR OldTitle[MAX_PATH]={0}; GetConsoleTitle(OldTitle, MAX_PATH); SetConsoleTitle(UniqueTitle); Sleep(200); HWND hConsWnd=FindWindow(NULL, UniqueTitle); SetConsoleTitle(OldTitle); if (hConsWnd) { HDC hDC=GetDC(hConsWnd); if (hDC) { SetTextColor(hDC, RGB(255,0,0)); TextOut(hDC, 0, 0, Str, lstrlen(Str)); MoveToEx(hDC, 0,0, NULL); LineTo(hDC, 100, 100); ReleaseDC(hConsWnd, hDC); } } MessageBox(0,_T("End"),0,0);
Ура! Спасибо roman_pro ! Вот такой вариант частично заработал: Код (Text): #include <windows.h> #include <stdio.h> void main() { char c; int x, y; HWND hwnd; HDC hdc; COLORREF cr1, cr2; OSVERSIONINFO v; // Принудительно называем окно консоли "grafcon" SetConsoleTitle("grafcon"); // Ищем консольное окошко с именем grafcon v.dwOSVersionInfoSize = sizeof(v); GetVersionEx(&v); if (v.dwPlatformId==VER_PLATFORM_WIN32_NT) hwnd=FindWindow("ConsoleWindowClass","grafcon"); else hwnd=FindWindow("tty","grafcon"); // По хэндлу получаем контекст hdc=GetDC(hwnd); // Рисуем серенький кводратег for (x=50;x<100;x++) for (y=50;y<100;y++) { cr1=SetPixel(hdc, x, y, RGB(128, 128, 128) ); cr2=SetPixel(hdc, x, y, RGB(128, 128, 128) ); if ((cr1==-1)||(cr2==-1)) { printf("\nSetPixel error %u", GetLastError()); goto ex; } } scanf("%c", &c); ReleaseDC(hwnd, hdc); } Но только в Windows 2K и Windows XP, а в Windows 98 по прежнему ничего не получаеццо. А мне, хоть застрелись, надо, чтобы рисовалось везде. Вот здесь http://www.firststeps.ru/mfc/winapi/r.php?6 же явно Маздай 98. Чего там автор с пером мутил? Это очепятка что ли, должно было быть CreatePen?
Урррра!!! Все заработало!!! Оказываеццо, Windows NT, 2000, XP пофигу, а Windows 95, 98, ME надо именно GetWindowDC, а не GetDC !!! Вот финальный, работающий везде вариант: Код (Text): // Рисование в окне консоли #include <windows.h> #include <stdio.h> void main() { char c; int x, y; HWND hwnd; HDC hdc; OSVERSIONINFO v; // Принудительно называем окно консоли "grafcon" SetConsoleTitle("grafcon"); // Ищем консольное окошко с именем grafcon v.dwOSVersionInfoSize = sizeof(v); GetVersionEx(&v); if (v.dwPlatformId==VER_PLATFORM_WIN32_NT) hwnd=FindWindow("ConsoleWindowClass","grafcon"); else hwnd=FindWindow("tty","grafcon"); // По хэндлу получаем контекст // hdc=GetDC(hwnd); hdc=GetWindowDC(hwnd); // Рисуем квадратик for (x=50;x<100;x++) for (y=50;y<100;y++) SetPixel(hdc, x, y, RGB(128, 128, 128) ); scanf("%c", &c); ReleaseDC(hwnd, hdc); }