powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / куда делась надпись
10 сообщений из 10, страница 1 из 1
куда делась надпись
    #34930180
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
win32api vs2005sp1 dll

в dll - библиотеке зарегистрил новый класс, дальше делаю на его основе SDI окно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	CREATESTRUCT cs;
	cs.lpCreateParams	= 0L;
	cs.lpszClass		= lpszClassName;
	cs.lpszName		= "Window Title";
	cs.hInstance		= hInst;
	cs.style		= dwStyle;
	cs.x			= x;
	cs.y			= y;
	cs.cx			= nWidth;
	cs.cy			= nHeight;
	cs.hMenu		= nIDorHMENU;
	cs.dwExStyle		= dwExStyle;
	cs.hwndParent		= hwndParent;
	
	if(::CreateWindowEx(cs.dwExStyle, cs.lpszClass, cs.lpszName, WS_OVERLAPPEDWINDOW, cs.x, cs.y,
				cs.cx, cs.cy, cs.hwndParent, cs.hMenu, hInst, (void*)this) == m_hWnd)
	{

у которого должен быть заголовок "Window Title". Окно прекрасно создается, все ок, кроме того, что у него текста в заголовке и значка (вместо него выводится стандартный IDI_APPLICATION), хотя на taskbar'е значек есть, но текста тоже нет.
Что не так?


Спасибо!
...
Рейтинг: 0 / 0
куда делась надпись
    #34930185
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum...него нет текста...
...
Рейтинг: 0 / 0
куда делась надпись
    #34930232
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrum wrote:
>
> у которого должен быть заголовок "Window Title". Окно прекрасно
> создается, все ок, кроме того, что у него текста в заголовке и значка
> (вместо него выводится стандартный IDI_APPLICATION), хотя на taskbar'е
> значек есть, но текста тоже нет.

Да тут вроде все в порядке. Непонятно, почему явно написано
WS_OVERLAPPEDWINDOW - видимо подразумевается cs.style? А как на самом
деле? Можно еще посмотреть на оконную функцию, на предмет правильной
обработки WM_GETTEXT, WM_CREATE, WM_NCCREATE и т.п.

Насчет иконки нужно RegisterClass смотреть - она там регистрируется.
Если WNDCLASS.hIcon == NULL, то рисуется стандартная.

Еще очень интересно выглядит
Код: plaintext
if (CreateWindowEx(...) == m_hWnd)
Я так понимаю, что m_hWnd
устанавливается WindowProc. Можно предположить, что если CreateWindowEx
отвалит рано (например - не найдет класса), вернет NULL, WindowProc не
вызовется то условие будет (NULL == NULL) - так и нужно?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
куда делась надпись
    #34930242
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДа тут вроде все в порядке. Непонятно, почему явно написано
WS_OVERLAPPEDWINDOW - видимо подразумевается cs.style? А как на самом
деле?
совершенно верно, просто я немного упростил вид, в силу того, что этот параметр я задаю не здесь, а в производном классе, но чтобы лишний раз людей не заморачивать и лишний код не постить решил вынести сразу....

авторМожно еще посмотреть на оконную функцию, на предмет правильной
обработки WM_GETTEXT, WM_CREATE, WM_NCCREATE и т.п.


да, конечно, GET_TEXT пока нет, а остальное выглядит так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
...
if (uMsg == WM_NCCREATE)
{
LPCREATESTRUCT lpc = (LPCREATESTRUCT)lParam;
lpWindow = (MyWnd*)lpc->lpCreateParams;
assert(lpWindow);
if (lpWindow->_handle() == NULL)
return lpWindow->OnNcCreate(hWnd, lpc);

/* где OnNcCreate

LRESULT MyWnd::OnNcCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
	assert(::IsWindow(hWnd));
	assert(m_hWnd == NULL);
	if (m_hWnd == NULL)
	{
		m_hWnd = hWnd;
		if (::SetProp(m_hWnd, _MYPROP___0___, (HANDLE)this)) 
			return TRUE;	
	}
	return FALSE;
}*/
....

}

....
switch (uMsg)
{
/////////////////////////////////////////////////////////////////////////////////////////////	
	case WM_CREATE:
		return lpWindow->OnCreate((LPCREATESTRUCT)lParam);
// которая вернет 0L, просто тупая пустая виртуалка для производных
....



авторНасчет иконки нужно RegisterClass смотреть - она там регистрируется.
Если WNDCLASS.hIcon == NULL, то рисуется стандартная.

ладно с ней я разбирусь это мелочи, скорее всего я действительно передал NULL


авторМожно предположить, что если CreateWindowEx
отвалит рано (например - не найдет класса), вернет NULL, WindowProc не
вызовется то условие будет (NULL == NULL) - так и нужно?

вот за это особое мерси, я пока не допер что может быть так,
... блин надо было так лажануть...
...
Рейтинг: 0 / 0
куда делась надпись
    #34930278
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrum wrote:
>
> LRESULT MyWnd::OnNcCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
> {
> assert(::IsWindow(hWnd));
> assert(m_hWnd == NULL);
> if (m_hWnd == NULL)
> {
> m_hWnd = hWnd;
> if (::SetProp(m_hWnd, _MYPROP___0___, (HANDLE)this))

Тут нужно добавить вызов
DefWindowProc(hWnd, WM_NCCREATE, 0, (LPARAM) lpCreateStruct);

> return TRUE;

Кстати, возможно и с иконкой поможет. К сожалению каких-то правил на эту
тему не встречал, поэтому по умолчанию пересылаю в DefWindowProc все
сообшения, кроме тех, в которых уверен, что пересылать *не* нужно.
Наподобие WM_PAINT, WM_CREATE, WM_CLOSE, WM_QUERYENDSESSION, и т.п.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
куда делась надпись
    #34930315
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
заработало, большущее спасибо!!

и в самом деле интересно какие же из сообщений нужно возвращать в DefWindowProc, ведь в MSDN написано, что WM_NCCREATE должна возвратить TRUE или FALSE, кому верить?
...
Рейтинг: 0 / 0
куда делась надпись
    #34930574
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
устанавливаю иконку следующим способом

Код: plaintext
1.
2.
3.
4.
5.
HICON MyWnd::SetIcon(HICON hIcon, bool bLargeIcon) const
{
	assert(m_hWnd);
	return (HICON)::SendMessage(m_hWnd, WM_SETICON, bLargeIcon ? ICON_BIG : ICON_SMALL, (LPARAM)hIcon);
}
иконка устанавливается, но с точностью до наоборот, т.е. прописываю bLargeIcon = true, ставиться маленькая, уже, честно говоря, даже не знаю у кого глюки, толи у меня, толи у microsoft... хотя первое более вероятно :)

в главном обработчике окна сообщение уходит в DefWindowProc

help!

thanks again
...
Рейтинг: 0 / 0
куда делась надпись
    #34930683
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrum wrote:
> устанавливаю иконку следующим способом
>
> HICON MyWnd::SetIcon(HICON hIcon, bool bLargeIcon) const
> {
> assert(m_hWnd);
> return (HICON)::SendMessage(m_hWnd, WM_SETICON, bLargeIcon ? ICON_BIG : ICON_SMALL, (LPARAM)hIcon);
> }
>
> иконка устанавливается, но с точностью до наоборот, т.е. прописываю
> bLargeIcon = true, ставиться маленькая, уже, честно говоря, даже не знаю
> у кого глюки, толи у меня, толи у microsoft... хотя первое более вероятно :)
>

Да вроде у MS все работает. А точно инверсное поведение? Если в
приложении отдельно не установлена маленькая иконка, то большая
используется и при переключении задач и при отрисовке окна - то есть,
если установить большую, и маленькая не установлена, то меняются обе.
Если все-таки инверсия - может хендлы иконок инвертируются? Нужно еще
проверить соответствие названия иконки и ее содержимое (например,
маленькая иконка по ошибке названа BIGICON).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
куда делась надпись
    #34930761
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teras
Да вроде у MS все работает. А точно инверсное поведение? Если в
приложении отдельно не установлена маленькая иконка, то большая
используется и при переключении задач и при отрисовке окна - то есть,
если установить большую, и маленькая не установлена, то меняются обе.
Если все-таки инверсия - может хендлы иконок инвертируются? Нужно еще
проверить соответствие названия иконки и ее содержимое (например,
маленькая иконка по ошибке названа BIGICON).
Posted via ActualForum NNTP Server 1.4
да поведение инверсное, пробовал ставить флаг bLargeIcon = true - показывает маленькую. Если иконку не грузить (имя icon1.ico, подключена в ресурсы проекта и содержит 2-е 4 битные иконки: 16х16 и 32х32) через SetIcon, то в заголовке будет IDI_APPLICATION, как и определено при регистрации класса, а в таскбаре маленькая из icon1.ico
...
Рейтинг: 0 / 0
куда делась надпись
    #34930850
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrum wrote:
>
> да поведение инверсное, пробовал ставить флаг bLargeIcon = true -
> показывает маленькую. Если иконку не грузить (имя icon1.ico, подключена
> в ресурсы проекта и содержит 2-е 4 битные иконки: 16х16 и 32х32) через
> SetIcon, то в заголовке будет IDI_APPLICATION, как и определено при
> регистрации класса, а в таскбаре маленькая из icon1.ico
>

Не знаю, не приходилось с таким сталкиваться (кроме как в дельфи, но там
отдельная песня), и добиться не удалось. Taskbar, насколько я понимаю
всегда показывает small icon, если она установлен, и big icon, если
маленькой нет. Есть одно замечание - big icon, насколько я понимаю,
предназначена для показа в списке задач, который появляется при нажатии
клавиш ALT-TAB, а не на taskbar. На как taskbar работает со всем этим на
самом деле, я информации не нашел.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / куда делась надпись
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]