关闭字体对话框时窗口失去焦点 #包括 #包括 LRESULT回调SecondWndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM) { 开关(msg) { 案例WM_RBUTTONUP: { HFONT-HFONT; LOGFONT-lf; 选择字体cf={0}; hFont=(hFont)GetStockObject(默认为GUI字体); GetObject(hFont、sizeof(LOGFONT)和lf); cf.Flags=cf_INITTOLOGFONTSTRUCT | cf_屏幕字体; cf.hwndOwner=hwnd; cf.lpLogFont=&lf; cf.lStructSize=sizeof(选择字体); 如果(选择字体(&cf)) { } } 打破 案例WM_结束: 窗口(hwnd); 打破 违约: 返回DefWindowProc(hwnd、msg、wParam、lParam); } 返回0; } LRESULT回调FirstWndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM) { 开关(msg) { 案例WM_销毁: PostQuitMessage(0); 打破 违约: 返回DefWindowProc(hwnd、msg、wParam、lParam); } 返回0; } int WINAPI_tWinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPTSTR lpCmdLine、int nShowCmd) { WNDCLASSEX wcFirst={0},wcSecond={0}; HWND hwndFirst,hwndSecond; 味精; wcFirst.cbSize=sizeof(WNDCLASSEX); wcFirst.hbrBackground=(HBRUSH)(颜色+1); wcFirst.hCursor=加载光标(0,IDC_箭头); wcFirst.hIcon=加载图标(0,IDI_应用程序); wcFirst.hInstance=hInstance; wcFirst.lpfnWndProc=FirstWndProc; wcFirst.lpszClassName=文本(“第一类”); wcSecond.cbSize=sizeof(WNDCLASSEX); wcSecond.hbrBackground=(HBRUSH)(颜色+1); wcSecond.hCursor=加载光标(0,IDC_箭头); wcSecond.hIcon=加载图标(0,IDI_应用程序); wcSecond.hInstance=hInstance; wcSecond.lpfnWndProc=SecondWndProc; wcSecond.lpszClassName=文本(“SecondClass”); 如果(!RegisterClassEx(&wcFirst)) 返回0; 如果(!RegisterClass(&wcSecond)) 返回0; hwndFirst=CreateWindowEx(0,文本(“第一类”)、文本(“第一窗口”)、WS_重叠窗口、CW_使用默认值、CW_使用默认值、, 700,400,0,0,0,0); 如果(!hwndFirst) 返回0; hwndSecond=CreateWindowEx(0,文本(“第二类”)、文本(“第二窗口”)、WS_OVERLAPPEDWINDOW、CW_USEDEFAULT、CW_USEDEFAULT、, 700,400,hwndFirst,0,hInstance,0); 如果(!hwndsond) 返回0; 显示窗口(hwndFirst、nShowCmd); 显示窗口(hwndSecond,nShowCmd); while(GetMessage(&msg,0,0,0)>0) { 翻译信息(&msg); 发送消息(&msg); } 返回(int)msg.wParam; }
在我关闭字体对话框和第二个窗口后,第一个窗口失去焦点并转到底部。另一个应用程序的窗口显示在顶部。只有当我关闭字体对话框,然后关闭第二个窗口时,才会发生这种情况。若只显示第一个窗口和第二个窗口,我关闭第二个窗口,第一个窗口不会失去焦点。如果要测试此应用程序,请确保在此应用程序下有另一个应用程序的窗口,然后再进行测试。为什么第一个窗口会失去焦点?您可以用MessageBox重现同样的问题。当第二个窗口被禁用/启用(而父窗口一直处于启用状态)并且第二个窗口关闭时,第一个窗口可能无法正确恢复<代码>WS_弹出窗口将修复此问题 当第二个窗口最小化而第一个窗口保持在顶部时,会出现另一个问题。您可以在第二个窗口中删除关闭字体对话框时窗口失去焦点 #包括 #包括 LRESULT回调SecondWndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM) { 开关(msg) { 案例WM_RBUTTONUP: { HFONT-HFONT; LOGFONT-lf; 选择字体cf={0}; hFont=(hFont)GetStockObject(默认为GUI字体); GetObject(hFont、sizeof(LOGFONT)和lf); cf.Flags=cf_INITTOLOGFONTSTRUCT | cf_屏幕字体; cf.hwndOwner=hwnd; cf.lpLogFont=&lf; cf.lStructSize=sizeof(选择字体); 如果(选择字体(&cf)) { } } 打破 案例WM_结束: 窗口(hwnd); 打破 违约: 返回DefWindowProc(hwnd、msg、wParam、lParam); } 返回0; } LRESULT回调FirstWndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM) { 开关(msg) { 案例WM_销毁: PostQuitMessage(0); 打破 违约: 返回DefWindowProc(hwnd、msg、wParam、lParam); } 返回0; } int WINAPI_tWinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPTSTR lpCmdLine、int nShowCmd) { WNDCLASSEX wcFirst={0},wcSecond={0}; HWND hwndFirst,hwndSecond; 味精; wcFirst.cbSize=sizeof(WNDCLASSEX); wcFirst.hbrBackground=(HBRUSH)(颜色+1); wcFirst.hCursor=加载光标(0,IDC_箭头); wcFirst.hIcon=加载图标(0,IDI_应用程序); wcFirst.hInstance=hInstance; wcFirst.lpfnWndProc=FirstWndProc; wcFirst.lpszClassName=文本(“第一类”); wcSecond.cbSize=sizeof(WNDCLASSEX); wcSecond.hbrBackground=(HBRUSH)(颜色+1); wcSecond.hCursor=加载光标(0,IDC_箭头); wcSecond.hIcon=加载图标(0,IDI_应用程序); wcSecond.hInstance=hInstance; wcSecond.lpfnWndProc=SecondWndProc; wcSecond.lpszClassName=文本(“SecondClass”); 如果(!RegisterClassEx(&wcFirst)) 返回0; 如果(!RegisterClass(&wcSecond)) 返回0; hwndFirst=CreateWindowEx(0,文本(“第一类”)、文本(“第一窗口”)、WS_重叠窗口、CW_使用默认值、CW_使用默认值、, 700,400,0,0,0,0); 如果(!hwndFirst) 返回0; hwndSecond=CreateWindowEx(0,文本(“第二类”)、文本(“第二窗口”)、WS_OVERLAPPEDWINDOW、CW_USEDEFAULT、CW_USEDEFAULT、, 700,400,hwndFirst,0,hInstance,0); 如果(!hwndsond) 返回0; 显示窗口(hwndFirst、nShowCmd); 显示窗口(hwndSecond,nShowCmd); while(GetMessage(&msg,0,0,0)>0) { 翻译信息(&msg); 发送消息(&msg); } 返回(int)msg.wParam; },c,winapi,C,Winapi,在我关闭字体对话框和第二个窗口后,第一个窗口失去焦点并转到底部。另一个应用程序的窗口显示在顶部。只有当我关闭字体对话框,然后关闭第二个窗口时,才会发生这种情况。若只显示第一个窗口和第二个窗口,我关闭第二个窗口,第一个窗口不会失去焦点。如果要测试此应用程序,请确保在此应用程序下有另一个应用程序的窗口,然后再进行测试。为什么第一个窗口会失去焦点?您可以用MessageBox重现同样的问题。当第二个窗口被禁用/启用(而父窗口一直处于启用状态)并且第二个窗口关闭时,第一个窗口可能无法正确恢复WS_弹出窗
WS\u最小化ebox
,以停止该操作。您还可以使用SetFocus(GetWindow(hwnd,GW_OWNER))
重置焦点
#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK SecondWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_RBUTTONUP:
{
HFONT hFont;
LOGFONT lf;
CHOOSEFONT cf = {0};
hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
GetObject(hFont, sizeof(LOGFONT), &lf);
cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
cf.hwndOwner = hwnd;
cf.lpLogFont = &lf;
cf.lStructSize = sizeof(CHOOSEFONT);
if(ChooseFont(&cf))
{
}
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK FirstWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX wcFirst = {0}, wcSecond = {0};
HWND hwndFirst, hwndSecond;
MSG msg;
wcFirst.cbSize = sizeof(WNDCLASSEX);
wcFirst.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wcFirst.hCursor = LoadCursor(0, IDC_ARROW);
wcFirst.hIcon = LoadIcon(0, IDI_APPLICATION);
wcFirst.hInstance = hInstance;
wcFirst.lpfnWndProc = FirstWndProc;
wcFirst.lpszClassName = TEXT("FirstClass");
wcSecond.cbSize = sizeof(WNDCLASSEX);
wcSecond.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wcSecond.hCursor = LoadCursor(0, IDC_ARROW);
wcSecond.hIcon = LoadIcon(0, IDI_APPLICATION);
wcSecond.hInstance = hInstance;
wcSecond.lpfnWndProc = SecondWndProc;
wcSecond.lpszClassName = TEXT("SecondClass");
if(!RegisterClassEx(&wcFirst))
return 0;
if(!RegisterClassEx(&wcSecond))
return 0;
hwndFirst = CreateWindowEx(0, TEXT("FirstClass"), TEXT("First Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
700, 400, 0, 0, hInstance, 0);
if(!hwndFirst)
return 0;
hwndSecond = CreateWindowEx(0, TEXT("SecondClass"), TEXT("Second Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
700, 400, hwndFirst, 0, hInstance, 0);
if(!hwndSecond)
return 0;
ShowWindow(hwndFirst, nShowCmd);
ShowWindow(hwndSecond, nShowCmd);
while(GetMessage(&msg, 0, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
这与第二个窗口是自有窗口有关。另一个主要错误是对话框与第一个窗口不是模态的,可能是相关的。戳了一会儿,但我找不到缺陷。
LRESULT CALLBACK SecondWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_RBUTTONUP:
MessageBox(hwnd, TEXT("Test"), 0, 0);
break;
case WM_CLOSE:
SetFocus(GetWindow(hwnd, GW_OWNER));//force parent window to restore
DestroyWindow(hwnd);
break;
//...
hwndSecond = CreateWindowEx(WS_EX_CONTROLPARENT, TEXT("SecondClass"), TEXT("Second Window"),
WS_POPUP | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MAXIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 700, 400, hwndFirst, 0, hInstance, 0);