C 按钮没有';设置菜单值时不显示,未设置时显示奇数样式

C 按钮没有';设置菜单值时不显示,未设置时显示奇数样式,c,winapi,button,parent,C,Winapi,Button,Parent,我想设置一个特定的窗口作为按钮的父窗口,但是我得到了一个预期的行为 设置CreateWindow()上的humenu值时,按钮不显示: 但是,当我删除humenu参数时,按钮确实会出现,但样式很奇怪: 我没有将主窗口的CreateWindow()返回的HWND传递到按钮的hwndpent,因为它们不是按该顺序调用的 下面的代码是我真实代码的简化版本 我错过了什么 完整代码: #pragma comment(lib, "user32.lib") #pragma commen

我想设置一个特定的窗口作为按钮的父窗口,但是我得到了一个预期的行为

设置
CreateWindow()
上的
humenu
值时,按钮不显示:

但是,当我删除
humenu
参数时,按钮确实会出现,但样式很奇怪:

我没有将主窗口的
CreateWindow()
返回的
HWND
传递到按钮的
hwndpent
,因为它们不是按该顺序调用的

下面的代码是我真实代码的简化版本

我错过了什么

完整代码:

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "Comctl32.lib")
#pragma comment(lib, "Gdi32.lib")

#define WIN32_LEAN_AND_MEAN
#define UNICODE
#define _UNICODE

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PWSTR pCmdLine, int nCmdShow) {

  MSG  msg = {0};
  WNDCLASSW wc = {0};

  wc.lpszClassName = L"Window";
  wc.hInstance     = hInstance;
  wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
  wc.lpfnWndProc   = WndProc;
  wc.hCursor = LoadCursor(0, IDC_ARROW);
  
  RegisterClassW(&wc);
  
  HWND
  hwndMainWindow = CreateWindow(wc.lpszClassName, L"Window",
                    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                    CW_USEDEFAULT, CW_USEDEFAULT, 500, 350, 
                    NULL, NULL, hInstance, NULL);
    HWND hButton = CreateWindow(L"Button",
                                L"Click me!",
                            WS_TABSTOP,
                            20, 
                            50,
                            60,
                            90,
                            NULL, 
                            NULL, 
                            NULL, NULL); 

    SetParent(hButton, hwndMainWindow);
    ShowWindow(hButton, SW_SHOWNORMAL);
    UpdateWindow(hwndMainWindow);

  while (GetMessage(&msg, NULL, 0, 0))
  {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
  }
  
  return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

  switch(msg)
  {
      case WM_CLOSE:
        DestroyWindow(hwnd);
        break;

      case WM_DESTROY:
          PostQuitMessage(0);
          return 0;
  }

  return DefWindowProcW(hwnd, msg, wParam, lParam);
}
#pragma注释(lib,“user32.lib”)
#pragma注释(lib,“Comctl32.lib”)
#pragma注释(lib,“Gdi32.lib”)
#定义WIN32_精益_和_平均值
#定义UNICODE
#定义UNICODE
#包括
LRESULT回调WndProc(HWND、UINT、WPARAM、LPARAM);
int WINAPI wWinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、,
PWSTR pCmdLine,int nCmdShow){
MSG={0};
WNDCLASSW wc={0};
wc.lpszClassName=L“窗口”;
wc.hInstance=hInstance;
wc.hbrBackground=GetSysColorBrush(颜色面);
wc.lpfnWndProc=WndProc;
wc.hCursor=加载光标(0,IDC_箭头);
注册分类(&wc);
HWND
hwndMainWindow=CreateWindow(wc.lpszClassName,L“Window”,
WS|U重叠窗口| WS|U可见,
CW_USEDEFAULT,CW_USEDEFAULT,500350,
NULL,NULL,hInstance,NULL);
HWND hButton=CreateWindow(L“按钮”,
L“点击我!”,
W_TABSTOP,
20, 
50,
60,
90,
无效的
无效的
空,空);
SetParent(hButton,HwndMain窗口);
显示窗口(hButton,SW_SHOWNORMAL);
更新窗口(HWndMain窗口);
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
返回(int)msg.wParam;
}
LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(msg)
{
案例WM_结束:
窗口(hwnd);
打破
案例WM_销毁:
PostQuitMessage(0);
返回0;
}
返回DefWindowProcW(hwnd、msg、wParam、lParam);
}

您没有在按钮上指定
WS\u CHILD
样式
SetParent()
不会为您设置此样式

设置没有
WS\u CHILD
的窗口的“父窗口”时,实际上是在设置其“所有者”。另见

