Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / куда делась надпись / 10 сообщений из 10, страница 1 из 1
10.11.2007, 19:15:46
    #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
10.11.2007, 19:17:41
    #34930185
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
куда делась надпись
Cerebrum...него нет текста...
...
Рейтинг: 0 / 0
10.11.2007, 20:27:47
    #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
10.11.2007, 20:50:27
    #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
10.11.2007, 22:21:48
    #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
10.11.2007, 23:13:19
    #34930315
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
куда делась надпись
заработало, большущее спасибо!!

и в самом деле интересно какие же из сообщений нужно возвращать в DefWindowProc, ведь в MSDN написано, что WM_NCCREATE должна возвратить TRUE или FALSE, кому верить?
...
Рейтинг: 0 / 0
11.11.2007, 13:13:33
    #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
11.11.2007, 15:01:32
    #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
11.11.2007, 16:32:06
    #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
11.11.2007, 18:28:01
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / куда делась надпись / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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