Окни и диалоги
От: Аноним  
Дата: 21.02.07 07:59
Оценка:
Нужно создать главное окно из шаблона диалога
В vs создаю ресурс диалога
пишу такой код :
#include <windows.h>

#include "resource.h"

HWND mainDlg;

INT_PTR CALLBACK MainDlgProc(HWND hwndDlg,
                                UINT uMsg,
                                WPARAM wParam,
                                LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG :
            ShowWindow(hwndDlg,SW_SHOW);
            return TRUE;
        break;
        default : return FALSE;
    }
}

int CALLBACK WinMain(
                HINSTANCE hInstance,
                HINSTANCE hPrevInstance,
                LPSTR lpCmdLine,
                int nCmdShow
)
{
    mainDlg=CreateDialog(hInstance,
                            MAKEINTRESOURCE(ID_MAIN_DLG),
                            GetDesktopWindow(),
                            MainDlgProc);
    BOOL bRet;
    MSG msg;
    while((bRet=GetMessage(&msg,NULL,0,0))!=0)
    {
        if(bRet==-1)
        {
        }else
            if((!IsWindow(mainDlg))||(!IsDialogMessage(mainDlg,&msg)))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    }
    return 0;
}

окно то создается но полноценно
(закрытие, изменение размеров) не отрабатывается
можно ли создавать окна и приименять к ним шаблоны диалога?

зы
чем отличаются диалоги от окон?
зачем Билли разделил диалоги и окна?
Re: Окни и диалоги
От: Аноним  
Дата: 21.02.07 08:50
Оценка:
А>пишу такой код :

Код твой — ф топку без разбирательств даже. Руки тебе оторвать и к компьютеру не пускать!
Должно быть:

#include <windows.h>
#include "resource.h"

HWND mainDlg = NULL;

INT_PTR
CALLBACK
MainDlgProc (

  HWND hwndDlg,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam)

{
    switch (uMsg)
    {
        case WM_INITDIALOG:

            ShowWindow (hwndDlg, SW_SHOW);
            return TRUE;

        default:

            return DefDlgProc (hwndDlg, uMsg, wParam, lParam);
    }
}

int
CALLBACK
WinMain (

    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)

{
    mainDlg = CreateDialog (
        hInstance,
        MAKEINTRESOURCE (ID_MAIN_DLG),
        GetDesktopWindow (),
        MainDlgProc);

    if (! mainDlg) return 1;

    BOOL bRet;
    MSG msg;

    while ((bRet = GetMessage (&msg, NULL, 0, 0)) != 0)
    {
        if (bRet == -1)
        {
        }
        else
        {
            if (IsDialogMessage (mainDlg, &msg))
            {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
        }
    }

    return 0;
}


А> чем отличаются диалоги от окон?


Это две совершенно разные вещи. Окна — пассивны, являются независимыми от других окон элементами. Диалоги же созданы, чтобы сконцентрировать внимание пользователя на конкретной вещи и/или получить немедленную реакцию от пользователя (см. например, MessageBox() API).

А> зачем Билли разделил диалоги и окна?


mailto:billgates@microsoft.com =)
Re[2]: Окни и диалоги
От: Аноним  
Дата: 21.02.07 09:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>пишу такой код :


А>Код твой — ф топку без разбирательств даже. Руки тебе оторвать и к компьютеру не пускать!


Какие мы все из себя среднегениальные

в msdn написано :
The DefDlgProc function must not be called by a dialog box procedure; doing so results in recursive execution.

вызов данной функции из диаооговой процедуры приводит к переполнению стэка

как грамотно применить ресурс диалога к главному окну?
Re: Окни и диалоги
От: programmater  
Дата: 21.02.07 12:21
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>Нужно создать главное окно из шаблона диалога

А>В vs создаю ресурс диалога
А>пишу такой код :
[кусь]
А>окно то создается но полноценно
А>(закрытие, изменение размеров) не отрабатывается
А>можно ли создавать окна и приименять к ним шаблоны диалога?

Первое, что хочестя спросить: "А зачем в данном случае немодальный диалог? Не лучше ли воспользоваться DialogBox(...) завместо CreateDialog(...) ?". Это избавило бы тебя от написания цикла обработки сообщений и беспокойстве о том, послал ли ты WM_QUIT или нет (собственно поэтому у тебя программа и не закрывается — цикл выборки и обработки сообщений завершится только получив WM_QUIT; но ведь этого сообщения в твоем примере никто не посылает!). Посмотри, насколько проще будет выглядеть функция Main в случае DialogBox(...).

int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
::DialogBox(hInstance,MAKEINTRESOURCE(ID_MAIN_DLG) , GetDesktopWindow(), MainDlgProc);
return 0;
}

Не правда ли, это гораздо проще того, что было у тебя.
Теперь по поводу того, как надо поправить MainDlgProc. Начнем с закрытия. В случае модального и немодального диалога это делается по-разному. В любом случае тебе надо добавить секцию в switch на сообщение WM_CLOSE. Только в случае модального диалога она будет выглядеть

    case WM_CLOSE:
    {
        ::EndDialog(hwndDlg , IDCANCEL);
        break;
    }

, что более правильно, а в случае немодального диалога будет выглядеть

    case WM_CLOSE:
    {
        ::PostQuitMessage(IDCANCEL);
        break;
    }

, что, вообще говоря, не совсем есть правильно, но это единственное логичное место, откуда можно послать WM_QUIT, а без этого сообщения твой цикл обработки сообщения не завершится. Это еще одни довод в пользу модального диалога. С ресайзом дела обстоят так. Для того, чтобы размеры твоего диалога изменялись, достаточно в свойсвах диалога (в редакторе ресурсов) поставить свойство Border в Resizing. Тогда при подведении мыши к краю диалога курсор примет соотв. форму и можно будем мышкой изменять размеры диалога. Но вот для того, чтобы размеры диалога изменялись по-человечески, придется повозиться. Дело в том, что диалог сам не меняет размеров и расположения дочерних контролов. Ты, наверное будешь удивлен, увидев, как изменяются размеры твоего диалога. Но такова жизнь. И правильно располагать дочерние контролы в своем диалоге должен ты. Для этого введи в MainDlgProc секцию свича WM_SIZE. И вызови MoveWindow для каждого контрола, который по твоему мнению нужно передвинуть/пересайзить в изменившем размеры диалоге. Код приводить не буду, потому как во-первых это не так просто, во-вторых, как располагать контролы зависит прежде всего от тебя.
Как правило на чистом API этим никто не занимается, и всевозможные библиотеки предоставляют готовые классы для подобных вещей. Например, "для чайников" есть Borland C++ Builder с его TForm/TCustomForm, для более продвинутых есть WTL с его CSizeDlg (или CSizeDialog), В MFC тоже есть что-то похожее (CFormView не совсем то, но похоже). Сам можешь позаниматься этим токмо ради тренировки и понимания принципов, "как оно там под капотом".
А>зы
А> чем отличаются диалоги от окон?
А> зачем Билли разделил диалоги и окна?
Он не разделил. Диалоги — это один из видов окон. И для этих окон есть функция DialogBox, которая выводит диалог в модальном режиме. Для обычных окон в WINAPI такой функции нету. Но народ (в MFC например) такие функции у себя нагородил, и в принципе (если очень захотеть и постараться) можно вывести и CMainFrame в модальном режиме.
Re: Окни и диалоги
От: kero Россия  
Дата: 22.02.07 00:13
Оценка:
Petzold "Programming Windows" -> Chapter 11 — Dialog Boxes -> Modeless Dialog Boxes -> HEXCALC: Window or Dialog Box?
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.