Miz*_*una 4 c++ winapi controls dialog
我刚刚开始尝试使用 win32,但遇到了一个问题。
BOOL CALLBACK UnsavedChangesProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND dHandle = GetActiveWindow();
switch (msg)
{
case WM_INITDIALOG:
MessageBox(NULL, "In InitDialog", 0, 0);
SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));
char error[10];
sprintf_s(error, "%d", GetLastError());
MessageBox(NULL, error, 0, 0);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDSAVE:
DoFileSave(hwnd);
EndDialog(hwnd, TRUE);
PostQuitMessage(0);
break;
case IDEXIT:
EndDialog(hwnd, TRUE);
PostQuitMessage(0);
break;
}
break;
case WM_CLOSE:
EndDialog(hwnd, FALSE);
break;
default:
return FALSE;
}
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
GetLastError() 返回 1421,未找到控件 ID,但 ID (1004) 肯定对应于我试图更改的静态控件。我还尝试使用控件名称 (IDC_STATIC_UNSAVED) 调用该函数,但没有成功。奇怪的部分是,如果我将函数调用移动到声明 dHandle 的位置(或去掉 dHandle 并在那里的函数内部调用 GetActiveWindow()),文本会更改,但它会闪烁,因为每次发送消息时都会调用该函数循环迭代。
是否有一个简单的原因使我丢失了这不应该起作用?任何帮助将不胜感激。
对话窗口在hwnd参数中传递给您的处理程序。没有必要调用GetActiveWindow()- 事实上,HWND当对话框不是活动窗口时,它会给你另一个窗口的 。
所以,更换
HWND dHandle = GetActiveWindow();
SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));
Run Code Online (Sandbox Code Playgroud)
和
SetDlgItemText(hwnd, 1004, "There are unsaved changes to \"");
Run Code Online (Sandbox Code Playgroud)