можно ли изменить стиль combobox ?

Тема в разделе "WASM.WIN32", создана пользователем Castor, 24 сен 2004.

  1. Castor

    Castor New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    10
    Адрес:
    Russia
    Подскажите пожалуйста, как сделать чтобы, допустим, в соответствии с выбранным пунктом меню combobox либо позволял вводить данные(как edit), либо нет(как простой список). Может каким сообщением или что-то в этом роде?
     
  2. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    Castor

    Нужно послать EM_SETREADONLY Edit-у ComboBox-а:


    Код (Text):
    1.     HWND hEdit = FindWindowEx(hCombo, NULL, "Edit", NULL);
    2.     if(hEdit)
    3.         SendMessage(hEdit, EM_SETREADONLY, 1, 0);
    тогда ComboBox будет read-only, а чтобы это свойство снять -
    Код (Text):
    1.     SendMessage(hEdit, EM_SETREADONLY, 0, 0);
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Открой WinApi, там еще много чего интересного пишут...
     
  4. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Поднимаю эту старую тему, т.к. для меня вопрос так и не решён.
    Метод,который предложил vinnie_pooh,для меня не подходит.
    Я пробовал изменять флаги ComboBox'а следующим образом:
    Код (Text):
    1. mov     dwFlagsMask, 0FFFFFFFFh
    2. xor     dwFlagsMask, CBS_DROPDOWN
    3. invoke  GetWindowLong, hCombo, GWL_STYLE
    4. and     eax, dwFlagsMask
    5. or      eax, CBS_DROPDOWNLIST
    6. invoke  SetWindowLong, hCombo, GWL_STYLE, eax
    7.  
    8. invoke  SetWindowPos, hCombo, 0, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE + WP_NOZORDER + SWP_FRAMECHANGED
    9.  
    10. invoke  UpdateWindow, hCombo
    Факт в том,что это всё не работает как положено.Флаги меняются -- это можно посмотреть Spy++ -- но сам контрол остаётся таким же, т.е. словно бы ничего и не менялось.

    Поэтому вопрос: есть ли возможность изменить флаги Combobox на лету?
     
  5. a1ss

    a1ss New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    120
    UpdateWindow не помогает?
     
  6. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    В архиве 2 примера, надеюсь это тебе поможет.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    не все свойства можно менять через SetWindowLong.
    некоторые устанавливаются при создании контрола и не меняются никаким образом.
    как выход - пересоздать контрол с требуемыми свойствами
     
  8. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Flasher, спасибо за исходники.Буду смотреть и извлекать полезное =)
    cresta, похоже, что так и есть.Самый походу простой вариант в данном случае -- это создать два контрола с разными стилями на одном месте и в зависимости от нужд прятать один и показывать другой.
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    DillerInc
    В том, что флаги на лету изменить запросто, вы и сами ведь убедились :)
    Так что на самом деле вас интересует возможность изменить на лету функциональность, верно? А знаете - можно.
    Чем отличается комбобокс с CBS_DROPDOWN от комбобокса с CBS_DROPDOWNLIST "физически"? Тем, что у второго нет дочернего Edit-а.
    Ну, так если убьёте этот Edit - пол-дела будет сделано: функционально CBS_DROPDOWN скукожится до CBS_DROPDOWNLIST.
    Правда, в обратном направлениии лететь уже не так легко (зато куда занимательнее): создать копию убитого Edit-а и приживить его взад. Попробуйте :)
     
  10. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    kero, хм...получается некое удаление гланд через задний проход...не думаю,что это оптимальный вариант.