【问题标题】:Win32 - Button images appear in wrong order in toolbarWin32 - 按钮图像在工具栏中以错误的顺序显示
【发布时间】:2021-08-17 22:40:00
【问题描述】:

我正在使用 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 的新手,我不知道这是什么原因。该应用程序仍然运行良好,但按钮图像完全错误。我怎样才能解决这个问题?是因为我的代码还是我创建的位图导致了问题?

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

【问题讨论】:

  • 我测试了代码,没有问题。我认为问题是由创建的位图引起的。您能否提供创建的位图以帮助我们重现问题?
  • 我不知道如何将 .bmp 文件上传到 Stack Overflow,所以这里是 google Drive link to the bitmap i used。和我问题中的位图一样
  • TB_ADDBITMAPwParam 参数应该是位图中的图像数量,而您传递的 sizeof(tbBitmap) / sizeof(TBADDBITMAP) 将等于 1。
  • 我把你说的参数改成按钮的个数(这里是10个),问题依旧。

标签: c++ visual-studio winapi


【解决方案1】:

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

它确实有一些奇怪的行为。在我第一次构建项目之后,它确实产生了你说的问题。但是我重建后,问题就消失了:

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

【讨论】:

  • 我多次重建项目,但问题仍然存在。但是,我创建了一个新的位图,它现在可以工作了。有关详细信息,请参阅我的问题中的新编辑。
  • @Halsey 经过我的测试,发现Visual Studio会修改图片。需要进入资源视图->位图选择位图,然后保存,就可以正常显示了。
  • 感谢您的不断回复。我听从了你的建议,情况仍然存在(第一个位图仍然导致问题,其他两个工作)。我不知道它有什么问题。
  • @Halsey 查了三个位图(通过记事本打开),发现BMv开头的位图可以正常显示,而BM6开头的位图会出现这个问题。我觉得你的位图格式有问题,不过我可以通过在VS中保存位图来修改。
  • @Zhu 成功了。真的如你所说。我修改并保存了第一个位图(在您提到的资源视图中),现在它可以正常显示了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2014-01-16
  • 2011-04-20
相关资源
最近更新 更多