- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我试图制作一个函数 createscalingwindow
调用 CreateWindowEx
并将 CreateWindowEx
中使用的 HWND 地址写入一个 vector ,然后通过它的初始大小和位置值。
我制作的另一个名为 scalewindowsize
的函数应该使用两个给定的窗口并将一个窗口的大小与另一个窗口缩放,但目前我什至无法匹配某些 HWND 的地址,因为在某些情况下条件下传递给 scalewindowsize
的 HWND 地址将与初始化时的地址完全不同。只有当我从窗口过程调用 scalewindowsize
时,在窗口过程的参数中使用与 scalewindowsize
的参数中使用的 HWND 相同的 HWND,才会发生这种情况。下面是相关代码:
#include <windows.h>
#include <stdio.h>
#include <winsock.h>
#include <vector>
#define ID_1 1000
#define ID_2 1001
#define ID_3 1002
HWND mainwin;
HWND lobbywin;
int zero = 0;
char MENU1;
std::vector<intptr_t> sizevalues;
LRESULT CALLBACK mainproc (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK lobbyproc (HWND, UINT, WPARAM, LPARAM);
char mainclassname[] = "main";
char lobbyclassname[] = "lobby";
void createscalingwindow(HWND &cswpara0,DWORD cswpara1,const CHAR* cswpara2,
const CHAR* cswpara3,DWORD cswpara4,int cswpara5,int cswpara6,int cswpara7,
int cswpara8,HWND cswpara9,HMENU cswpara10,HINSTANCE cswpara11,LPVOID cswpara12)
{
cswpara0 = CreateWindowEx (cswpara1, cswpara2, cswpara3, cswpara4,cswpara5,
cswpara6,cswpara7,cswpara8,cswpara9,cswpara10,cswpara11,cswpara12);
char buffer[100];
sizevalues.push_back((intptr_t)&cswpara0);
snprintf (buffer, 20,"%d", sizevalues[zero]);
MessageBox (NULL, buffer, "initialized", NULL);
zero = (zero + 1);
return;
}
void scalewindowsize (HWND &ownerwin, const CHAR* tryz)
{
char buffer[100];
int checknumber = 0;
while (checknumber < sizevalues.size())
{
int compare = sizevalues[checknumber];
if (sizevalues[checknumber] == (intptr_t)&ownerwin)
{
snprintf (buffer, 100,"%d", (intptr_t)&ownerwin);
MessageBox (NULL, buffer, "value found", NULL);
break;
}
else
{
snprintf (buffer, 100,"%d", (intptr_t)&ownerwin);
MessageBox (NULL, buffer, tryz, NULL);
snprintf (buffer, 100,"%d", sizevalues[checknumber]);
checknumber = (checknumber + 1);
MessageBox (NULL, buffer, "fail currentcheck", NULL);
}
}
return;
}
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
LPSTR lpszArgument, int nCmdShow)
{
MSG messages;
WNDCLASSEX mainwinclass;
mainwinclass.hInstance = hThisInstance;
mainwinclass.lpszClassName = mainclassname;
mainwinclass.lpfnWndProc = mainproc;
mainwinclass.style = CS_DBLCLKS;
mainwinclass.cbSize = sizeof (WNDCLASSEX);
mainwinclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
mainwinclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
mainwinclass.hCursor = LoadCursor (NULL, IDC_ARROW);
mainwinclass.lpszMenuName = NULL;
mainwinclass.cbClsExtra = 0;
mainwinclass.cbWndExtra = 0;
mainwinclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&mainwinclass))
return 0;
WNDCLASSEX lobbywinclass;
lobbywinclass.hInstance = hThisInstance;
lobbywinclass.lpszClassName = lobbyclassname;
lobbywinclass.lpfnWndProc = lobbyproc;
lobbywinclass.style = CS_DBLCLKS;
lobbywinclass.cbSize = sizeof (WNDCLASSEX);
lobbywinclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
lobbywinclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
lobbywinclass.hCursor = LoadCursor (NULL, IDC_ARROW);
lobbywinclass.lpszMenuName = NULL;
lobbywinclass.cbClsExtra = 0;
lobbywinclass.cbWndExtra = 0;
lobbywinclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&lobbywinclass))
return 0;
HMENU playmenu = CreateMenu();
HMENU playmenulist = CreatePopupMenu();
HMENU helpmenulist = CreatePopupMenu();
AppendMenu(playmenulist, MF_STRING, ID_1, "Join game");
AppendMenu(playmenulist, MF_STRING, ID_3, "Host game");
AppendMenu(playmenulist, MF_STRING, ID_2, "Quit");
InsertMenu(playmenu, 1, MF_POPUP|MF_BYPOSITION, (UINT_PTR)playmenulist, "Play");
createscalingwindow(mainwin, 0, mainclassname, "mainwindow",
WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU,
CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, NULL, playmenu, hThisInstance, NULL);
ShowWindow (mainwin, nCmdShow);
createscalingwindow(lobbywin, 0, lobbyclassname, "Lobby", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 425, NULL, NULL, hThisInstance, NULL);
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK mainproc(HWND mainwin, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_SIZE:
{
scalewindowsize (mainwin, "mainwin");
scalewindowsize (lobbywin, "lobbywin");
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
}
switch (wParam)
{
case ID_3:
EnableWindow (mainwin, false);
ShowWindow (mainwin, false);
ShowWindow (lobbywin, true);
break;
default:
return DefWindowProc (mainwin, message, wParam, lParam);
break;
}
return 0;
}
LRESULT CALLBACK lobbyproc(HWND lobbywin, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_SIZE:
{
scalewindowsize (mainwin, "mainwin");
scalewindowsize (lobbywin, "lobbywin");
break;
}
break;
}
switch (wParam)
{
case SC_CLOSE:
{
EnableWindow (mainwin, true);
ShowWindow (mainwin, true);
ShowWindow (lobbywin, false);
EnableWindow (lobbywin, false);
break;
}
default:
return DefWindowProc (lobbywin, message, wParam, lParam);
break;
}
}
如果我运行这个程序,点击主机游戏,返回到主窗口并稍微调整它的大小(在 mainrpoc 中关闭 case WM_SIZE:)然后退出程序,我会按时间顺序得到以下消息框:
1[title: Initialized |text: 4231184]
2[title: mainwin |text: 2292968]
3[title: fail currentcheck |text: 4231184]
4[title: lobbywin |text: 4231188]
5[title: fail currentcheck |text: 4231184]
6[title: initialized |text: 4231188] (no more boxes until I click on host game)
7[title: value found: |text: 4231184]
8[title: lobbywin |text: 2292676]
9[title: fail currentcheck |text: 4231184]
10[title: lobbywin |text: 2292676]
11[title: fail currentcheck |text: 4231188] (no more boxes until I go back to the mainwindow and resize it slightly)
12[title: mainwin |text: 2291164]
13[title: fail currentcheck |text: 4231184]
14[title: mainwin |text: 2291164]
15[title: fail currentcheck |text: 4231188]
16[title: lobbywin |text: 4231188]
17[title: fail currentcheck |text: 4231184]
18[title: value found |text: 4231188]
我现在很困惑,我希望读到这篇文章的人能向我解释为什么地址会改变,在此先感谢您花时间阅读我的问题。
更新:对于正在阅读本文的任何人,除了 whoz craigs 的回答之外,我还想补充一点,即在 C++ 中调用全局变量而不是局部变量的方法是在变量之前添加::。
最佳答案
在两个窗口过程中,您都将参数 HWND 发送到 scalewindow;不是全局的。因此它们是不同的地址。名称解析使用“最接近”变量,在这两种情况下都是 HWND 参数,而不是您尝试使用的 HWND 全局变量。
例子:
LRESULT CALLBACK mainproc(HWND mainwin, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_SIZE:
{
scalewindowsize (mainwin, "mainwin"); // passes parameter mainwin by reference
scalewindowsize (lobbywin, "lobbywin"); // passes global lobbywin by reference
break;
}
因此引用将具有不同的地址解析。另一个例子:
LRESULT CALLBACK lobbyproc(HWND lobbywin, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_SIZE:
{
scalewindowsize (mainwin, "mainwin"); // passes global mainwin by reference
scalewindowsize (lobbywin, "lobbywin"); // passes parameter lobbywin by reference
break;
}
break;
关于c++ - 当用于其 windproc 内部的参数时,HWND 地址发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14167076/
如何将 hwnd 类型数据存储和检索到一个平面文件中,并将其返回到 hwnd 类型变量中? 我是这样写的: HWND g_hWndApp, g_hWndApp1; ofstream myfile; m
我需要一些具体的帮助。我知道类名、所有者 hwnd 和窗口的大小。我如何获得它的hwnd?或者,至少,获取满足这些条件的所有窗口的列表。 提前致谢! 瓦利 最佳答案 您可以尝试使用此代码。它将为您提供
我确实了解如何重载运算符,但显然不完全了解。 谁能解释一下这部分的用法 WWindow::operator HWND() { // This overloaded operator allow
我尝试使用 DirectXTK 在我的游戏引擎中实现鼠标和键盘支持。这对于键盘来说非常简单,但是我在实现适当的鼠标支持方面遇到了问题。我在关注 THIS用于在我的引擎中实现鼠标。这篇来自 Micros
我有 2 个应用程序,一个是隐藏窗口(“hW”),另一个是控制台应用程序(“CA”),来自我想向硬件发送命令。在控制台应用程序中,我得到了硬件句柄,这是一个问题:如果我正在运行: PostMessag
我一直在改进我一直致力于的类(class),其中之一就是创建库来处理某些在我的主项目中并不真正需要看到的任务。但是,当我调用该类并实例化我刚刚创建的库时,我得到: Intellisense: argu
我正在应用程序中处理 ESC 键,收到此键后我希望关闭当前窗口。 我应该简单地调用DestroyWindow(hWnd)还是应该SendMessage(WM_CLOSE, hWnd, 0, 0),或者
我是说 WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) 可以这样重写 WndProc_OnCommand(hWn
假设 GetDC(hWnd) 作为 WM_CREATE 上的第一条 指令被调用,对于窗口 hWnd, GetDC() 是否可能返回 NULL? 我担心 GetDC() 可能因资源不足而失败。当发生这种
我是这个社区的新手,在使用我的自动化脚本 1 时遇到问题,我想获取 HWND 的创建时间。 我在从 FindWindowEx 检索到的数组中有一组 HWND,我想在数组中找到最后根据系统时间创建的 H
我使用CreateCoreWebView2Host()方法创建了边缘浏览器窗口。此方法使用父窗口句柄并创建子窗口,我们可以在其中导航网页。导航完成后,我需要返回我的窗口句柄,但我认为我无法返回。 在S
当我们使用WindowFromPoint winapi函数时,我们通常可以得到这样的情况:Point指定窗口内的某个控件。在这种情况下,WindowFromPoint 返回该控件的句柄,而不是返回处理
我想知道您是否可以将句柄转换为窗口“HWND”。我需要使用“FindWindow”方法调用“PostMessage”函数。 我目前必须采购 HANDLE mainProcess; BOOL APIEN
为什么我在此处将桌面作为我的模态对话框的父 HWND? class CSaveProfileAsDlg: public CSimpleDialog { .... LRESULT OnInit
我正在将我的 HWND 传递给一个子流程,这样它就可以向我发送有关其进度的消息。有时我从未收到来自子流程的任何消息。在调查过程中,我发现我传递给子进程的 GetSafeHwnd() 似乎返回了我不期望
我又是伙计们,到目前为止,我已经设法学习了有关窗口创建和消息系统的大多数基础知识,现在我想问一下格式化,因为我没有设法在谷歌上找到任何关于我的特殊情况的信息。这是到目前为止的样子: 其中带有 0 的框
GetDesktopWindow() 仅返回主桌面。我也试过 EnumDisplayMonitors(),但没有返回桌面句柄。 最佳答案 您可以使用可用的函数来执行此操作,如下所示: 方法 1(对于重
我正在尝试创建一个简单的窗口,但我遇到了一些问题。编译器不会报错,但它根本无法创建窗口的 hWnd。它还表示正在使用“msg”变量而未初始化。这不是错误,只是警告,但是我感到不舒服。当我单击调试屏幕中
如何在另一个第三方应用程序中使用 C++ 获取 Combobox 的 HWND? MSDN 有一个函数叫做 GetDlgItem()但是第二个参数需要控件的 ID。有函数 GetDlgCtrlID()
当我编译我的代码时,应该打开一个窗口,但它没有。我已经创建了一个类、HWND 和应用程序处理程序;依然没有。 我有点新,很抱歉这个问题。 应用程序运行良好,没有错误,但窗口似乎没有出现。 #inclu
我是一名优秀的程序员,十分优秀!