На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (4) « Первая ... 2 3 [4]  все  ( Перейти к последнему сообщению )  
> Создание приложения Win32API с использованием диалогов
    Цитата tumanovalex @
    как правильно посылать и обрабатывать сообщения
    Есть подозрение, что функцию EndDialog не надо вызывать как у вас, ибо на это намекает справка:
    Цитата
    Remarks
    Dialog boxes created by the DialogBox, DialogBoxParam, DialogBoxIndirect, and DialogBoxIndirectParam functions must be destroyed using the EndDialog function. An application calls EndDialog from within the dialog box procedure; the function must not be used for any other purpose.
    а у вас диалог создаётся просто как окошко... :(

    Добавлено
    Но в том конкретном вашем примере сработает и так:
    ExpandedWrap disabled
      BOOL CALLBACK DlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
      {
        switch (msg)
        {
          case WM_INITDIALOG:
            ShowWindow( hwnd, SW_MAXIMIZE);
          break;
          case WM_CLOSE:
            EndDialog( hwnd, wParam);
            PostMessage( hwnd, WM_QUIT, wParam, lParam);
      ...
       
      BOOL CALLBACK DlgProcBtn( HWND hwndBtn, UINT msg, WPARAM wParam, LPARAM lParam)
      {
        switch( msg )
        {
          case WM_INITDIALOG:
            ShowWindow( hwndBtn, SW_NORMAL);
            MoveDlg( hwnd, hwndBtn);
            break;
          case WM_COMMAND:
          {
            switch (LOWORD(wParam))
            {
              case IDOK:
                EndDialog(hwndBtn,1);
            PostMessage(GetParent(hwndBtn),WM_CLOSE,1,0);
                return TRUE;//break;
              case IDCANCEL:
                EndDialog(hwndBtn,0);
            PostMessage(GetParent(hwndBtn),WM_CLOSE,0,0);
      ...
      [QUOTE=Cfon,1484463663,3702023]смотрел смотрел твой проект и них** не понял :D
      зачем создается два диалога? только для группировки двух кнопок? :wacko:[/QUOTE]
      На самом деле будет много контролов на основном диалоге.

      Добавлено
      [QUOTE=Славян,1484466124,3702028]Есть подозрение, что функцию EndDialog не надо вызывать как у вас, ибо на это намекает справка:[QUOTE]а у вас диалог создаётся просто как окошко... :([/QUOTE]
      Спасибо большое, сработало. А как правильно вызывать EndDialog и создавать диалог (не просто как окошко)? Как правильно в моем примере это сделать?
        Можно так попробовать:
        ExpandedWrap disabled
          int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
          {
              //MSG msg;
              //hwnd    = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
              //hwndBtn = 0;//CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hwnd, (DLGPROC)DlgProcBtn);
              return DialogBox( hInstance, MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc);
          }
          BOOL CALLBACK DlgProc( HWND lhwnd, UINT msg, WPARAM wParam, LPARAM lParam)
          {
            switch( msg )
            {
              case WM_INITDIALOG:
                  ShowWindow( hwnd = lhwnd, SW_MAXIMIZE); // говорим, что глобальная - это как локальная
                  hwndBtn = CreateDialog( NULL, MAKEINTRESOURCE(IDD_DIALOG2), lhwnd, (DLGPROC)DlgProcBtn);
              break;
              case WM_CLOSE:
                EndDialog( lhwnd, wParam);
                PostMessage(lhwnd,WM_QUIT,wParam,lParam);
           ...


        Добавлено
        Ай, WM_QUIT в данном случае даже излишне. :blush:
          Цитата tumanovalex @
          А как правильно вызывать EndDialog и создавать диалог (не просто как окошко)? Как правильно в моем примере это сделать?

          EndDialog разрушает модальное диалоговое окно, немодальное удаляется через DestroyWindow.
          Чтобы закрыть диалог из другого окна диалога надо послать пользовательское сообщение и обработать его в диал.процедуре окна владельца :D

          ExpandedWrap disabled
            BOOL CALLBACK DlgProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
            {
                switch (msg)
                {      
                case UM_CLOSEWINDOW:
                    EndDialog(hwnd,0);
                    return TRUE;
                }
                return FALSE;
            }
             
            BOOL CALLBACK DlgProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
            {  
                switch (msg)
                {
                case WM_COMMAND:
                    switch (LOWORD(wParam))
                    {
                    case IDOK:
                    case IDCANCEL:
                        SendMessage(GetParent(hwnd), UM_CLOSEWINDOW, 0, 0);
                        return TRUE;
                    }
                }
                return FALSE;
            }
          Сообщение отредактировано: Cfon -
            Спасибо за ответы. Теперь понятно.
              А когда нужно использовать IsDialogMessage, о которой упоминается в сообщении B.V.?
                Цитата tumanovalex @
                А когда нужно использовать IsDialogMessage, о которой упоминается в сообщении B.V.?

                в случае немодального окна:
                ExpandedWrap disabled
                  while(GetMessage(...))
                  {
                      if (!IsDialogMessage(...))
                      {
                           DispatchMessage(...);
                      }
                  }

                обработаное в IsDialogMessage сообщение не должно обрабатывается повторно в DispatchMessage.
                Сообщение отредактировано: Cfon -
                  Спасибо за ответ.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0497 ]   [ 16 queries used ]   [ Generated: 19.04.24, 02:53 GMT ]