Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
vassel
0 / 0 / 0
Регистрация: 17.01.2010
Сообщений: 4
1

Почему DialogBox возвращает (-1) ?

17.01.2010, 19:21. Просмотров 2446. Ответов 13
Метки нет (Все метки)

Всем привет! Начал писать программу на Visual C++ (Microsoft Visual Studio 6.0) и сразу же столкнулся с проблемой. Вроде всё примитивно и просто, а диалоговое окно почему-то не создаётся. DialogBox возвращает -1, а почему - не понимаю. В чём может быть дело?
Заранее спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <windows.h>
#include <stdio.h>
#include "resource.h"
 
 
 
BOOL CALLBACK DlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_INITDIALOG:
        return FALSE;
    }
 
    return FALSE;
}
 
 
 
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nShowCmd )
{
    DialogBox (hInstance, MAKEINTRESOURCE (IDD_DIALOG1),
                        NULL, DlgProc);
    return 0;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2010, 19:21
Ответы с готовыми решениями:

Как добавить ActiveX на DialogBox
Приветсвую! Есть диалоговое окно, созданное MSDN 2012 Visual C++ с помощью resource.rc Так как...

Почему ExecuteScalar возвращает 0?
Не пойму, почему запрос возвращает 0. Кто сталкивался с таким? SqlCommand getID = new...

Почему переменная возвращает None?
Приветствую, форумчане Подскажите, почему в данном коде div выводит None, а не верстку import...

Почему GetDateFormatEx возвращает 0?
Помогите, нужно написать функцию, которая выводит значение текущей даты. файл .cpp BOOL WINAPI...

Почему код не возвращает 8?
Дан массив целых чисел. Создайте Java-метод, который возвращает true в случае, если сумма всех...

13
Nick Alte
Эксперт С++
1655 / 1027 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
17.01.2010, 19:51 2
Вероятно, причина в том, что ты написал return FALSE; в обработчике WM_INITDIALOG. Из описания этого сообщения в MSDN:
An application can return FALSE only if it has set the keyboard focus to one of the controls of the dialog box.
Попробуй написать там return TRUE;
0
vassel
0 / 0 / 0
Регистрация: 17.01.2010
Сообщений: 4
17.01.2010, 23:33  [ТС] 3
Нет, дело не в этом. Я пробовал и так, и так.

Добавлено через 2 часа 13 минут
Кстати, вот ссылка на весь проект (потому как код вроде бы правильный): Optima.rar (файл Optima.rar)

Добавлено через 55 минут
GetLastError() выдаёт код ошибки 1812 (Наполеон вспоминается =) ).
Я посмотрел в MSDN, этот код трактуется так: ERROR_RESOURCE_DATA_NOT_FOUND, The specified image file did not contain a resource section. Какие-то проблемы с ресурсом? Не понимаю, какие.

Добавлено через 22 секунды
Мда, мне тут объяснили всё, и я понял, что кретин =) Забыл добавить .rc-файл и resource.h в состав проекта. Всегда удивлялся: почему они автоматически не добавляются? =)
0
Karloson2
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
14.03.2011, 09:27 4
Подниму тему.
Работал на MVS6 и MVS2003 проблем не знал. Решил попробовать MVS2008. Делаю простенький проект под Win32 API. Создаю стандартный диалог и запускаю его в WinMain - всё работает, но стоит добавить в диалог ListBox, то всё - не запускается, хотя, при компиляции ошибок не даёт. DialogBox возвращает -1, GetLastError - ноль.
Куда копать?
0
14.03.2011, 09:27
Digit@ll
Brainsbreaker
889 / 367 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
14.03.2011, 15:03 5
Karloson2, что-то вразумительное пока сказать не представляется возможным. Копай в сторону ListBox или выложи код, проверим на 2008.
0
Karloson2
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
14.03.2011, 15:45 6
Там, вроде, всё просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "stdafx.h"
#include "Test_ListBox.h"
 
LRESULT CALLBACK    DlgProc(HWND, UINT, WPARAM, LPARAM);
 
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int){
    DWORD dwTemp;
 
    dwTemp = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DLG), NULL, (DLGPROC)DlgProc);
    dwTemp = GetLastError();
    return (int) 0;
}
 