您的按钮不会出现在主窗口中,因为该按钮不是主窗口的子窗口

因此,在创建按钮时,您需要包含
WS\u CHILD
样式。您还应该包括
WS\u VISIBLE
样式,而不是使用
ShowWindow()
(除非您希望创建最初隐藏的按钮)。您应该在创建时指定父窗口,而不是使用
SetParent()

您还应该将按钮创建移动到主窗口的
WndProc()
WM\u CREATE
处理程序中

试试这个:

#pragma注释(lib,“user32.lib”)
#pragma注释(lib,“Comctl32.lib”)
#pragma注释(lib,“Gdi32.lib”)
#定义WIN32_精益_和_平均值
#定义UNICODE
#定义UNICODE
#包括
LRESULT回调WndProc(HWND、UINT、WPARAM、LPARAM);
int WINAPI wWinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、,
PWSTR pCmdLine,int nCmdShow){
MSG={0};
WNDCLASS wc={0};
wc.lpszClassName=L“窗口”;
wc.hInstance=hInstance;
wc.hbrBackground=GetSysColorBrush(颜色面);
wc.lpfnWndProc=WndProc;
wc.hCursor=加载光标(0,IDC_箭头);
注册类(&wc);
HWNDhwndMainWindow=CreateWindow(wc.lpszClassName,L“Window”,
WS_重叠窗口,
CW_USEDEFAULT,CW_USEDEFAULT,500350,
NULL,NULL,hInstance,NULL);
ShowWindow(HWndMain窗口、SW_SHOWNORMAL);
更新窗口(HWndMain窗口);
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
返回(int)msg.wParam;
}
LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(msg)
{
案例WM_创建:
创建窗口(L“按钮”,
L“点击我!”,
WS|u CHILD | WS|u VISIBLE | WS|u TABSTOP,
20, 
50,
60,
90,
hwnd,
(h)1,
空,空);
打破
case WM_命令:
if((LOWORD(wParam)==1)和&(HIWORD(wParam)==BN){
MessageBox(hwnd,L“是的,你点击了我!”,L“窗口”,MB_OK);
返回0;
}
打破
案例WM_结束:
窗口(hwnd);
打破
案例WM_销毁:
PostQuitMessage(0);
返回0;
}
返回DefWindowProc(hwnd、msg、wParam、lParam);
}

您没有在按钮上指定
WS\u CHILD
样式
SetParent()
不会为您设置此样式

设置没有
WS\u CHILD
的窗口的“父窗口”时,实际上是在设置其“所有者”。另见

您的按钮不会出现在主窗口中,因为该按钮不是主窗口的子窗口

因此,在创建按钮时,您需要包含
WS\u CHILD
样式。您还应该包括
WS\u VISIBLE
样式,而不是使用
ShowWindow()
(除非您希望创建最初隐藏的按钮)。你呢
CreateWindow(L"Button",
                        L"Click me!",
                        WS_TABSTOP,
                        20, 
                        50,
                        60,
                        90,
                        NULL, 
                        NULL, 
                        NULL, NULL); 
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "Comctl32.lib")
#pragma comment(lib, "Gdi32.lib")

#define WIN32_LEAN_AND_MEAN
#define UNICODE
#define _UNICODE

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PWSTR pCmdLine, int nCmdShow) {

  MSG  msg = {0};
  WNDCLASSW wc = {0};

  wc.lpszClassName = L"Window";
  wc.hInstance     = hInstance;
  wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
  wc.lpfnWndProc   = WndProc;
  wc.hCursor = LoadCursor(0, IDC_ARROW);
  
  RegisterClassW(&wc);
  
  HWND
  hwndMainWindow = CreateWindow(wc.lpszClassName, L"Window",
                    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                    CW_USEDEFAULT, CW_USEDEFAULT, 500, 350, 
                    NULL, NULL, hInstance, NULL);
    HWND hButton = CreateWindow(L"Button",
                                L"Click me!",
                            WS_TABSTOP,
                            20, 
                            50,
                            60,
                            90,
                            NULL, 
                            NULL, 
                            NULL, NULL); 

    SetParent(hButton, hwndMainWindow);
    ShowWindow(hButton, SW_SHOWNORMAL);
    UpdateWindow(hwndMainWindow);

  while (GetMessage(&msg, NULL, 0, 0))
  {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
  }
  
  return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

  switch(msg)
  {
      case WM_CLOSE:
        DestroyWindow(hwnd);
        break;

      case WM_DESTROY:
          PostQuitMessage(0);
          return 0;
  }

  return DefWindowProcW(hwnd, msg, wParam, lParam);
}