首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置菜单值时按钮不显示,未设置时显示奇怪样式

设置菜单值时按钮不显示,未设置时显示奇怪样式
EN

Stack Overflow用户
提问于 2021-01-08 06:02:24
回答 1查看 35关注 0票数 0

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

CreateWindow()上设置hMenu值时,按钮不会显示:

代码语言:javascript
运行
复制
CreateWindow(L"Button",
                            L"Click me!",
                            WS_TABSTOP,
                            20, 
                            50,
                            60,
                            90,
                            NULL, 
                            (HMENU)1, 
                            NULL, NULL); 

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

代码语言:javascript
运行
复制
CreateWindow(L"Button",
                        L"Click me!",
                        WS_TABSTOP,
                        20, 
                        50,
                        60,
                        90,
                        NULL, 
                        NULL, 
                        NULL, NULL); 

我没有将主窗口的CreateWindow()返回的HWND传递给按钮的hwndParent,因为它们不是按这个顺序调用的。

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

我遗漏了什么?

完整代码:

代码语言:javascript
运行
复制
#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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-08 07:13:42

您没有在按钮上指定WS_CHILD样式。SetParent()不会为您设置此样式。

当你设置一个没有WS_CHILD的窗口的“父窗口”时,你实际上是在设置它的“所有者”。Owner and Parent are not the same thing。另请参阅A window can have a parent or an owner but not both

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

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

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

试试这个:

代码语言:javascript
运行
复制
#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};
  WNDCLASS wc = {0};

  wc.lpszClassName = L"Window";
  wc.hInstance     = hInstance;
  wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
  wc.lpfnWndProc   = WndProc;
  wc.hCursor       = LoadCursor(0, IDC_ARROW);
  
  RegisterClass(&wc);
  
  HWNDhwndMainWindow = CreateWindow(wc.lpszClassName, L"Window",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT, CW_USEDEFAULT, 500, 350, 
                           NULL, NULL, hInstance, NULL);

  ShowWindow(hwndMainWindow, 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_CREATE:
          CreateWindow(L"Button",
                       L"Click me!",
                       WS_CHILD | WS_VISIBLE | WS_TABSTOP,
                       20, 
                       50,
                       60,
                       90,
                       hwnd,
                       (HMENU)1, 
                       NULL, NULL); 
          break;

      case WM_COMMAND:
          if ((LOWORD(wParam) == 1) && (HIWORD(wParam) == BN_CLICKED)) {
              MessageBox(hwnd, L"Yea, you clicked me!", L"Window", MB_OK);
              return 0;
          }
          break;

      case WM_CLOSE:
          DestroyWindow(hwnd);
          break;

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

  return DefWindowProc(hwnd, msg, wParam, lParam);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65620582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档