Ресурс DialogBox возвращает -1 - PullRequest
0 голосов
/ 18 ноября 2011

Я создал свой диалог как ресурс, используя редактор ресурсов (редактор диалогов?)

В этом нет ничего особенного, просто две группы, две кнопки, кнопка разделения, две картинки, 3 статических метки, 3поля редактирования, 3 элемента управления вращением, 3 системные ссылки и индикатор выполнения.

Когда я нажимаю Ctrl + T, чтобы проверить диалоговое окно, оно работает нормально, но когда я нажимаю F5 для отладки программы, диалоговое окно никогдапоявляется и программа завершается с кодом -1 (0xffffffff)

Вот код, который я использую для вызова диалогового окна:

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

BOOL CALLBACK DlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
        case (WM_COMMAND):
            switch (LOWORD(wParam))
            {
                default:
                    break;
            }
            break;

        default:
            return FALSE;
    }

    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    int ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINWINDOW), NULL, DlgProc);

    int err = GetLastErro(); // This gives 0

    return ret; // This gives -1
}

У меня еще ничего нет в DlgProc пока, потому что я просто хотел, чтобы диалоговое окно отображалось с начала.

Если я установлю точку останова в DlgProc, то получим следующие сообщения:

48, 85, 297,273, 273, 144, 2 и 130.

Я посмотрел их, и они перевели на:

WM_SETFONT
WM_NOTIFYFORMAT
???
WM_COMMAND
WM_COMMAND
???
WM_DESTROY
WM_NCDESTROY

Кто-нибудь знает, что я делаю неправильно?


Редактировать: :Я нашел решение проблемы!Сначала мы думали, что это поврежденный RC-файл, но я понял, что созданный мной тестовый RC-файл имеет все типы элементов управления, кроме SysLink.Когда я добавил SysLink, произошло то же самое.Я попытался включить ComCtl32.lib в компоновщик, и я также попытался включить заголовок общих элементов управления и вызвать InitCommonControls, но это ничего не дало.

Я все вернул, как было изначально, и добавил это предварительнодиректива процессора, которая исправила это:

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

Это была проблема.Без этой директивы диалог не будет инициализирован из-за SysLinks!

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Вам не нужно звонить DefWindowProc для диалоговых процедур.Они сделаны для вас ОС.просто return FALSE;

0 голосов
/ 18 ноября 2011

Общие элементы управления!Например, индикатор выполнения - вам понадобится связь с dll commctrl, включение заголовка commctrl и вызов InitCommonControlsEx.Это вызывает выполнение вашей программы и ее немедленное завершение.


Тестирование вашего диалога из редактора ресурсов фактически не выполняет остальной части вашего кода - оно просто рисует диалог, рисует дочерний элементокна в соответствующих местах, а затем сидит там и смотрит на вас.Ваш dlgproc может быть ужасно неправильным, и редактор ресурсов не будет так сильно хныкать.

Ваша диалоговая процедура должна возвращать 0 по умолчанию, а не передаваться в стандартный процесс окна.

Когда вы катитесь, вы обрабатываете (некоторые из) сообщений, которые получает ваш диалог, примерно так:

 switch(msg) {
      case WM_COMMAND:{
           switch(LOWORD(wParam)) {
              // do stuff here when a child window is manipulated
      }
      break;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...