Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 17.01.2010
Сообщений: 4

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

17.01.2010, 19:21. Показов 3601. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2010, 19:21
Ответы с готовыми решениями:

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

Почему ExecuteScalar возвращает 0?
Не пойму, почему запрос возвращает 0. Кто сталкивался с таким? SqlCommand getID = new SqlCommand(&quot;Select from Auto where ='&quot; +...

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

13
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
17.01.2010, 19:51
Вероятно, причина в том, что ты написал 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
0 / 0 / 0
Регистрация: 17.01.2010
Сообщений: 4
17.01.2010, 23:33  [ТС]
Нет, дело не в этом. Я пробовал и так, и так.

Добавлено через 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
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
14.03.2011, 09:27
Подниму тему.
Работал на MVS6 и MVS2003 проблем не знал. Решил попробовать MVS2008. Делаю простенький проект под Win32 API. Создаю стандартный диалог и запускаю его в WinMain - всё работает, но стоит добавить в диалог ListBox, то всё - не запускается, хотя, при компиляции ошибок не даёт. DialogBox возвращает -1, GetLastError - ноль.
Куда копать?
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
14.03.2011, 15:03
Karloson2, что-то вразумительное пока сказать не представляется возможным. Копай в сторону ListBox или выложи код, проверим на 2008.
0
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
14.03.2011, 15:45
Там, вроде, всё просто:
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 и перестаёт работать.
ЗЫ: приклеил проект.
Вложения
Тип файла: 7z Test_ListBox.7z (3.7 Кб, 22 просмотров)
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
14.03.2011, 17:04
))) Так она у тебя и не будет работать. Вернее она работает, но только закрывается лишь начавшись.
WinMain .../не важно что/... return (int) 0; А где обработка сообщений?
C++
1
2
3
4
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
0
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
15.03.2011, 08:17
Всё там правильно. Убери из диалога List Contol и сообщения будут обрабатываться в DlgProc, пока не будет вызвана EndDialog() и управление не вернется в tWinMain().

Нашёл в чем ошибка: пренебрёг ф-цией InitCommonControls(). Раньше обходился без неё, скармливая линкиру Comctl32.lib и прокатывало, теперь нет.
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
15.03.2011, 14:46
Karloson2, два раза ))). Добавь вместо List Contol Radio Button и попытайся сделать ее отметку... Куда от нее пойдет отосланное сообщение?
Я понял к чему ты клонишь. При таком подходе вся последующая обработка сообщений должна производиться в самом DlgProc.
0
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
15.03.2011, 14:54
Цитата Сообщение от Digit@ll Посмотреть сообщение
.. При таком подходе вся последующая обработка сообщений должна производиться в самом DlgProc.
Вот именно. Вся прога и есть диалог. Винмайн нужна только для загрузки диалога.
Уходим от темы)
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
16.03.2011, 18:09
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
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
16.03.2011, 19:57
bigredcat, та все это понятно. TranslateMessage(&msg); это вообще, для обработки сообщений с клавиатуры. Пример был дан в общих чертах ), не вдаваясь особо в подробности, но цель работы приложения была в итоге разобрана.
0
1 / 1 / 0
Регистрация: 14.03.2011
Сообщений: 13
18.04.2011, 15:54
Проблема была в отсутствие явной загрузки 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
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
19.04.2011, 08:21
Да, покатило. ИМХО: бред какой-то, все в целом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2011, 08:21
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru