Детская задачка: рисование в консоли

Тема в разделе "WASM.BEGINNERS", создана пользователем iamlamer, 6 янв 2008.

  1. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    В http://www.firststeps.ru/mfc/winapi/r.php?6 написано, что сабж возможен, а нифига не рисует.

    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. void main()
    4. {
    5.    char c;
    6.    int x, y;
    7.     HWND hwnd;
    8.    HDC hdc;
    9.    HPEN pen;
    10.    COLORREF cr1, cr2;
    11.    OSVERSIONINFO v;
    12.  
    13.    // Ищем консольное окошко с именем GRAFCON
    14.    GetVersionEx(&v);
    15.    if (v.dwPlatformId==VER_PLATFORM_WIN32_NT)
    16.            hwnd=FindWindow("ConsoleWindowClass","C:\grafcon.exe");
    17.    else
    18.            hwnd=FindWindow("tty","GRAFCON");
    19.    if (!hwnd) printf("\nWindow not found %u", GetLastError());
    20.  
    21.    // По хэндлу получаем контекст
    22.    hdc=GetDC(hwnd);
    23.    if (!hdc) printf("\nGet context error %u", GetLastError());
    24.  
    25.    // Рисуем серенький квадратик
    26.    for (x=50;x<100;x++)
    27.     {
    28.      for (y=50;y<100;y++)
    29.       {
    30.        cr1=SetPixel(hdc, x, y, RGB(128, 128, 128) );
    31.        cr2=SetPixel(hdc, 150-x, y, RGB(128, 128, 128) );
    32.        if ((cr1==-1)||(cr2==-1)) { printf("\nSetPixel error %u", GetLastError()); goto ex; }
    33.       }
    34.     }
    35. ex:
    36.    scanf("%c", &c);
    37.    ReleaseDC(hwnd, hdc);
    38. }
    В Win98 выдает странную ошибку "SetPixel error 0" и вообще ничего не рисует.
    В Win2K не находит окошка, а квадратик все-таки рисует, но на раб. столе.

    Ни се во ни па ни маю. :dntknw:

    Где я накосячил?
    Или пните туда, где эта тема обсуждалась (что-то на васме не нашел).
     
  2. redsh

    redsh New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    20
    Консоль поддерживается на уровне ядра и не имеет отношения к GDI, поэтому рисовать в ней не получится (также, как создавать контроллы).
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Консоль ядром не поддерживается! Консоль - обычное окно с обычными свойствами, просто принадлежит csrss.
    GetWindowDC используй, когда-то давно я это пробовал.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не понял...
     
  5. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Ничего сложного, вот код, всё работает:
    Код (Text):
    1. TCHAR Str[]=_T("TestString");
    2.     TCHAR UniqueTitle[]=_T("some_unique_value");
    3.     TCHAR OldTitle[MAX_PATH]={0};
    4.     GetConsoleTitle(OldTitle, MAX_PATH);
    5.     SetConsoleTitle(UniqueTitle);
    6.     Sleep(200);
    7.     HWND hConsWnd=FindWindow(NULL, UniqueTitle);
    8.     SetConsoleTitle(OldTitle);
    9.     if (hConsWnd)
    10.     {
    11.        
    12.         HDC hDC=GetDC(hConsWnd);
    13.         if (hDC)
    14.         {
    15.             SetTextColor(hDC, RGB(255,0,0));
    16.             TextOut(hDC, 0, 0, Str, lstrlen(Str));
    17.             MoveToEx(hDC, 0,0, NULL);
    18.             LineTo(hDC, 100, 100);
    19.             ReleaseDC(hConsWnd, hDC);
    20.         }
    21.     }
    22.     MessageBox(0,_T("End"),0,0);
     
  6. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    Ура! Спасибо roman_pro !

    Вот такой вариант частично заработал:

    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. void main()
    5. {
    6.    char c; int x, y;
    7.    HWND hwnd;   HDC hdc;
    8.    COLORREF cr1, cr2;
    9.    OSVERSIONINFO v;
    10.  
    11.    // Принудительно называем окно консоли "grafcon"
    12.    SetConsoleTitle("grafcon");
    13.    // Ищем консольное окошко с именем grafcon
    14.    v.dwOSVersionInfoSize = sizeof(v);
    15.    GetVersionEx(&v);
    16.    if (v.dwPlatformId==VER_PLATFORM_WIN32_NT)
    17.            hwnd=FindWindow("ConsoleWindowClass","grafcon");
    18.    else
    19.           hwnd=FindWindow("tty","grafcon");
    20.    // По хэндлу получаем контекст
    21.    hdc=GetDC(hwnd);
    22.  
    23.    // Рисуем серенький кводратег
    24.    for (x=50;x<100;x++)
    25.      for (y=50;y<100;y++)
    26.       {
    27.        cr1=SetPixel(hdc, x, y, RGB(128, 128, 128) );
    28.        cr2=SetPixel(hdc, x, y, RGB(128, 128, 128) );
    29.        if ((cr1==-1)||(cr2==-1)) { printf("\nSetPixel error %u", GetLastError()); goto ex; }
    30.       }
    31.  
    32.    scanf("%c", &c);
    33.    ReleaseDC(hwnd, hdc);
    34. }
    Но только в Windows 2K и Windows XP, а в Windows 98 по прежнему ничего не получаеццо. :dntknw: А мне, хоть застрелись, надо, чтобы рисовалось везде. :dntknw:

    Вот здесь http://www.firststeps.ru/mfc/winapi/r.php?6 же явно Маздай 98. Чего там автор с пером мутил? Это очепятка что ли, должно было быть CreatePen?
     
  7. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    Урррра!!! Все заработало!!! Оказываеццо, Windows NT, 2000, XP пофигу, а Windows 95, 98, ME надо именно GetWindowDC, а не GetDC !!!

    Вот финальный, работающий везде вариант:
    Код (Text):
    1. // Рисование в окне консоли
    2. #include <windows.h>
    3. #include <stdio.h>
    4.  
    5. void main()
    6. {
    7.    char c; int x, y;
    8.     HWND hwnd; HDC hdc;
    9.    OSVERSIONINFO v;
    10.  
    11.    // Принудительно называем окно консоли "grafcon"
    12.    SetConsoleTitle("grafcon");
    13.  
    14.    // Ищем консольное окошко с именем grafcon
    15.    v.dwOSVersionInfoSize = sizeof(v);
    16.    GetVersionEx(&v);
    17.    if (v.dwPlatformId==VER_PLATFORM_WIN32_NT)
    18.     hwnd=FindWindow("ConsoleWindowClass","grafcon");
    19.    else
    20.     hwnd=FindWindow("tty","grafcon");
    21.  
    22.    // По хэндлу получаем контекст
    23.    //   hdc=GetDC(hwnd);
    24.    hdc=GetWindowDC(hwnd);
    25.  
    26.    // Рисуем квадратик
    27.    for (x=50;x<100;x++) for (y=50;y<100;y++) SetPixel(hdc, x, y, RGB(128, 128, 128) );
    28.  
    29.    scanf("%c", &c);
    30.    ReleaseDC(hwnd, hdc);
    31. }
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Я же сразу сказал.