LRESULT CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
 
    switch (message)
    {
    case WM_INITDIALOG:
        break;
    case WM_COMMAND:
        if(wParam == IDCANCEL)
            EndDialog(hWnd, 0x0);
            break;
        break;
    default:
        return FALSE;
    }
    return TRUE;
}
Добавляю в диалог List Contol и перестаёт работать.
ЗЫ: приклеил проект.
0
Вложения
Тип файла: 7z Test_ListBox.7z (3.7 Кб, 21 просмотров)
Digit@ll
Brainsbreaker
889 / 367 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
14.03.2011, 17:04 7
))) Так она у тебя и не будет работать. Вернее она работает, но только закрывается лишь начавшись.
WinMain .../не важно что/... return (int) 0; А где обработка сообщений?
C++
1
2
3
4
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
0
Karloson2
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
15.03.2011, 08:17 8
Всё там правильно. Убери из диалога List Contol и сообщения будут обрабатываться в DlgProc, пока не будет вызвана EndDialog() и управление не вернется в tWinMain().

Нашёл в чем ошибка: пренебрёг ф-цией InitCommonControls(). Раньше обходился без неё, скармливая линкиру Comctl32.lib и прокатывало, теперь нет.
0
Digit@ll
Brainsbreaker
889 / 367 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
15.03.2011, 14:46 9
Karloson2, два раза ))). Добавь вместо List Contol Radio Button и попытайся сделать ее отметку... Куда от нее пойдет отосланное сообщение?
Я понял к чему ты клонишь. При таком подходе вся последующая обработка сообщений должна производиться в самом DlgProc.
0
Karloson2
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
15.03.2011, 14:54 10
Цитата Сообщение от Digit@ll Посмотреть сообщение
.. При таком подходе вся последующая обработка сообщений должна производиться в самом DlgProc.
Вот именно. Вся прога и есть диалог. Винмайн нужна только для загрузки диалога.
Уходим от темы)
0
bigredcat
372 / 319 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
16.03.2011, 18:09 11
Digit@ll
Суть в том, что если создается dialog based приложение при помощи макроса DialogBox (функции DialogBoxParam), то создается модальный диалог. При этом, в самом простом случае, WinMain приостанавливается вплоть до закрытия диалога. А система забирает управление очередью сообщений приложения, запускает отдельный цикл сообщений и отправляет сообщения, предназначенные этому диалогу, непосредственно в его DialogProc. Поэтому while (GetMessage...) {...DispatchMessage...} в данном случае не нужен. Но это было бы не так, если бы создавался немодальный диалог (CreateDialog).

Цитата Сообщение от Karloson2 Посмотреть сообщение
C++
1
EndDialog(hWnd, 0x0);
При неуспешном выполнении DialogBoxParam возвращает 0 или -1, при успешном значение второго параметра из EndDialog. Так что в общем случае лучше так EndDialog(hWnd, 1).
0
Digit@ll
Brainsbreaker
889 / 367 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
16.03.2011, 19:57 12
bigredcat, та все это понятно. TranslateMessage(&msg); это вообще, для обработки сообщений с клавиатуры. Пример был дан в общих чертах ), не вдаваясь особо в подробности, но цель работы приложения была в итоге разобрана.
0
Karloson2
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
18.04.2011, 15:54 13
Проблема была в отсутствие явной загрузки DLLки ф-цей InitCommonControlsEx
C++
1
2
3
4
5
   INITCOMMONCONTROLSEX icex;
    // Ensure that the common control DLL is loaded. 
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC  = ICC_LISTVIEW_CLASSES;
    InitCommonControlsEx(&icex); // To ensure that common controls DLL loads
0
Digit@ll
Brainsbreaker
889 / 367 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
19.04.2011, 08:21 14
Да, покатило. ИМХО: бред какой-то, все в целом.
0
19.04.2011, 08:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2011, 08:21

Почему возвращает нули?
Собственно вопрос в следующем: почему возвращает нули? int nums = new int; for (int i = 0; i &lt;...

Почему операция ~0>>1 возвращает значение -1?
ПОчему операция ~0&gt;&gt;1 возвращает значение -1, не зависимо от того, что стоит после &quot;&gt;&gt;&quot; ведь...

Почему функция возвращает undefined
Может кто подсказать, а то думалка уже болит. Наверняка ошибка очевидна, просто у меня не особо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru