Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с окном

7
20 июля 2007 года
@pixo $oft
3.4K / / 20.09.2006
Вот,создал вроде как работающее окно(наконец-то,после стольки лет ожидания:)),но есть кое-какие вопросы:
1)обязательно ли каждый раз при обработке WM_Paint получать DC?Нельзя ли это сделать 1 раз сразу после создания окна?
2)Как сделать тексту прозрачный фон?
3)Как сменить шрифт(на Tahoma,например)?
4)Зачем надо WS_Ex_AppWindow и надо ли оно в моём случае?
5)Всегда ли LoadCursor,0,IDC_AppStarting возвращает одинаковое значение(т.е. его можно загнать в инициализацию uWCE и сэкономить несколько байт:))?
6)Обязательно ли получать hInstance и передавать его?Ведь LoadCursor прекрасно обходится без неё
7)Обязательно ли вызывать UpdateWindow?Или только она вызывает WM_Paint?
Просьба все ответы представлять на Ассемблере.Засим всё,жду ответов:rolleyes:
--------
Поступило обновление
19K
20 июля 2007 года
Rost
45 / / 05.07.2007
Цитата: @pixo $oft
Вот,создал вроде как работающее окно(наконец-то,после стольки лет ожидания:)),но есть кое-какие вопросы:
1)обязательно ли каждый раз при обработке WM_Paint получать DC?Нельзя ли это сделать 1 раз сразу после создания окна?
2)Как сделать тексту прозрачный фон?
3)Как сменить шрифт(на Tahoma,например)?
4)Зачем надо WS_Ex_AppWindow и надо ли оно в моём случае?
5)Всегда ли LoadCursor,0,IDC_AppStarting возвращает одинаковое значение(т.е. его можно загнать в инициализацию uWCE и сэкономить несколько байт:))?
6)Обязательно ли получать hInstance и передавать его?Ведь LoadCursor прекрасно обходится без неё
7)Обязательно ли вызывать UpdateWindow?Или только она вызывает WM_Paint?
Просьба все ответы представлять на Ассемблере.Засим всё,жду ответов:rolleyes:


1) Да обязательно.. Контексты в системе не бесконечные и поэтому приложение должно их освобождать когда они не востребованны
2) MSDN.. Google.. Yandex.. неужели их уже нет!?
SetBkMode(hMemDC, TRANSPARENT);
SetTextColor(hMemDC, RGB(255, 0, 255));
DrawText(hMemDC, ...);
3) Юзаем CreateFont, затем SelectObject(hMemDC, hNewFont);
4) WS_EX_APPWINDOW - кнопка на панели задач будет :)
5) Нет
6) Совместимость с 9x вроде..
7) InvalidateRect, вообще смотря для чего..
8) Может тебе сразу скомпиленный exe выслать? Потом дизасемблернешь его и все..

268
20 июля 2007 года
Михаил
587 / / 25.06.2005
dc не обязательно получать каждый раз, можно установить параметр CS_OWNDC в стилях класса, и тогда у каждого окна данного класса будет свой собственный dc, который не обязательно получать каждый раз
19K
21 июля 2007 года
Rost
45 / / 05.07.2007
Цитата: Михаил
dc не обязательно получать каждый раз, можно установить параметр CS_OWNDC в стилях класса, и тогда у каждого данного класса будет свой собственный dc, который не обязательно получать каждый раз


True :)

Сохранять контекст (кисти, шрифты..), на мой взгляд, имеет смысл только тогда, когда необходима быстрая перерисовка содержимого окна.. т.к. не будет тратиться лишнее микровремя :) на их инициализацию. В случае с OWNDC экономия еще будет в том что не нужно будет заново устанавливать для контекста все параметры (шрифт, цвет ...), т.к. в обычном случае GetDC возвращает контекст с дефолтными установками :) Поправьте если не прав (:

7
23 июля 2007 года
@pixo $oft
3.4K / / 20.09.2006
1)Нет,в смысле,если я после CreateWindowEx получу его и буду в дальнейшем использовать(т.е. в WM_Paint перерисовывать окно),то будет ли оно работать?И если я установлю CS_OwnDC,то как его потом получить?GetDC?
2)Я так и знал,что надо использовать SetBkMode:)
3)И что у CreateFont за весёлые параметры в виде 1-2 букв?
4)В смысле-кнопка на панели?Как в VB свойство окна ShowInTaskBar?
7)Чтобы исполнилось первое событие WM_Paint,вот для чего?Или сразу после CreateWindow всё заработает?У меня ведь там WS_Visible
8)Чем?Да и неудобно всё это...
268
23 июля 2007 года
Михаил
587 / / 25.06.2005
получать контекст во всех случаях одинаково, только если будет CS_OWNDC, тогда контекст можно после рисования не освобождать (ReleaseDC), можно и освобождать только вроде ReleaseDC ничего делать не будет. InvalidateRect не вызывает перерисовки, а только добавляет к перерисовываемой части некий прямоугольник
19K
26 июля 2007 года
Rost
45 / / 05.07.2007
Цитата: Михаил
InvalidateRect не вызывает перерисовки, а только добавляет к перерисовываемой части некий прямоугольник


