Win32 - 按钮图像在工具栏中显示的顺序错误

问题描述 投票:0回答:2

我正在使用 win32 api (在 Visual Studio 中)创建一个简单的 Paint 应用程序。我创建了一个工具栏并添加了 10 个工具栏图像的位图(TBbuttons.bmp - 大小:160x16 像素 - 4bpp 索引格式),如下所示:

但是,按钮图像并未以正确的顺序出现,如上所示,而且,某些图像上方有一条黑线(这不是我想要的):

这是我用来创建工具栏以及这些按钮的代码:

    InitCommonControls();
    //create initial buttons
    TBBUTTON tbButtons[] =
    {
        { STD_FILENEW,  IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
        { STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
        { STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}
    };

    //Create toolbar window
    HWND hToolBarWnd = CreateToolbarEx(hWndParent,
        WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_TOOLTIPS,
        ID_TOOLBAR, sizeof(tbButtons) / sizeof(TBBUTTON), HINST_COMMCTRL,
        0, tbButtons, sizeof(tbButtons) / sizeof(TBBUTTON),
        BUTTON_WIDTH, BUTTON_HEIGHT, IMAGE_WIDTH, IMAGE_HEIGHT,
        sizeof(TBBUTTON));

    //Add more buttons
    TBBUTTON buttonsToAdd[] =
    {
        { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 },
        { STD_CUT,  IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }
    };
    SendMessage(hToolBarWnd, TB_ADDBUTTONS, (WPARAM)sizeof(buttonsToAdd) / sizeof(TBBUTTON),
        (LPARAM)(LPTBBUTTON)&buttonsToAdd);

    //Create 10 more buttons to draw
    TBBUTTON userButtons[] =
    {   
        { 0, 0,                     TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 },
        { 0, IDM_ELLIPSE,           TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { 1, IDM_FILLED_ELLIPSE,    TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { 2, IDM_RECT,              TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { 3, IDM_FILLED_RECT,       TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { 4, IDM_CIRCLE,            TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { 5, IDM_FILLED_CIRCLE,     TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { 6, IDM_SQUARE,            TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { 7, IDM_FILLED_SQUARE,     TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { 8, IDM_LINE,              TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
        { 9, IDM_TEXT,              TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }
    };

    TBADDBITMAP tbBitmap = { hInst, IDB_BITMAP1 };
    //Add bitmap to toolbar
    int idx = SendMessage(hToolBarWnd, TB_ADDBITMAP, (WPARAM)sizeof(tbBitmap) / sizeof(TBADDBITMAP),
        (LPARAM)(LPTBADDBITMAP)&tbBitmap);
    for (int i = 1; i <= 10; i++) {
        userButtons[i].iBitmap += idx;
    }

    //Add button to toolbar
    SendMessage(hToolBarWnd, TB_ADDBUTTONS, (WPARAM)sizeof(userButtons) / sizeof(TBBUTTON),
        (LPARAM)(LPTBBUTTON)&userButtons);

我对 win32 api 还是个新手,我不知道这是什么原因。该应用程序仍然运行良好,但按钮图像完全错误。我怎样才能解决这个问题?是因为我的代码还是我创建的位图导致了这个问题?

编辑:我添加了从互联网上找到的新位图(TBbitmap2.bmp)作为测试,并重新创建了与第一个类似的另一个位图(TBbitmap3.bmp)。在所有 3 个位图中,第一个位图产生了问题中的问题,其他 2 个位图工作正常。这是所有 3 个位图的链接。问题仍然是 为什么第一个位图不断产生问题,而其他 2 个位图却有效?(它们具有相同的属性,只是大小不同)。

c++ visual-studio winapi
2个回答
1
投票

我尝试创建一个示例并使用位图。

它确实有一些奇怪的行为。我第一次搭建项目后,确实出现了你说的问题。但我重建后,问题就消失了:

我认为在构建过程中位图没有正确加载,也许你可以尝试重建项目并运行程序。


0
投票

默认的工具栏按钮图像大小不是 16 x 16,而是 16 x 15。确切的大小将显示在 .rc 文件中的工具栏资源声明中。

此外,一些绘画程序(例如 Paint.net)即使可以保存例如4 位 BMP 的工作方式与 Visual Studio 的工作方式不同,这可能会导致按钮出现在错误的位置。

© www.soinside.com 2019 - 2024. All rights reserved.