Создание немодальных диалогов

Тема в разделе "WASM.WIN32", создана пользователем _220, 30 май 2008.

  1. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    В общем захотелось мне прикрутить в прогу диалог поиска. Нарисовал я диалог, задал стиль как DS_CENTER|WS_CHILD | WS_CAPTION|WS_SYSMENU, вызвал CreateDialog, опосля сделал ShowWindow. На первый взгляд все работает. Но есть 2 непонятки.
    1: После этого я нарисовал RichEdit контрол на всю клиентскую область, теперь он хавает все сообщения в своей области и ничего не оставляет диалогу. Вообще диалог косячится, стоит только что-нибудь напечатать в richedit'е (перерисовывается только если свернуть-развернуть). Я попробовал исправить положение с помощью SetWindowPos, richedit запихал в Bottom, диалог в Topmost, не помогло.
    2: Даже без richedit'а заголовок диалога всегда серый, нельзя сделать его выделяемым? (он никогда не выделяется вообще)

    richedit и диалог оба дочерние по отношению к главному. Если сделать дилог дочерним к richedit'у, то диалог можно нормально таскать по экрану (в границах edit'а) и он нормально рисуется, но кнопочки-флажки все равно не
    нажимаются.

    на всякий случай приведу цикл сообщений
    StartLoop:
    xor eax,eax
    invoke GetMessage,addr msg,eax,eax,eax
    test eax,eax
    jz ExitLoop
    mov eax,HDlgFind
    test eax,eax
    jz @@next
    invoke IsDialogMessage, HDlgFind, addr msg
    test eax,eax
    jnz StartLoop
    @@next:
    invoke TranslateMessage, ADDR msg
    invoke DispatchMessage, ADDR msg
    jmp StartLoop
    ExitLoop:

    может быть дело в стиле edit'а, создаю так:

    invoke CreateWindowEx, 0, addr RichEditClass,NULL,\
    WS_VISIBLE or ES_MULTILINE or WS_CHILD or WS_VSCROLL or ES_READONLY, \
    50, 50, 300, 300, hWnd, RichEditID, hInstance, 0
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    _220
    Как создается диалог?
    Лучше весь код привести
     
  3. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    ok. Приложид код. Еще вот описание диалога

    700 DIALOG DISCARDABLE 0, 0, 200, 62
    STYLE 1086851072 (==DS_CENTER | WS_CHILD | WS_CAPTION | WS_SYSMENU)
    CAPTION "Найти..."
    FONT 8, "MS Sans Serif"
    BEGIN
    EDITTEXT 4000,7,7,118,12
    CONTROL "вверх",4001,"Button",4105,7,25,59,12
    CONTROL "вниз",4002,"Button",4105,66,25,59,12
    PUSHBUTTON "Найти далее",4003,135,7,58,12
    PUSHBUTTON "Найти все",4004,135,25,58,12
    PUSHBUTTON "Отмена",4005,135,43,58,12
    CONTROL "весь текст",4006,"Button",3,68,41,57,14
    CONTROL "регистр",4007,"Button",3,7,41,57,14
    END
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Используй DialogBoxParam и будет тебе счастье
    Почему именно немодальный диалог нужен?
     
  5. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    DialogBoxParam для модальных диалогов
    Немодальный нужен, т.к. диалог для поиска, охота чтобы юзер мог переключаться между окном поиска и едитом, как в любом нормальном редакторе (то же блокнот).

    Можно еще сделать модальный диалог сам по себе (parent = null), работает хорошо, но в такм случае появляется еще одно окно на панели задач, да и вообще очень неудобно работать.

    Неужели никто не делал немодальных диалогов?
    Мне кажется что ошибка где-то в сообщениях, может я что-то не обрабатываю или не так извлекаю сообщения. Еще глюк может быть в стилях окна richedit'а и диалога, может главного окна.

    Немного подумал, едит и диалог оба дочерние, для диалога я что-то написал в цикле сообщений, а для едита нет, может это тут глюк? Вообще разъясните пожалуйста, чем отличается процесс сообщений для немодальных диалогов
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    _220
    Понятно. Тогда если поиск стандартный, можно использовать FindText из comdlg32.dll
    Если все же хочется свой, по моему не надо WS_CHILD и надо WS_POPUP