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

Ваш аккаунт

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

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

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

Странности поведения CStatusBar, или призрак Перехода к первой записи?

1.6K
02 декабря 2004 года
GDragon
67 / / 11.10.2002
Всем привет.
Есть главное окошко MDI с StatusBar-ом, созданное Application Wizard-ом, есть ControlBar, на котором расположены TreeCtrl и ListCtrl. При перемещении мыши по менюшкам надпись в StatusBar-е соответственно меняется, все красиво, но вот при заходе на контролы выскакивает надпись "Переход к первой записи" (по-русски, хотя весь интерфейс программы английский). Я попытался исправить ситуацию, отслеживая HWND окна, над которым расположен курсор и подставляя соответствующее сообщение:
m_StatusBar.SetWindowText(_T("New Text"));
Переопределял для этого сперва OnNotify (но он почему-то не реагировал на ListCtrl) и потом WM_SETCURSOR. На WM_SETCURSOR все вроде работает НО странная надпись все равно время от времени проскакивает. Пробовал запустить поиск по файлам - нигде такой строки не нашел. Кто сталкивался с подобной ситуацией, объясните, откуда что приходит? И вообще откуда происходит инициализация значений StatusBar-а?
P.S. Следует добавить, что ControlBar и все, что на нем (TreeCtrl и ListCtrl) создаются в динамически подключаемой DLL. Когда это все создавалось непосредственно в EXE, StatusBar при наведении мыши молчал (что более естественно).
262
03 декабря 2004 года
Iktomy
1.2K / / 11.10.2004
Может я конечно и не прав, но ИМХО это происходит от того, что Винда у тебя русская. И соответственно все системные библиотеки, в которых и хранятся ресурсы Винды тоже содержат русские надписи. Попробуй собери на английской версии (а может и просто запустить надо только).
1.6K
03 декабря 2004 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by Iktomy
Может я конечно и не прав, но ИМХО это происходит от того, что Винда у тебя русская. И соответственно все системные библиотеки, в которых и хранятся ресурсы Винды тоже содержат русские надписи. Попробуй собери на английской версии (а может и просто запустить надо только).


Вообще-то мне без разницы, на каком языке у меня выскакивают левые сообщения, я хотел добиться того, чтобы они вообще не выскакивали. Про язык я упомянул в том плане, что эта строка берется где-то вне проекта.

262
03 декабря 2004 года
Iktomy
1.2K / / 11.10.2004
Цитата:
Originally posted by GDragon

Вообще-то мне без разницы, на каком языке у меня выскакивают левые сообщения, я хотел добиться того, чтобы они вообще не выскакивали. Про язык я упомянул в том плане, что эта строка берется где-то вне проекта.


Ну дык я и предпологаю, что она берется или из библиотек самой винды или из MFC-шных.

1.6K
03 декабря 2004 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by Iktomy

Ну дык я и предпологаю, что она берется или из библиотек самой винды или из MFC-шных.


Програл прогу Spy-ем, похоже вывод сообщений инициируют WM_SETMESSAGESTRING и WM_POPMESSAGESTRING. Разбираюсь пока с ними.

1.6K
03 декабря 2004 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by GDragon

Програл прогу Spy-ем, похоже вывод сообщений инициируют WM_SETMESSAGESTRING и WM_POPMESSAGESTRING. Разбираюсь пока с ними.


После долгих манипуляций над моей прогой со Spy-ем и тщательного ковыряния в MFC-шных сорцах удалось выяснить следующее:
1. Некоторые порождения CWnd (Control-ы и Splitter) отслеживают по таймеру присутствие на себе указателя мыши, и если обнаруживают таковое, отправляют родительскому окну WM_SETMESSAGESTRING.
2. wParam содержит ID посылающего окна, или lParam содержит LPCSTR с готовым сообщением - одно из двух, но никак не все вместе.
3. Обработчик CFrameWnd, получив ID, берет из ресурса String Table Caption к этому ID и выкидывает в StatusBar. Вот тут-то и происходили вышеописанные чудеса: от балды написанный идентификатор сплиттера, оказывается указывал у меня на злополучную строчку. Уж я не знаю, где он ее нашел.
Общий итог:
1. Перехватил в главном окне WM_SETMESSAGESTRING:
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
..................................
ON_MESSAGE(WM_SETMESSAGESTRING, OnSetMessageString)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
(хана котенку, больше ср@ть не будет :)) Осталось только добиться, чтобы в нужный момент данные читались из ресурсов DLL.
2. Нашел недокументированную, но могущую быть весьма полезной функцию
UINT _AfxGetDlgCtrlID(HWND)
Судя по названию, выдает ID по хендлу контрола. Информации по ней - ноль. Что за манера, блин, такие полезные вещи не документировать...

262
03 декабря 2004 года
Iktomy
1.2K / / 11.10.2004
Умница! И большущий молодец! Так держать и победа сама придет! И это, прошу заметить, не сарказм - все от чистого сердца. А насчет недокументированности - только что прочитал в прессе, что Рамблер индексировал всю MSDN - попробуй поищи, думаю в нете инфы мелкомягкие больше держат.
1.6K
03 декабря 2004 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by Iktomy
Умница! И большущий молодец! Так держать и победа сама придет! И это, прошу заметить, не сарказм - все от чистого сердца. А насчет недокументированности - только что прочитал в прессе, что Рамблер индексировал всю MSDN - попробуй поищи, думаю в нете инфы мелкомягкие больше держат.


Именно в Рамблере нашел три живые ссылки на один и тот же документ, но там не пояснялово, а просто пример с применением этой функции. Ну и в MFC-шных сорцах встречается, а больше - все. Да, в приципе и так ясно, что она делает.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог