Есть диалоговое окно с элементами управления. Необходимо создать в нем отедльную область для рисования примитивов (круг, прямоугольник и т.д.). Как это можно реализовать? Пользуюсь Masm32 + RedAsm.
Sawamura Отдельная область может быть контролом "static" со стилем owner-drawn, самодельным дочерним окном или просто логической областью на родительском окне. В любом случае нужно копать в сторону примитив рисования GDI.
А нельзя ли ссылку на русском или чуть поподробнее объяснить? В RedAsm'е такого свойства (owner-drawn) у Static'а нет Все равно попытался написать такой код для обработки WM_Paint: Код (Text): invoke GetDlgItem, hWin, IDD_IMAGE .if eax != NULL mov hImage, eax .elseif invoke MessageBox, NULL, offset errString, NULL, MB_OK .endif invoke BeginPaint, hImage, addr PS .if eax != NULL mov hdc, eax .elseif invoke MessageBox, NULL, offset errString, NULL, MB_OK .endif invoke SetBkColor, hdc, BackGr .if eax == CLR_INVALID invoke MessageBox, NULL, offset errString, NULL, MB_OK .endif invoke EndPaint, hImage, addr PS invoke DefWindowProc, hWin, WM_PAINT, wParam, lParam , где IDD_IMAGE - статик контрол, на котором пытаюсь рисовать. Ничего не вышло. Вернее, почему-то убираются все надписи в Статике, а цвет бэкграунда не меняется. Закрашивать пытался белым, т.е. BackGr dw 0.
Sawamura Даже не слышал о RedAsm'e. Может RadASM? Это ж не делфи, надо и головой думать: Там есть "свойства" "xStyle" и "xExStyle", обозначающие dwStyle и dwStyleEx контрола. Можно задать числовое значение нужной комбинации стилей. Потом у них есть расширенный редактор стилей, а в нём SS_OWNERDRAW. Нужно просто посмотреть. Цвет статика устанавливается в ответ на WM_CTLCOLORSTATIC. А с чего ты взял, что второй параметр SetBkColor - ворд? Отлаживать программу мессаджбоксами - очень плохой стиль. Попробуй лучше wsprintf+OutputDebugString, поинформативнее будет.
IceStudent Блин, я смотрел как раз в свойствах xStyle и xExStyle - там не было SS_OWNERDRAW. Или это где еще смотреть надо? BackGr у меня dd, я описался. rmn А можно без стеба просто поправить?
BeginPaint/EndPaint можно вызывать только в ответ на WM_PAINT. В твоём случае надо отвечать на WM_DRAWITEM. В статическом окне стиль нужен SS_STATIC. Когда обстановка меняется - вызывай InvalidateRect() на статическое окно.
Sawamura 0, это чёрный, белый это 0FFFFFFh. Смотреть лучше в MSDN. Поправь свой файл ресурсов вручную.
А можно чуть поподробнее про установку бэкграунда в Статике? Нужно создать brush, выбрать его, потом послать сообщение WM_CTLCOLORSTATIC? И еще про дополнительные стили. Их прописывать в блокноте в файле ресурса диалогового окна? То есть, с втроку CONTROL "",IDD_IMAGE,"Static",0x50800100,110,53,290,233,0x00000000 добавить SS_OWNERDRAW ?
Плохо смотрел. Там цвет нужно возвращать. Когда придут WM_CTL..., выставить нужной свой цвет. И вообще, вперёд штудировать справочник. Т.к. вопросы у тебя либо от лени, либо от незнания английского. Второе лечится, хотя бы скачиванием переведённого справочника по WinAPI. Где брать не спрашивай, сам ищи. Выдели статик в редакторе диалога и всё же попробуй поискать нужный стиль. Ресурсами позже займёшься..
Нет, здесь он прав. Когда приходит WM_CTL* нужно создать кисть и вернуть ее хендл. Цвет устанавливается только для текста. Например: Код (Text): // Создаем кисть стандартного для кнопок цвета HBRUSH hBr = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); ... case WM_CTLCOLORSTATIC: // wParam - контекст // lParam - хендл контрола SetBkMode((HDC)wParam, TRANSPARENT); // чтобы текст выводился с прозрачным фоном SetTextColor((HDC)wParam, RGB(0, 0, 0xff)); // синий цвет текста return (BOOL)hBr;
IceStudent Может я и плохой программист, но все же не такой идиот, чтобы просмотрев несколько раз не найти свойство SS_OWNERDRAW. Какой ты используешь редактор ресурсов? Специально скачал ResEd 1.1.3.1 - ну нет там такого свойства у статика! Ничего не пойму rmn, спасибо за пример.
Кстати, да. Не знаю как в RadAsm и ResEd, но в WinAsm ни у одного контрола нет стиля *_OWNERDRAW Sawamura Прописывай вручную в *.rc SS_OWNERDRAW == 0x0000000D
Sawamura Тебя же посылали к MSDN? =) SS_OWNERDRAW equ 0Dh Код (Text): CONTROL "",IDD_IMAGE,"Static",[b]0x5080010D[/b],110,53,290,233,0x00000000
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).