На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Создание диалога
    Как создать Dialog при помощи WinAPI (без использования файлов ресурсов).
    Поделитесь кодом плз. Спасибо.
        B.V.
        Мне надо с использованием ф-ции

        ExpandedWrap disabled
          int DialogBoxIndirect(
              HINSTANCE hInstance,    // handle to application instance
              LPDLGTEMPLATE lpTemplate,   // identifies dialog box template
              HWND hWndParent,            // handle to owner window
              DLGPROC lpDialogFunc    // pointer to dialog box procedure  
             );
        Сообщение отредактировано: zanneo -
          Так там и написано как создавать. В чем проблема?
            CreateDialogIndirect с DLGTEMPLATEEX. Либо пиши стиль руками, в переменной...
              B.V.
              Можно небольшой пример как реализовать CreateDialogIndirect с DLGTEMPLATEEX?
                Цитата zanneo @
                Можно небольшой пример как реализовать CreateDialogIndirect с DLGTEMPLATEEX?

                http://msdn.microsoft.com/msdnmag/issues/05/08/CAtWork/
                http://support.microsoft.com/kb/155257
                  Цитата zanneo, 28.02.2007, 1:49:53, 1467837
                  Можно небольшой пример как реализовать CreateDialogIndirect с DLGTEMPLATEEX?

                  только я пока не врубился как контролы приатачить к "ресурсу",создал в WM_INITDIALOG
                  ExpandedWrap disabled
                    #include <windows.h>
                     
                    INT_PTR CALLBACK DialogProc(HWND hwndDlg,
                        UINT uMsg,
                        WPARAM wParam,
                        LPARAM lParam
                    );
                     
                    DLGTEMPLATE* pDlgTemp;
                    HGLOBAL hGlobal;
                     
                    int APIENTRY WinMain(HINSTANCE hInstance,
                                         HINSTANCE hPrevInstance,
                                         LPTSTR    lpCmdLine,
                                         int       nCmdShow)
                    {
                        hGlobal= ::GlobalAlloc(GMEM_ZEROINIT, 1024);
                        pDlgTemp = (DLGTEMPLATE*)::GlobalLock(hGlobal);
                        //=====================создаем диалог=============
                        pDlgTemp->style=WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION|WS_VISIBLE;
                        pDlgTemp->dwExtendedStyle=0;
                        pDlgTemp->cdit=0;
                        pDlgTemp->x=100;
                        pDlgTemp->y=100;
                        pDlgTemp->cx=100;
                        pDlgTemp->cy=100;
                        LPWORD lpw = (LPWORD) (pDlgTemp + 1);
                        *lpw++=0;//меню отсутствует
                        *lpw++=0;//класс по умолчанию
                        LPWSTR szCaption = (LPWSTR) lpw;
                        int nChar=1+MultiByteToWideChar (CP_ACP, 0, "Dialog", -1, szCaption, 50);
                        lpw+=nChar;
                        ::GlobalUnlock(hGlobal);
                        INT_PTR ret=DialogBoxIndirect(hInstance,pDlgTemp,NULL,DialogProc);
                        ::GlobalFree(hGlobal);
                        return 0;
                    }
                     
                    INT_PTR CALLBACK DialogProc(HWND hwndDlg,
                        UINT uMsg,
                        WPARAM wParam,
                        LPARAM lParam
                    )
                    {
                        switch(uMsg)
                        {
                        case WM_INITDIALOG:
                            {
                                ::CreateWindow("BUTTON","Ok",WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                                    140,10,50,25,hwndDlg,(HMENU)IDOK,::GetModuleHandle(NULL),0);
                                ::CreateWindow("BUTTON","Cancel",WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                                    140,40,50,25,hwndDlg,(HMENU)IDCANCEL,::GetModuleHandle(NULL),0);
                                break;
                            }
                        case WM_COMMAND:
                            {
                                switch(LOWORD(wParam))
                                {
                                case IDOK:
                                    {
                                        ::EndDialog(hwndDlg,0);
                                        break;
                                    }
                                case IDCANCEL:
                                    {
                                        ::EndDialog(hwndDlg,0);
                                        break;
                                    }
                                    break;
                                }
                            }
                     
                        }
                        return 0;
                    };

                  ЗЫ:в МСДН есть более подробный пример :yes: ,только у меня не работает <_<

                  Добавлено
                  а DOCERR: Incorrect DialogBoxIndirect() Code in Win32 SDK Docs даже исправлено, только я не пробовал
                  Сообщение отредактировано: ElcnU -
                    Цитата ElcnU @
                    только я пока не врубился как контролы приатачить к "ресурсу"

                    Они в хвостик следом за шаблоном самого диалога дописываются в тот же буфер.
                      Цитата Hryak, 28.02.2007, 8:51:11, 1467969
                      Они в хвостик следом за шаблоном самого диалога дописываются в тот же буфер.

                      да так и делал, только в МСДН таким образом делают
                      Цитата http://support.microsoft.com/kb/140725
                      ExpandedWrap disabled
                              /*
                                 Helper routine.  Take an input pointer, return closest
                                 pointer that is aligned on a DWORD (4 byte) boundary.
                              */
                              LPWORD lpwAlign ( LPWORD lpIn)
                              {
                                 ULONG ul;
                         
                                 ul = (ULONG) lpIn;
                                 ul +=3;
                                 ul >>=2;
                                 ul <<=2;
                                 return (LPWORD) ul;
                              }

                      и тоже не сработало
                        Цитата ElcnU @
                        да так и делал, только в МСДН таким образом делают и тоже не сработало

                        Возможно, дело вот в этой твоей строке:
                        Цитата
                        ExpandedWrap disabled
                          int nChar=1+MultiByteToWideChar (CP_ACP, 0, "Dialog", -1, szCaption, 50);
                        а именно - в +1 - здесь появляется лишний символ. Вот небольшая доработка твоего кода, чтобы создавать контролы из шаблонов:

                        ExpandedWrap disabled
                          #define BUTTON_CLASS_ORDINAL 0x0080
                          WORD* MakeControl(WORD* buf, DLGITEMTEMPLATE* pTempl, WORD classOrdinal, const wchar_t* name)
                          {
                              buf = (WORD*)(((DWORD)buf + 3) & ~3);
                              size_t len = wcslen(name);
                              memcpy(buf, pTempl, sizeof DLGITEMTEMPLATE);
                              buf += sizeof DLGITEMTEMPLATE / sizeof WORD;
                              *buf++ = 0xFFFF;
                              *buf++ = classOrdinal;
                              memcpy(buf, name, (len+1) * sizeof(wchar_t));
                              buf += len+1; // подразумеваем для простоты, что sizeof wchar_t == sizeof WORD
                              *buf++ = 0;
                              return buf;
                          }
                           
                          int APIENTRY WinMain(HINSTANCE hInstance,
                                               HINSTANCE hPrevInstance,
                                               LPTSTR    lpCmdLine,
                                               int       nCmdShow)
                          {
                              hGlobal= ::GlobalAlloc(GMEM_ZEROINIT, 1024);
                              pDlgTemp = (DLGTEMPLATE*)::GlobalLock(hGlobal);
                              //=====================создаем диалог=============
                              pDlgTemp->style=WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION|WS_VISIBLE;
                              pDlgTemp->dwExtendedStyle=0;
                              pDlgTemp->cdit=0;
                              pDlgTemp->x=100;
                              pDlgTemp->y=100;
                              pDlgTemp->cx=100;
                              pDlgTemp->cy=100;
                              LPWORD lpw = (LPWORD) (pDlgTemp + 1);
                              *lpw++=0;//меню отсутствует
                              *lpw++=0;//класс по умолчанию
                              LPWSTR szCaption = (LPWSTR) lpw;
                              int nChar=MultiByteToWideChar (CP_ACP, 0, "Dialog", -1, szCaption, 50);
                              lpw+=nChar;
                           
                              pDlgTemp->cdit = 2;
                              DLGITEMTEMPLATE t = { 0 };
                              t.id = IDOK;
                              LONG dbux = LOWORD(GetDialogBaseUnits());
                              LONG dbuy = HIWORD(GetDialogBaseUnits());
                              t.x = MulDiv(140, 4, dbux);
                              t.y = MulDiv(10, 8, dbuy);
                              t.cx = MulDiv(50, 4, dbux);
                              t.cy = MulDiv(25, 8, dbuy);
                              t.style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
                              lpw = MakeControl(lpw, &t, BUTTON_CLASS_ORDINAL, L"Ok");
                              t.y = MulDiv(40, 8, dbuy);
                              t.id = IDCANCEL;
                              lpw = MakeControl(lpw, &t, BUTTON_CLASS_ORDINAL, L"Cancel");
                           
                              ::GlobalUnlock(hGlobal);
                              INT_PTR ret=DialogBoxIndirect(hInstance,pDlgTemp,NULL,DialogProc);
                              ::GlobalFree(hGlobal);
                              return 0;
                          }
                          всё понятно работает, только я не понял это зачем(прибавил 3 , а затем 3 в младших битах убрал,если я ничего не спутал :blink: )
                          Цитата Hryak, 28.02.2007, 10:37:28, 1468113
                          buf = (WORD*)(((DWORD)buf + 3) & ~3);
                            Цитата ElcnU @
                            (прибавил 3 , а затем 3 в младших битах убрал,если я ничего не спутал :blink: )

                            Дык, это выравнивание по DWORD...
                              Цитата Hryak, 28.02.2007, 11:01:18, 1468153
                              Дык, это выравнивание по DWORD...

                              долго доганял эту фразу,понял что там система 4х байтных полей, то есть если все 4 байта не заняты то добиваем до 4х
                                Цитата ElcnU @
                                долго доганял эту фразу

                                Ну, а приведенная тобой функция lpwAlign() то же самое делает, что и мой код.

                                Цитата
                                если все 4 байта не заняты то добиваем до 4х

                                Только наоборот: если все четыре не заняты - то ничего не добивается - указатель не смещается.
                                Сообщение отредактировано: Hryak -
                                  ага уже вкурил,только это
                                  Цитата
                                  ...=1+MultiByteToWideChar...

                                  получается мешало
                                    Всем большое спасибо за помощь! :)
                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                    0 пользователей:


                                    Рейтинг@Mail.ru
                                    [ Script execution time: 0.1104 ]   [ 16 queries used ]   [ Generated: 12.06.26, 18:46 GMT ]