资源 window 在其他系统上无法正常工作(Visual Studio 2012)
Resource window doesn't work properly on other systems (Visual Studio 2012)
我在 Visual Studio 2012 (Win7 x64) 中创建了一个简单的 Win32 项目应用程序(不是 MFC!)。
对于主要 window,我使用了资源中的无模式 window。
编译的程序运行良好。然后我尝试在另一台计算机上 运行 这个程序。为此,我首先在 Release 中编译了它,Runtime Library 选项设置为 Multi-threaded (/ MT).
而且我注意到了下面的问题——在虚拟win7 x64上,程序启动了,但是我无法用鼠标移动程序的mainwindow并且按下关闭没有反应按钮。 IE。我无法使用系统菜单关闭 window。
我也编译了 WinXP x86 版本。结果是一样的。我还注意到另一件事 - 如果我在设计器中放置几个按钮 window,然后在 WinXP 上启动程序,然后我看到按钮向下移动了一点 ...
但是在编译程序的 PC 上 - 一切正常 - window 用鼠标移动,系统菜单也可以。
哪里会出错?
代码:
#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[=13=]"
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"
"[=13=]"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"[=13=]"
END
#endif // APSTUDIO_INVOKED
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
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.
您正在执行此操作 - 从 DialogProc
回调调用 DefWindowProc
而不是返回 FALSE
以指示消息尚未处理。也不需要投 (DLGPROC)Dlg_Proc
.
我在 Visual Studio 2012 (Win7 x64) 中创建了一个简单的 Win32 项目应用程序(不是 MFC!)。 对于主要 window,我使用了资源中的无模式 window。
编译的程序运行良好。然后我尝试在另一台计算机上 运行 这个程序。为此,我首先在 Release 中编译了它,Runtime Library 选项设置为 Multi-threaded (/ MT).
而且我注意到了下面的问题——在虚拟win7 x64上,程序启动了,但是我无法用鼠标移动程序的mainwindow并且按下关闭没有反应按钮。 IE。我无法使用系统菜单关闭 window。
我也编译了 WinXP x86 版本。结果是一样的。我还注意到另一件事 - 如果我在设计器中放置几个按钮 window,然后在 WinXP 上启动程序,然后我看到按钮向下移动了一点 ...
但是在编译程序的 PC 上 - 一切正常 - window 用鼠标移动,系统菜单也可以。
哪里会出错?
代码:
#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[=13=]"
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"
"[=13=]"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"[=13=]"
END
#endif // APSTUDIO_INVOKED
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
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.
您正在执行此操作 - 从 DialogProc
回调调用 DefWindowProc
而不是返回 FALSE
以指示消息尚未处理。也不需要投 (DLGPROC)Dlg_Proc
.