Окно ресурсов не работает должным образом в других системах (Visual Studio 2012) - PullRequest
0 голосов
/ 21 января 2019

Я создал простое приложение Win32 Project (не MFC!) В Visual Studio 2012 (Win7 x64). Для основного окна я использовал немодальное окно из ресурсов.

Скомпилированная программа работала хорошо. Затем я попытался запустить эту программу на другом компьютере. Для этого прежде всего я скомпилировал его в Release , для параметра Runtime Library было установлено значение Многопоточный (/ MT) .

И я заметил следующую проблему - на виртуальной win7 x64 программа запустилась, но я не мог переместить главное окно программы мышью, и не было никакой реакции на нажатие кнопки закрытия. То есть Я не могу закрыть окно с помощью системного меню.

Я также скомпилировал версию для WinXP x86. Это был тот же результат. Я также заметил еще одну вещь - если я помещаю пару кнопок в окно в конструкторе и запускаю программу на WinXP, то вижу, что кнопки немного сдвинуты вниз ...

Но на ПК, где была скомпилирована программа - все работает нормально - окно движется мышью, работает и системное меню.

Где может быть ошибка?

Код:

#include "stdafx.h"
#include "Win32Project1.h"


INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//=========================================================================
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
HWND mainWnd = CreateDialog(hInstance, MAKEINTRESOURCE(mainWindow), NULL, (DLGPROC)Dlg_Proc); 
ShowWindow(mainWnd, SW_SHOW);


MSG msg;
BOOL bRet;

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

return 0;
}
//=========================================================================
INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_DESTROY:
        {
        PostQuitMessage(0);
        return TRUE;
        }

        default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

return 0;
}

.rc файл:

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Russian (Russia) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

mainWindow DIALOGEX 0, 0, 309, 178
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    mainWindow, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 302
        TOPMARGIN, 7
        BOTTOMMARGIN, 171
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // Russian (Russia) resources
/////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////
// English (United States) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_WIN32PROJECT1       ICON                    "Win32Project1.ico"
IDI_SMALL               ICON                    "small.ico"

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""targetver.h""\r\n"
    "#endif\r\n"
    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include ""windows.h""\r\n"
    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED

#endif    // English (United States) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

1 Ответ

0 голосов
/ 21 января 2019

Замечания от DialogProc:

Процедуру диалогового окна следует использовать, только если вы используете класс диалогового окна для диалогового окна.Это класс по умолчанию, который используется, когда в шаблоне диалогового окна не указан явный класс.Хотя процедура диалогового окна аналогична оконной процедуре, она не должна вызывать функцию DefWindowProc для обработки нежелательных сообщений.Нежелательные сообщения обрабатываются внутренне с помощью процедуры окна диалогового окна.

Вы делаете именно это - вызываете DefWindowProc из DialogProc callback вместо возврата FALSE, чтобы указать, что сообщение не было обработано,Также не должно быть необходимости кастовать (DLGPROC)Dlg_Proc.

...