Win API

Тема в разделе "WASM.BEGINNERS", создана пользователем Mark, 30 дек 2011.

  1. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    Я чет не могу догадаться: А как с помощью TextOut вывести значение int? Пробовал + 48 - не помогает. Выводит символ с кодом 5 (если например значение int == 5)
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Mark
    Число (int или double) надо сначала превратить в строку и затем вывести строку:
    Код (Text):
    1. CHAR buf [64];
    2. double val1 = 736.982382;
    3. int val2 = 48;
    4.  
    5. int length = sprintf (buf, "DOUBLE: %f; INTEGER: %d", val1, val2);
    6. TextOut (hDC, 32, 32, buf, length);
    Вот здесь неплохо описана функция sprintf:
    http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/
     
  3. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    Спасибо.
     
  4. TonyClifton

    TonyClifton New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2011
    Сообщения:
    49
  5. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    В инете чет не нашел. Как из текстового поля взять double? Тип int брал, а вот double не знаю, и не нашел. Подскажите?
     
  6. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    GetDlgItemText+sscanf
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Mark
    Или можно вот так:
    Код (Text):
    1. CHAR    buf [16];
    2. double  value;
    3.  
    4. GetDlgItemTextA (hDlg, id, buf, 16);
    5. value = atof (buf);
     
  8. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    Спасибо.
     
  9. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    Опять, искал в инете. Значит есть обычное окно (НЕ консоль). Как его очистить? (Т.е. чтобы все графические элементы закрасились) Ну или как залить поверх белым фоном?
     
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Mark
    Поверхность окна (в обычных случаях) красится цветом, который указан при регистрации класса окна:
    Код (Text):
    1. WNDCLASS wc;
    2. ...
    3. wc.hbrBackground = CreateSolidBrush (RGB (190, 224, 255));
    4. ...
    5. RegisterClass (&wc);
    Рисовать на поверхности окна желательно только внутри обработчика WM_PAINT.
    Фон рисовать не надо, а только элементы данных.
    Например, у тебя есть текстовые строки - рисуешь их все.
    Затем, что-то меняется - строки удалились или добавились.
    Всё, что твой код должен сделать при этом - вызвать InvalidateRect:
    Код (Text):
    1. InvalidateRect (hWnd, NULL, TRUE /* <-- this will erase background */ );
    Это наиболее простой вариант рисования.

    Есть более сложные вещи - например рисование в памяти и затем всё нарисованное
    посылаем на поверхность окна. Это сделано для увеличения скорости рисования и для
    снижения мерцания при рисовании (reduce flicker).

    Также можно запретить Windows рисовать фон и делать это в своём коде.
     
  11. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    Огромное спасибо.
     
  12. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    А потом рисовать на поверхности окна после InvalidateRect можно? А то у меня не рисует :/
     
  13. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Mark
    InvalidateRect заставляет Windows посылать WM_PAINT, поэтому не следует их смешивать.

    1. Не следует вызывать InvalidateRect внутри кода для WM_PAINT.
    2. Не следует посылать WM_PAINT самому себе, это сделает Windows после InvalidateRect.

    А что конкретно не работает?
    Кстати, можешь прислать мне код - я объясню проблемные места.

    asmguru62@hotmail.com
     
  14. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304