Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2012, 16:08   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию Отправка TCM_SETCURSEL в SysTabControl32

Здравствуйте.
не могу разобраться с ловлей сообщения, после отправки TCM_SETCURSEL в SysTabControl32.
у табконтроле имеются две вкладки (Id 0,1) и на каждой из них лежит по кнопке - but1 и but2.
мне надо переключаться между вкладками вручную и программно (например- по таймеру и т.п.).
вручную всё работает.
но ежели отправить сообщение:
Код:
 sendmessage(<handle>,tcm_setcursel,<index>,0);
, то вкладка переключается, но компоненты (в данном случае - кнопки) не переключаются и остаются видны те, что были на вкладке, на которую я последний раз переключился вручную.
Код:
var
mhdr : pnmhdr;
n : integer;
.........
    wm_notify:
    begin
    mhdr := pnmhdr(lparam);
    if mhdr.hwndFrom = tab1 then    //tab1 - SysTabControl32
    if mhdr.code = tcn_selchange then
    begin
      n := sendmessage(tab1,tcm_getcursel,0,0);
      case n of
        0 :
        begin
          showwindow(but1,sw_show);
          showwindow(but2,sw_hide);
        end;
        1 :
        begin
          showwindow(but2,sw_show);
          showwindow(but1,sw_hide);
        end;
      end;
    end;
    end;
.............
при переключении вкладок вручную, этот код работает.
а после отправки TCM_SETCURSEL сообщение WM_NOTIFY не приходит.
собственно вопрос - как и какое сообщение принимать?

за основу взял MSDN и уже готовую программу "control spy", которую так же нашел в MSDN (ее исходников нет). Может где чего пропустил?

Последний раз редактировалось BLACK_RAIN; 20.03.2012 в 16:26. Причина: исправление
BLACK_RAIN вне форума Ответить с цитированием
Старый 21.03.2012, 00:46   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
TCM_SETCURSEL

Selects a tab in a tab control. You can send this message explicitly or by using the TabCtrl_SetCurSel macro.

TCM_SETCURSEL
wParam = (WPARAM) (int) iItem;
lParam = 0;

Parameters
iItem
Index of the tab to select.
Return Values
Returns the index of the previously selected tab if successful, or -1 otherwise.

Remarks
A tab control does not send a TCN_SELCHANGING or TCN_SELCHANGE notification message when a tab is selected using this message.
Ну не посылает она WM_NOTIFY в окно родителя.
Пошлите его сами после TCM_SETCURSEL, сформировав wParam & lParam.
EUGY вне форума Ответить с цитированием
Старый 21.03.2012, 09:36   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
Хорошо

Цитата:
Сообщение от EUGY Посмотреть сообщение
Пошлите его сами
я где-то читал, что WM_NOTIFY нельзя послать вручную используя SendMessage. По-этому, как-то об этом не подумал
Спасибо, теперь работает.
уточните еще одну деталь:
у меня Delphi 7 изначально не понимает структуру TcItem, которая используется при добавлении вкладок в SysTabControl32.
Взял из MSDN:
Цитата:
typedef struct {
UINT mask;
#if (_WIN32_IE >= 0x0300)
DWORD dwState;
DWORD dwStateMask;
#else
UINT lpReserved1;
UINT lpReserved2;
#endif
LPTSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
} TCITEM, *LPTCITEM;
Попытался переписать в Delphi:
Код:
type
  tcitem = record
  mask : uint;
{  {$IF (_WIN32_IE >= 0x0300)}
  dwState : dword;
  dwStateMask : dword;
{  {$else}
{  lpReserved1 : uint;
  lpReserved2 : uint;
  {$IFend}
  pszText : lpstr;
  cchTextMax : integer;
  iImage : integer;
  lparam : LPARAM;
end;
Закомментированные строчки выдают ошибки.
Без них работает (проверял на Windows XP sp3).
Что конкретно проверяют эти строчки и как их правильно переписать в Delphi?
Без этих строчек программа будет работать в старых версиях винды? (windows 95-2000)

Последний раз редактировалось BLACK_RAIN; 21.03.2012 в 09:40.
BLACK_RAIN вне форума Ответить с цитированием
Старый 21.03.2012, 10:28   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

На win95 не знаю, на остальных должно работать.
Это зависит, как я понимаю, от версии Comctl32.dll.
Просто с Comctl32 поставляется заголовочный файл commctrl.h
В нем помимо прочего определен макрос #define _WIN32_IE 0x0500
Значение может быть иным.
Определение структуры TCITEM учитывает версию, и если препроцессор встречает в заголовочном файле #define _WIN32_IE 0x0200, то поля dwState, dwStateMask проигнорируются и вместо них будет lpReserved1(2).
Но это справедливо для компилятора СИ, а в делфи убирайте Reserved.
И если хотите работать, учитывая старые версии, то придется проверять DllGetVersion, и если версия старая - не использовать в коде поля dwState, dwStateMask;

Последний раз редактировалось EUGY; 21.03.2012 в 10:34.
EUGY вне форума Ответить с цитированием
Старый 21.03.2012, 12:11   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

приблизительно понял.
сейчас проверил на Windows 98 - работает. Показывает версию Common controls 5.80 build 2614.
а на ХР - 5.82 build 2900.
Цитата:
Сообщение от EUGY Посмотреть сообщение
то придется проверять DllGetVersion, и если версия старая - не использовать в коде поля dwState, dwStateMask;
"старая" - начиная с какой?

Последний раз редактировалось BLACK_RAIN; 21.03.2012 в 12:37. Причина: добавление
BLACK_RAIN вне форума Ответить с цитированием
Старый 21.03.2012, 13:16   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Младше 4.71 мне за последние 10 лет не попадались.
Comctl32 поставляется в дистрибутиве с explorer-ом.
Можно косвенно судить, если стоит Microsoft® Internet Explorer 4.0 и выше, то все OK. А нет - так поставить Explorer.
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как убрать мерцания systabcontrol32 *PB* Win Api 1 19.07.2011 21:50
отправка POST CraZZy RabbIt Работа с сетью в Delphi 8 24.04.2009 16:48
Отправка почты Fo][ Работа с сетью в Delphi 1 20.01.2009 23:15
Отправка СМС. doniyor Работа с сетью в Delphi 1 12.01.2009 14:03