C++ Win32 GUI和对C+的回调+;功能

C++ Win32 GUI和对C+的回调+;功能,c++,winapi,user-interface,codeblocks,C++,Winapi,User Interface,Codeblocks,基本上我用的是这样的代码。这是一个简单的窗口,您只能在其中更改编辑框内的文本,然后按下一个按钮,该按钮将回调函数(DoSomethingCallback(text)) #包括 #定义ID\u编辑1 #定义ID_按钮2 LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM) { 静态HWND hwndEdit; 静态HWND HWND按钮; 静态内透镜; 静态TCHAR文本[30]; 开关(msg) { 案例WM_创建: H

基本上我用的是这样的代码。这是一个简单的窗口,您只能在其中更改编辑框内的文本,然后按下一个按钮,该按钮将回调函数(DoSomethingCallback(text))

#包括
#定义ID\u编辑1
#定义ID_按钮2
LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
静态HWND hwndEdit;
静态HWND HWND按钮;
静态内透镜;
静态TCHAR文本[30];
开关(msg)
{
案例WM_创建:
HwnEdit=CreateWindow(文本(“编辑”),NULL,WS|u子项| WS|u可见| WS|u边框,
50,50,150,20,hwnd,(HMENU)ID_编辑,
空,空);
hwndButton=CreateWindow(
文本(“按钮”)、文本(“设置标题”),
WS|u可见| WS|u儿童,
50, 100, 80, 25,        
hwnd,(HMENU)ID_按钮,空,空);
打破
case WM_命令:
如果(HIWORD(wParam)=BN_单击){
SetWindowText(hwnd,“工作…”);
GetWindowText(HwnEdit,text,len);
DoSomethingCallback(文本);
SetWindowText(hwnd,“完成”);
}
打破
案例WM_销毁:
PostQuitMessage(0);
打破
}
返回DefWindowProc(hwnd、msg、wParam、lParam);
}
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、,
LPSTR lpCmdLine,int nCmdShow)
{
味精;
WNDCLASS wc={0};
wc.lpszClassName=文本(“编辑控件”);
wc.hInstance=hInstance;
wc.hbrBackground=GetSysColorBrush(颜色面);
wc.lpfnWndProc=WndProc;
wc.hCursor=加载光标(0,IDC_箭头);
注册类(&wc);
CreateWindow(wc.lpszClassName,文本(“编辑控件”),
WS|U重叠窗口| WS|U可见,
220、220、280、200、0、0、0);
while(GetMessage(&msg,NULL,0,0)){
翻译信息(&msg);
发送消息(&msg);
}
返回(int)msg.wParam;
}
问题是,当运行该回调时,窗口将显示为“无响应”,如果您尝试关闭或按下按钮,窗口甚至会延迟。我理解可能发生这种情况的原因,回调需要时间,而接收循环不在那里检查用户的输入。我已经找到了一种方法来“修复”这个问题,但我找不到任何方法。我很确定这是件愚蠢的事,但我必须试着问一下

一个明显的方法是进行更快的回调。但是还有另一种方法,比如在DoSomethingCallback()中检查用户输入,还是我必须使用多个线程


对不起,这个问题让人困惑。

我愿意打电话来处理。如果DoSomethingCallback()太长,则在DoSomethingCallback()工作时无法使窗口响应,因为只有一个线程运行代码。祝你好运

我会打电话处理此事。如果DoSomethingCallback()太长,则在DoSomethingCallback()工作时无法使窗口响应,因为只有一个线程运行代码。祝你好运

如果可能,您可以在
DoSomethingCallback
中每隔一段时间处理消息队列,这将使UI保持响应。只需运行原始消息循环,即
while(GetMessage(…
只要有可能,请确保禁用该按钮,以便用户不会再次单击…这将导致递归。

如果可能,您可以在
DoSomethingCallback
内每隔一段时间处理消息队列,这将保持UI响应。只需运行原始消息循环,即
while(GetMessage(…
只要有可能,但请确保禁用该按钮,以便用户不会再次单击…这将导致递归。

您可以通过不时调用PeekMessage()查看消息队列,使windows确信您仍然活着并正在运行。这假设您可以在DoSomethingCallback()中执行此操作,即主线程没有完全挂起。将下面的循环视为伪代码,并利用您的想象力将其转换为您的需要

void DoSomethingCallback()
{
  // Loop that takes a long time
  while (true) {
    DoSomeStuff();
    MSG msg;
    PeekMessage(&msg, nil, 0, 0, PM_NOREMOVE);
    if (ShouldBreak()) {
      break;
    }
  }
}

通过不时调用PeekMessage(),您可以查看消息队列,以使windows确信您仍然处于活动状态。这假设您可以在DoSomethingCallback()中执行此操作,即主线程没有完全挂起。将下面的循环视为伪代码,并利用您的想象力将其转换为您的需要

void DoSomethingCallback()
{
  // Loop that takes a long time
  while (true) {
    DoSomeStuff();
    MSG msg;
    PeekMessage(&msg, nil, 0, 0, PM_NOREMOVE);
    if (ShouldBreak()) {
      break;
    }
  }
}

可能这会说服Windows,但不会说服用户。用户仍会认为应用程序崩溃,因为无法重新绘制/移动窗口。可能这会说服Windows,但不会说服用户。用户仍会认为应用程序崩溃,因为无法重新绘制/移动窗口。我愿意尝试此解决方案,因为这看起来是对我最有帮助的。但是,在尝试使用该函数时,我遇到了一个未声明的函数问题(“QueueUserWorkItem”未在此范围内声明)。我已经包含了windows.h(这是文档要求的)并链接到libkernel32.a。我缺少什么吗?来自MSDN,“要编译使用此函数的应用程序,请将_WIN32_WINNT定义为0x0500或更高版本。”希望有帮助。:)非常感谢。我以前确实尝试过,但它试图定义一个已经定义的值,我认为这是没有必要的。我在windef.h中更好地阅读了定义,因为它似乎需要这个值才能工作,所以我在包含windows.h之前定义了它,现在一切都很好。再次感谢。我愿意尝试这个sol注意,这看起来对我帮助最大。但是,在尝试使用该函数时,我遇到了一个未声明的函数问题(“QueueUserWorkItem”未在此范围内声明)。我已经包含了windows.h(文档要求的是该文件)并链接到libkernel32.a。我是否缺少o