AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79542659
Accepted
gene b.
gene b.
Asked: 2025-03-29 09:17:09 +0800 CST2025-03-29 09:17:09 +0800 CST 2025-03-29 09:17:09 +0800 CST

Adicione e posicione o controle ComboBox no início de uma barra de ferramentas com outros botões seguindo

  • 772

No meu aplicativo Win32, tenho uma barra de ferramentas que precisa ter uma caixa de combinação principal suspensa abrangendo 70% da barra de ferramentas, começando pela esquerda, e depois quaisquer botões adicionais (como neste caso Recortar/Copiar/Colar) seguindo depois — talvez depois de um pequeno separador.

[--------------------Dropdown-------------------V] | [Cut][Copy][Paste]

Neste código, primeiro crio o controle ComboBox filho para a barra de ferramentas e faço com que ele tenha 70% da largura do Toolbar Rect usando setWindowPose então prossigo com botões regulares. Mas apenas os 3 botões são exibidos sem o ComboBox.

Acho que tenho que fazer isso SetWindowPospara cada um dos botões, mas quero que eles fluam naturalmente sem posicioná-los explicitamente, como aconteceria sem a caixa de combinação.

void CreateToolbar1(HWND hWndParent)
{
    // Declare and initialize local constants.
    const int ImageListID = 0;
    const int numButtons = 3;
    const int bitmapSize = 16;

    const DWORD buttonStyles = BTNS_AUTOSIZE;

    // Create the toolbar.
    hWndToolbar1 = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
        WS_CHILD | TBSTYLE_WRAPABLE | TBSTYLE_FLAT, 0, 0, 0, 0,
        hWndParent, NULL, GetModuleHandle(NULL), NULL);

    // Obtain toolbar's rectangle coordinates
    RECT rectToolbar1;
    SendMessage(hWndToolbar1, TB_GETITEMRECT, (WPARAM)0, (LPARAM)&rectToolbar1);

    // Add ComboBox control to toolbar, should take up 70% of the width
    HWND hWndDropdown = CreateWindowEx(WS_EX_CLIENTEDGE, WC_COMBOBOXEX, NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST, 0, 0, 100, 35, hWndToolbar1, NULL, GetModuleHandle(NULL), NULL);
    SetWindowPos(hWndDropdown, NULL, rectToolbar1.left, rectToolbar1.top, 0.7 * (rectToolbar1.right - rectToolbar1.left), rectToolbar1.bottom - rectToolbar1.top, SWP_SHOWWINDOW);

    // Add 3 regular buttons afterwards (Cut/Copy/Paste)
    // ---
    // Create the image list.
    g_hImageList = ImageList_Create(bitmapSize, bitmapSize,   // Dimensions of individual bitmaps.
        ILC_COLOR16 | ILC_MASK,   // Ensures transparent background.
        numButtons, 0);

    // Set the image list.
    SendMessage(hWndToolbar1, TB_SETIMAGELIST,
        (WPARAM)ImageListID,
        (LPARAM)g_hImageList);

    // Load the button images.
    SendMessage(hWndToolbar1, TB_LOADIMAGES,
        (WPARAM)IDB_STD_SMALL_COLOR,
        (LPARAM)HINST_COMMCTRL);

    // Initialize buttons Cut/Copy/Paste
    TBBUTTON tbButtons[numButtons] =
    {
        { MAKELONG(STD_CUT,  ImageListID), IDM_CUT,  TBSTATE_ENABLED, buttonStyles, {0}, 0, (INT_PTR)L"Cut" },
        { MAKELONG(STD_COPY, ImageListID), IDM_COPY, TBSTATE_ENABLED, buttonStyles, {0}, 0, (INT_PTR)L"Copy"},
        { MAKELONG(STD_PASTE, ImageListID), IDM_PASTE, 0,               buttonStyles, {0}, 0, (INT_PTR)L"Paste"}
    };

    // Add buttons.
    SendMessage(hWndToolbar1, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    SendMessage(hWndToolbar1, TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)&tbButtons);

    // Resize the toolbar, and then show it.
    SendMessage(hWndToolbar1, TB_AUTOSIZE, 0, 0);
    ShowWindow(hWndToolbar1, TRUE);

}
winapi
  • 1 1 respostas
  • 42 Views

1 respostas

  • Voted
  1. Best Answer
    IInspectable
    2025-03-29T23:20:52+08:002025-03-29T23:20:52+08:00

    Mas apenas os 3 botões são exibidos

    Este é o resultado da colaboração de duas edições individuais:

    1. O código que tenta fazer com que a largura da caixa de combinação seja 70% da largura da barra de ferramentas faz com que ela seja 70% da largura de um botão da barra de ferramentas .
    2. A suposição de que um controle da barra de ferramentas poderia de alguma forma inferir as expectativas de layout de um cliente com base na presença de um controle filho é infundada.

    O primeiro problema significa que, embora a caixa de combinação esteja lá, você nem consegue vê-la. Ela está completamente escondida atrás do primeiro botão da barra de ferramentas. Exceto por alterar o código para calcular a largura desejada, nada mais precisa ser feito.

    A segunda questão precisa de mais atenção. Para entender os princípios básicos, aqui está a definição de um controle de barra de ferramentas :

    Uma barra de ferramentas é um controle que contém um ou mais botões.

    Notavelmente, um controle de barra de ferramentas não fornece suporte dedicado para hospedar controles arbitrários. O tópico da documentação How to Embed Nonbutton Controls in Toolbars é ainda mais explícito:

    As barras de ferramentas suportam apenas botões

    Um corolário disso é que todas as informações de layout são armazenadas em um TBBUTTONarray que é atribuído via TB_ADDBUTTONSmensagem. Cada elemento descreve um botão ou um separador. A solução alternativa para adicionar controles arbitrários a uma barra de ferramentas é adicionar um separador (da largura desejada em pixels) ao TBBUTTONarray para reservar espaço para o controle, por exemplo:

        TBBUTTON tbButtons[numButtons] =
        {
            { cb_width, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, -1 },
            { MAKELONG(STD_CUT,  ImageListID), IDM_CUT,  TBSTATE_ENABLED, buttonStyles, {0}, 0, (INT_PTR)L"Cut" },
            { MAKELONG(STD_COPY, ImageListID), IDM_COPY, TBSTATE_ENABLED, buttonStyles, {0}, 0, (INT_PTR)L"Copy"},
            { MAKELONG(STD_PASTE, ImageListID), IDM_PASTE, 0,               buttonStyles, {0}, 0, (INT_PTR)L"Paste"}
        };
    

    A primeira entrada reserva espaço para o controle combo box. É literalmente um placeholder que não recebe entrada do usuário. Embora isso funcione, parece muito desajeitado.

    Uma solução melhor é usar um controle Rebar . Entre outros recursos, ele oferece suporte dedicado para hospedar controles arbitrários.

    • 2

relate perguntas

  • Quando é o momento correto para enviar a mensagem WM_SETFONT para um filho de controle estático de uma janela principal no win32?

  • O acesso a uma estrutura de dados postada por meio de PostThreadMessage() é serializado por vários threads de recebimento?

  • Você pode traduzir um código de erro GetLastError() no nome do #define?

  • O compilador não consegue encontrar `um` em `winapi`

  • Diferença entre: VOID, PVOID, LPVOID [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve