На главную Наши проекты:
Журнал   ·   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) 1 2 [3] 4  все  ( Перейти к последнему сообщению )  
> Создание приложения Win32API с использованием диалогов
    Цитата tumanovalex @
    Однако если в последнем операторе return CALLBACK DlgProc вместо FALSE указать TRUE, программа зависает. Почему так происходит?

    Потому что возвращая TRUE ты блокируешь стандартную обработку для любых сообщений, поступающих в диалог.
    Цитата MSDN
    Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message.


    Цитата tumanovalex @
    2. Как определить хендл основного диалога для указания его в CreateDialog второго диалога?

    Его возвращает функция CreateDialog.

    Цитата tumanovalex @
    3. Попробовал размер диалога с кнопками уменьшить до размера кнопок - не получилось. Можно ли это сделать? А то размер второго диалога, гораздо больший размера кнопок, может наложиться на другие контролы основного диалога.

    Диалог может быть любого размера. Даже нулевого. Но не стоит так делать. Что и где не получилось в плане размера?

    Цитата ЫукпШ @
    Если это действительно устойчиво работает, значит есть что-то ещё.

    VC++ 12 -> Win32 empty project

    ExpandedWrap disabled
      #include "stdafx.h"
       
      static HWND hWnd;
       
      int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPWSTR lpCmdLine, int nCmdShow)
      {
          MSG Msg;
          WNDCLASSEX WCEX = {0};
       
          WCEX.cbSize = sizeof(WNDCLASSEX);
          WCEX.lpfnWndProc = MainWndProc;
          WCEX.hInstance = hInstance;
          WCEX.hCursor = LoadCursor(NULL, IDC_ARROW);
          WCEX.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
          WCEX.lpszClassName = L"MyWndClass";
       
          if(!RegisterClassEx(&WCEX))
              return 0;
       
          hWnd = CreateWindowEx(0, WCEX.lpszClassName, NULL, WS_OVERLAPPEDWINDOW | WS_MAXIMIZE | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
              512, 512, NULL, NULL, hInstance, NULL);
              
          //message-loop
          
          return 0;
      }
      Цитата B.V. @
      VC++ 12 -> Win32 empty project

      Нет, не работает.
      VS2008 -> Win32 empty project
      ExpandedWrap disabled
        // --------------------------------------------------------------------------
        #include "stdafx.h"
        //#include <mmsystem.h>
        //#include <commctrl.h>
        // --------------------------------------------------------------------------
        //#pragma comment(lib,"winmm.lib")
        //#pragma comment(lib,"comctl32.lib")  
        // --------------------------------------------------------------------------
        LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
        static HWND hWnd;
        // --------------------------------------------------------------------------
        int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR , int iCmdShow)
        {
            MSG Msg;
            WNDCLASSEX WCEX = {0};
         
            WCEX.cbSize = sizeof(WNDCLASSEX);
            WCEX.lpfnWndProc = WndProc;
            WCEX.hInstance = hInstance;
            WCEX.hCursor = LoadCursor(NULL, IDC_ARROW);
            WCEX.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
            WCEX.lpszClassName = L"MyWndClass";
         
            if(!RegisterClassEx(&WCEX))
                return 0;
         
            hWnd = CreateWindowEx(0, WCEX.lpszClassName, NULL, WS_OVERLAPPEDWINDOW | WS_MAXIMIZE | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
                512, 512, NULL, NULL, hInstance, NULL);
         
         
             while(::GetMessage (&Msg, NULL, 0, 0))
             {
              ::TranslateMessage (&Msg) ;
              ::DispatchMessage (&Msg) ;
             }
             return Msg.wParam ;
        }
        // --------------------------------------------------------------------------
        LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
        {
             HDC         hdc ;
             PAINTSTRUCT ps ;
             RECT        rect ;
         
             switch (iMsg)
             {
              case WM_CREATE :
        //               ::PlaySound (_T("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
         
        //        ::EnumSystemCodePages((CODEPAGE_ENUMPROC)EnumCodePagesProc, CP_INSTALLED);
        //               ::EnumSystemCodePages((CODEPAGE_ENUMPROC)EnumCodePagesProc, CP_SUPPORTED);
              return 0 ;
         
        //      case WM_ERASEBKGND:  return 0;
         
              case WM_PAINT :
                       hdc = ::BeginPaint (hwnd, &ps) ;
         
                       ::GetClientRect (hwnd, &rect) ;
         
                       ::DrawText (hdc, _T("Hello, Windows 95!"), -1, &rect,
                                 DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
         
                       ::EndPaint (hwnd, &ps) ;
              return 0;
         
              case WM_DESTROY:  ::PostQuitMessage (0);  return 0;
             }
         
             return ::DefWindowProc (hwnd, iMsg, wParam, lParam) ;
        }
        // --------------------------------------------------------------------------

      Прикреплённая картинка
      Прикреплённая картинка
      Сообщение отредактировано: ЫукпШ -
        Цитата ЫукпШ @
        Нет, не работает.
        VS2008 -> Win32 empty project

        Windows XP? Не исключаю, что проблема может быть в ней. Ибо у меня вот: https://snag.gy/1UbQJW.jpg
          Спасибо за ответ.
          1. По поводу хендла. Я использую для основного диалога:
          ExpandedWrap disabled
            INT_PTR ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
          Как используя DialogBox получить хендл - я не понял. Мне нужно заменить DialogBox на CreateDialog?
          2. По размеру диалога. В редакторе ресурсов я тянул края диалога за квадратики. Активны были только черные квадратики, но при уменьшении размеров диалога или исчезала кнопка, или кнопки сужались. Посмотрите, пожалуйста, прикрепленный выше проект, там есть второй диалог без рамки диалога.
            Цитата B.V. @
            Windows XP? Не исключаю, что проблема может быть в ней. Ибо у меня вот: https://snag.gy/1UbQJW.jpg

            дело в среде VS :D
            попробуй запустить экзешник не из среды.

            Добавлено
            Цитата tumanovalex @
            1. По поводу хендла. Я использую для основного диалога:
            ExpandedWrap disabled
              INT_PTR ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
            Как используя DialogBox получить хендл - я не понял. Мне нужно заменить DialogBox на CreateDialog?

            Через DialogBox нельзя получить хендл окна, а зачем этот хендл если окно модальное :D
            Сообщение отредактировано: Cfon -
              Цитата tumanovalex @
              Как используя DialogBox получить хендл - я не понял. Мне нужно заменить DialogBox на CreateDialog?

              Да. И добавить цикл обработки сообщений ниже создания диалогов. Вместе с IsDialogMessage.

              Цитата tumanovalex @
              но при уменьшении размеров диалога или исчезала кнопка, или кнопки сужались

              Ах, вот ты про что. Так это фича студийного конструктора, помогающая позиционировать элементы на клиентской области. Нажми Ctrl+G и она тебе не будет никак мешать задавать положение и размеры. Либо просто растяни пунктирный контур на весь диалог, эффект будет аналогичным

              Цитата Cfon @
              дело в среде VS

              Дело, скорее, в ShowWindow после CreateProcess у Проводника. Аналогичный запуск из под командной строки не вызывает проблем..
                Цитата B.V. @
                Дело, скорее, в ShowWindow после CreateProcess у Проводника. Аналогичный запуск из под командной строки не вызывает проблем..

                точно так :yes:
                  Цитата B.V. @
                  Цитата ЫукпШ @
                  Нет, не работает.
                  VS2008 -> Win32 empty project

                  Windows XP? Не исключаю, что проблема может быть в ней.

                  Увы, это не так.
                  Проверял и компиляцию и выполнение на XP SP2,SP3, WIN7.
                  (все x86)
                  Под Вистой собрать не могу, но выполняется также.
                  (x86,x64). Сборки приложения x86, x64.
                  Под WIN8 я тоже проверить могу, и, вероятно, под WIN98.
                  (Только придётся собрать проект VS2005-ой.)
                  Нутром чую, что это незачем.

                  Добавлено
                  Цитата B.V. @
                  Ибо у меня вот: https://snag.gy/1UbQJW.jpg

                  Не вижу окна тестовой программы...
                  Покажи окошко. А такой вариант я уже видел - стиль правильный,
                  а окошко не развернулось.
                  Это я подразумевал под словами "мерзко глючит".

                  Добавлено
                  Цитата B.V. @
                  Аналогичный запуск из под командной строки не вызывает проблем..

                  Да. Это я забыл сделать.
                  Если из командной строки - развернётся. Но на это рассчитывать не хотелось бы.
                  ---
                  Всем спасибо, обсуждение оказалось для меня очень полезным.
                  Теперь стало понятно, для надёжного восстановления размеров
                  и расположения главного окна на скрине, необходимо вызвать
                  "ShowWindow" не менее 2-х раз.
                  Сообщение отредактировано: ЫукпШ -
                    Второй диалог уменьшить удалось, хендл первого диалог получил. Код получился такой:
                    ExpandedWrap disabled
                      #include <windows.h>
                      #include "resource.h"
                       
                      BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
                      BOOL CALLBACK DlgProc2(HWND, UINT, WPARAM, LPARAM);
                       
                      int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
                      {
                        HWND hwnd  = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
                        HWND hwnd2 = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hwnd, (DLGPROC)DlgProc2);
                        return 0;
                      }
                       
                      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,0);
                            break;
                        }
                        return FALSE;
                      }
                       
                      BOOL CALLBACK DlgProc2(HWND hwnd2, UINT msg, WPARAM wParam, LPARAM lParam)
                      {
                        switch (msg)
                        {
                          case WM_INITDIALOG:
                            ShowWindow(hwnd2, SW_NORMAL);
                            break;
                          case WM_COMMAND:
                          {
                            switch (LOWORD(wParam))
                            {
                              case ID_OK:
                                EndDialog(hwnd2,1);
                                break;
                              case ID_CANCEL:
                                EndDialog(hwnd2,0);
                                break;
                            }
                            break;
                          }
                          case WM_CLOSE:
                            EndDialog(hwnd2,0);
                            break;
                        }
                        return FALSE;
                      }
                    Как дальше обрабатывать сообщения от этих диалогов и как расположить второй диалог в правом нижнем углу первого диалога - я не знаю. Может быть есть пример с диалогом, размещенным на другом диалоге? Проект прикрепил
                    Прикреплённый файлПрикреплённый файлWin32dialog_02.zip (3,64 Кбайт, скачиваний: 86)
                      Цитата tumanovalex @
                      Как дальше обрабатывать сообщения от этих диалогов и как расположить второй диалог в правом нижнем углу первого диалога - я не знаю. Может быть есть пример с диалогом, размещенным на другом диалоге?

                      коллега :D
                      может откроешь книгу по winapi? например есть хорошая книжка "win32 api разработка приложений для Windows" автор Юрий Щупак , 2008 года издание.
                      там есть отдельная глава посвящённая диалоговым окнам.
                        К сожалению, этой книги нигде в продаже нет. На торрентах тоже не нашел. А те книги по Win32API, которые я смотрел, не содержат информации об управлении диалоговыми окнами.

                        Добавлено
                        У меня есть книга Румянцева "Азбука программирования на Win32", но в ней я информации об управлении диалогом в диалоге я не нашел.
                        Сообщение отредактировано: tumanovalex -
                          Цитата tumanovalex @
                          На торрентах тоже не нашел.

                          Если ты воспользуешься яндексом и будешь просто искать
                          стороку :
                          "win32 api разработка приложений для Windows" автор Юрий Щупак
                          книга найдётся почти сразу.
                          ---
                          Что-то надо делать и самому, иначе точно ничего не получится.
                          Сообщение отредактировано: ЫукпШ -
                            Спасибо, нашел. Буду изучать.
                              Наконец-то удалось вывести на экран основной диалог и кнопки:
                              ExpandedWrap disabled
                                #include <windows.h>
                                #include "resource.h"
                                 
                                HWND hwnd, hwndBtn;
                                 
                                BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
                                BOOL CALLBACK DlgProcBtn(HWND, UINT, WPARAM, LPARAM);
                                void MoveDlg(HWND, HWND);
                                 
                                int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
                                {
                                  MSG msg;
                                  hwnd    = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
                                  hwndBtn = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hwnd, (DLGPROC)DlgProcBtn);
                                  IsDialogMessage(hwndBtn, &msg); // // Не знаю, как правильно обработать результат проверки IsDialogMessage
                                  while (GetMessage(&msg, NULL, 0, 0))  
                                  {
                                    if (!IsDialogMessage(hwndBtn, &msg))
                                    {
                                      TranslateMessage(&msg);
                                      DispatchMessage(&msg);
                                    }
                                  }
                                  return msg.wParam;
                                }
                                 
                                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,0);
                                      break;
                                  }
                                  return FALSE;
                                }
                                 
                                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 ID_OK:
                                          EndDialog(hwndBtn,1);
                                          break;
                                        case ID_CANCEL:
                                          EndDialog(hwndBtn,0);
                                          break;
                                      }
                                      break;
                                    }
                                    case WM_CLOSE:
                                      EndDialog(hwndBtn,0);
                                      break;
                                    //SendMessage; // Не знаю, как правильно послать сообщение
                                    break;
                                  }
                                  return FALSE;
                                }
                                 
                                void MoveDlg(HWND hParent, HWND hDlg)
                                {
                                  RECT rcParent, rcDlg;
                                  POINT p0;
                                  GetClientRect(hParent, &rcParent);
                                  GetWindowRect(hDlg, &rcDlg);
                                  int width = rcDlg.right - rcDlg.left;
                                  int height = rcDlg.bottom - rcDlg.top;
                                  p0.x = rcParent.right - width - 10;
                                  p0.y = rcParent.bottom - height;
                                  MoveWindow(hDlg, p0.x, p0.y, width, height, TRUE);
                                }
                              Однако основной диалог и кнопки закрываются по-отдельности и после их закрытия программа зависает. Как я понимаю, это вызвано строками, которые я пометил как "Не знаю". Помогите, пожалуйста, разобраться, как правильно посылать и обрабатывать сообщения. Проект прикрепил.
                              Прикреплённый файлПрикреплённый файлWin32dialog_03.zip (3,87 Кбайт, скачиваний: 102)
                              Сообщение отредактировано: tumanovalex -
                                Цитата tumanovalex @
                                Однако основной диалог и кнопки закрываются по-отдельности и после их закрытия программа зависает. Как я понимаю, это вызвано строками, которые я пометил как "Не знаю". Помогите, пожалуйста, разобраться, как правильно посылать и обрабатывать сообщения.

                                смотрел смотрел твой проект и ничего не понял :D
                                зачем создается два диалога? только для группировки двух кнопок? :wacko:

                                !
                                Нарушение п. 1.3 правил форума
                                Cfon, я предупреждал
                                Сообщение отредактировано: B.V. -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 2 [3] 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0528 ]   [ 20 queries used ]   [ Generated: 17.05.24, 04:32 GMT ]