Еще как вызывает..

 
Код:
InvalidateRect(hWnd, NULL, false);

Причем последний параметр указывает на то нужно ли стирать (читай заливать белым :)) содержимое окна, перед тек как вызывать прорисовку.
19K
26 июля 2007 года
Rost
45 / / 05.07.2007
Цитата: @pixo $oft
1)Нет,в смысле,если я после CreateWindowEx получу его и буду в дальнейшем использовать(т.е. в WM_Paint перерисовывать окно),то будет ли оно работать?И если я установлю CS_OwnDC,то как его потом получить?GetDC?
2)Я так и знал,что надо использовать SetBkMode:)
3)И что у CreateFont за весёлые параметры в виде 1-2 букв?
4)В смысле-кнопка на панели?Как в VB свойство окна ShowInTaskBar?
7)Чтобы исполнилось первое событие WM_Paint,вот для чего?Или сразу после CreateWindow всё заработает?У меня ведь там WS_Visible
8)Чем?Да и неудобно всё это...


3) А что не понятно?

Цитата:

HFONT CreateFont(
int nHeight, // height of font
int nWidth, // average character width
int nEscapement, // angle of escapement
int nOrientation, // base-line orientation angle
int fnWeight, // font weight
DWORD fdwItalic, // italic attribute option
DWORD fdwUnderline, // underline attribute option
DWORD fdwStrikeOut, // strikeout attribute option
DWORD fdwCharSet, // character set identifier
DWORD fdwOutputPrecision, // output precision
DWORD fdwClipPrecision, // clipping precision
DWORD fdwQuality, // output quality
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace // typeface name
);

Паpаметpы
nHeight: Высота шpифта (в логических единицах)
nWidth: Шиpина шpифта (в логических единицах)
nEscapement: Угол (наклона) стpоки (в десятых долях гpадуса)
nOrientation: Угол наклона оси символов (в десятых долях гpадуса)
fnWeight: Толщина шрифта :) норм, жирный и тд..
FW_DONTCARE 0
FW_THIN 100
FW_EXTRALIGHT 200
FW_ULTRALIGHT 200
FW_LIGHT 300
FW_NORMAL 400
FW_REGULAR 400
FW_MEDIUM 500
FW_SEMIBOLD 600
FW_DEMIBOLD 600
FW_BOLD 700
FW_EXTRABOLD 800
FW_ULTRABOLD 800
FW_HEAVY 900
FW_BLACK 900

fdwItalic: Куpсив?
fdwUnderline: Подчеpкнутый?
fdwStrikeOut: Перечеркнутый?
fdwCharSet: Одна из констант
ANSI_CHARSET
BALTIC_CHARSET
CHINESEBIG5_CHARSET
DEFAULT_CHARSET
EASTEUROPE_CHARSET
GB2312_CHARSET
GREEK_CHARSET
HANGUL_CHARSET
MAC_CHARSET
OEM_CHARSET
RUSSIAN_CHARSET
SHIFTJIS_CHARSET
SYMBOL_CHARSET
TURKISH_CHARSET
VIETNAMESE_CHARSET
fdwQuality: Качество прорисовки шрифта
fdwPitchAndFamily: Название шpифта


Пример

 
Код:
hFont = CreateFont(height, width, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, "Arial")

4) С VB не знаком, но по названию свойства - да :)
7) И так все заработает :) Нужно для того чтоб в ручную вызывать перерисовку окна
8) Я пошутил (:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог