Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как загрузить диалоговое окно? 
:(
    Опции темы
Волод
Дата 28.7.2005, 11:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте, появился вопрос касательно создания диалогового окна. Я попытался в VC++ 6 сделать окно диалога, и вывести его на экран по аналогии с обычным окном. Попытался сделать это через CreateDialog(), примерно вот так:
Код

#include <windows.h>
#include "resource.h"
BOOL CALLBACK DlgFunc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
    MSG msg;
    HWND hDlg=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL, DlgFunc);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return msg.wParam;
}

BOOL CALLBACK DlgFunc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    switch (iMsg)
    {
    case WM_CLOSE:
        {
            DestroyWindow(hDlg);                    
            return 0;
        }
    }
    return 0;  //а хотелось бы return DefWindowProc...
}


В общем-то код работает, но беда в том, что функция CreateDialog в качестве четвертого параметра принимает только BOOL-функцию (CALLBLACK функция окна диалога). Попытка переопределить ф. DlgFunc как LRESULT, а в CreateDialog привести ее к типу BOOL успеха не дала, а значит, я не могу из функции окна диалога возвращать сообщения, что приводит к тому, что окно-то диалога я выгружаю, а вот само приложения остается висеть в памяти…

  Вверх
Earnest
Дата 28.7.2005, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Не поняла я, в чем беда... CALLBACk - функция диалога - это не совсем тоже самое, что CALLBACK-функция окна. И приводить ее ни к чему не надо, передавай как есть.
Вот из MSDN насчет диалоговой функции:

Цитата
You should use the dialog box procedure only if you use the dialog box class for the dialog box. This is the default class and is used when no explicit class is specified in the dialog box template. Although the dialog box procedure is similar to a window procedure, it must not call the DefWindowProc function to process unwanted messages. Unwanted messages are processed internally by the dialog box window procedure.


DefWindowProc тебе там не поможет (она и так есть, только не внутри, а снаружи, вызывает твою DlgProc).

Чтобы завершить приложение, нужно выйти из цикла, чтобы выйти из цикла, нужно чтобы GetMessage вернула 0, а она это делает, когда получает WM_QUIT. Т.е., при закрытии окна (в обработчике OnClose) вызови PostQuitMessage.

А вообще, нафига тебе CreateDialog, а потом цикл.
Если диалог - он же главное окно - вызови DialogBox вместо всего этого - и все. Создастся модальный диалог со своим циклом сообщений.

Модератору:
А тему нужно в Windows API перенести...


--------------------
...
PM   Вверх
Волод
Дата 28.7.2005, 12:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мне было интересно, чтобы заработало именно с CreateDialog ;))
  Вверх
Earnest
Дата 28.7.2005, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Тогда вызывай PostQuitMessage


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.