Рисование примитивов в диалоговом окне

Тема в разделе "WASM.BEGINNERS", создана пользователем Sawamura, 13 окт 2006.

  1. Sawamura

    Sawamura New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2006
    Сообщения:
    12
    Есть диалоговое окно с элементами управления. Необходимо создать в нем отедльную область для рисования примитивов (круг, прямоугольник и т.д.). Как это можно реализовать? Пользуюсь Masm32 + RedAsm.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Sawamura
    Отдельная область может быть контролом "static" со стилем owner-drawn, самодельным дочерним окном или просто логической областью на родительском окне. В любом случае нужно копать в сторону примитив рисования GDI.
     
  3. Sawamura

    Sawamura New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2006
    Сообщения:
    12
    А нельзя ли ссылку на русском или чуть поподробнее объяснить? В RedAsm'е такого свойства (owner-drawn) у Static'а нет :dntknw: Все равно попытался написать такой код для обработки WM_Paint:
    Код (Text):
    1.         invoke GetDlgItem, hWin, IDD_IMAGE
    2.         .if eax != NULL
    3.             mov hImage, eax
    4.         .elseif
    5.             invoke MessageBox, NULL, offset errString, NULL, MB_OK
    6.         .endif
    7.    
    8.         invoke BeginPaint, hImage, addr PS
    9.         .if eax != NULL
    10.             mov hdc, eax   
    11.         .elseif
    12.             invoke MessageBox, NULL, offset errString, NULL, MB_OK
    13.         .endif
    14.        
    15.         invoke SetBkColor, hdc, BackGr
    16.         .if eax == CLR_INVALID
    17.             invoke MessageBox, NULL, offset errString, NULL, MB_OK
    18.         .endif
    19.  
    20.         invoke EndPaint, hImage, addr PS
    21.  
    22.         invoke DefWindowProc, hWin, WM_PAINT, wParam, lParam
    , где IDD_IMAGE - статик контрол, на котором пытаюсь рисовать. Ничего не вышло. Вернее, почему-то убираются все надписи в Статике, а цвет бэкграунда не меняется. Закрашивать пытался белым, т.е. BackGr dw 0.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Sawamura
    Даже не слышал о RedAsm'e. Может RadASM?

    Это ж не делфи, надо и головой думать: Там есть "свойства" "xStyle" и "xExStyle", обозначающие dwStyle и dwStyleEx контрола. Можно задать числовое значение нужной комбинации стилей. Потом у них есть расширенный редактор стилей, а в нём SS_OWNERDRAW. Нужно просто посмотреть.

    Цвет статика устанавливается в ответ на WM_CTLCOLORSTATIC.

    А с чего ты взял, что второй параметр SetBkColor - ворд?

    Отлаживать программу мессаджбоксами - очень плохой стиль. Попробуй лучше wsprintf+OutputDebugString, поинформативнее будет.
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    И что белый - 0? :)
     
  6. Sawamura

    Sawamura New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2006
    Сообщения:
    12
    IceStudent
    Блин, я смотрел как раз в свойствах xStyle и xExStyle - там не было SS_OWNERDRAW. Или это где еще смотреть надо?
    BackGr у меня dd, я описался.

    rmn
    А можно без стеба просто поправить?
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    BeginPaint/EndPaint можно вызывать только в ответ на WM_PAINT. В твоём случае надо отвечать на WM_DRAWITEM. В статическом окне стиль нужен SS_STATIC. Когда обстановка меняется - вызывай InvalidateRect() на статическое окно.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Sawamura
    0, это чёрный, белый это 0FFFFFFh.
    Смотреть лучше в MSDN. Поправь свой файл ресурсов вручную.
     
  9. Sawamura

    Sawamura New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2006
    Сообщения:
    12
    А можно чуть поподробнее про установку бэкграунда в Статике? Нужно создать brush, выбрать его, потом послать сообщение WM_CTLCOLORSTATIC?

    И еще про дополнительные стили. Их прописывать в блокноте в файле ресурса диалогового окна? То есть, с втроку CONTROL "",IDD_IMAGE,"Static",0x50800100,110,53,290,233,0x00000000 добавить SS_OWNERDRAW ?
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Плохо смотрел.

    Там цвет нужно возвращать. Когда придут WM_CTL..., выставить нужной свой цвет. И вообще, вперёд штудировать справочник. Т.к. вопросы у тебя либо от лени, либо от незнания английского. Второе лечится, хотя бы скачиванием переведённого справочника по WinAPI. Где брать не спрашивай, сам ищи.

    Выдели статик в редакторе диалога и всё же попробуй поискать нужный стиль. Ресурсами позже займёшься..
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Нет, здесь он прав. Когда приходит WM_CTL* нужно создать кисть и вернуть ее хендл. Цвет устанавливается только для текста.
    Например:
    Код (Text):
    1. // Создаем кисть стандартного для кнопок цвета
    2. HBRUSH hBr = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
    3. ...
    4. case WM_CTLCOLORSTATIC:
    5.     // wParam - контекст
    6.     // lParam - хендл контрола
    7.     SetBkMode((HDC)wParam, TRANSPARENT); // чтобы текст выводился с прозрачным фоном
    8.     SetTextColor((HDC)wParam, RGB(0, 0, 0xff)); // синий цвет текста
    9.     return (BOOL)hBr;
     
  12. Sawamura

    Sawamura New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2006
    Сообщения:
    12
    IceStudent
    Может я и плохой программист, но все же не такой идиот, чтобы просмотрев несколько раз не найти свойство SS_OWNERDRAW. Какой ты используешь редактор ресурсов? Специально скачал ResEd 1.1.3.1 - ну нет там такого свойства у статика! Ничего не пойму :dntknw:

    rmn, спасибо за пример.
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    И IceStudent бывает не прав :))
     
  14. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Кстати, да. Не знаю как в RadAsm и ResEd, но в WinAsm ни у одного контрола нет стиля *_OWNERDRAW
    Sawamura
    Прописывай вручную в *.rc
    SS_OWNERDRAW == 0x0000000D
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Sawamura
    Тебя же посылали к MSDN? =)
    SS_OWNERDRAW equ 0Dh
    Код (Text):
    1. CONTROL "",IDD_IMAGE,"Static",[b]0x5080010D[/b],110,53,290,233,0x00000000
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    n0name
    Угу.

    rmn
    Точно, проглядел. Просто запомнилась SetBkColor, там нужен был COLORREF.

    Sawamura
    Спокойствие. Редактор ресурсов в самом RadASM'e, там я и смотрел. Зачем ResEd, если ты всё равно сам радасм используешь.

    Итак, выделяешь статик. В свойствах нажимаешь на xStyle, в конце поля появляется кнопка "...", нажимаешь её, открывается "Style manager", ищешь стиль SS_OWNERDRAW в списке на закладке "Window", выделяешь, он добавляется к свойствам (поле "DWORD: ").
    Правда, сбрасывать его потом сложнее - стиль распознаётся как SS_CENTER|SS_BLACKRECT|SS_GRAYFRAME (SS_OWNERDRAW = 0x0D = 1|4|8).