Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Win32-按钮图像在工具栏中的显示顺序错误_C++_Visual Studio_Winapi - Fatal编程技术网

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

C++ Win32-按钮图像在工具栏中的显示顺序错误,c++,visual-studio,winapi,C++,Visual Studio,Winapi,我正在使用win32 api(在visual studio中)创建一个简单的绘画应用程序。我创建了一个工具栏,并为10个工具栏图像(TBbuttons.bmp-大小:160x16像素-4bpp索引格式)添加了位图,如下所示: 但是,按钮图像的显示顺序不正确,如上图所示,此外,一些图像上方有一条黑线(这不是我想要的): 以下是我用来创建工具栏和按钮的代码: InitCommonControls(); //create initial buttons TBBUTTON t

我正在使用win32 api(在visual studio中)创建一个简单的绘画应用程序。我创建了一个工具栏,并为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);
InitCommonControls();
//创建初始按钮
TBBUTTON tbButtons[]=
{
{STD_FILENEW,IDM_NEW,TBSTATE_ENABLED,TBSTYLE_按钮,0,0},
{STD_FILEOPEN,IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_按钮,0,0},
{STD_FILESAVE,IDM_SAVE,TBSTATE_ENABLED,TBSTYLE_按钮,0,0}
};
//创建工具栏窗口
HWND hToolBarWnd=CreateToolbarEx(hWndParent,
WS|U CHILD | WS|U VISIBLE | CCS|U可调| TBSTYLE|U工具提示,
ID_工具栏,sizeof(tbButtons)/sizeof(TBBUTTON),HINST_COMMCTRL,
0,tbButtons,sizeof(tbButtons)/sizeof(tbButtons),
按钮宽度,按钮高度,图像宽度,图像高度,
sizeof(TBBUTTON));
//添加更多按钮
TBBUTTON按钮已加载[]=
{
{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
{STD_CUT,IDM_CUT,TBSTATE_ENABLED,TBSTYLE_按钮,0,0},
{STD_COPY,IDM_COPY,TBSTATE_ENABLED,TBSTYLE_按钮,0,0},
{STD_粘贴,IDM_粘贴,TBSTATE_启用,TBSTYLE_按钮,0,0},
{STD_DELETE,IDM_DELETE,TBSTATE_ENABLED,TBSTYLE_按钮,0,0}
};
SendMessage(hToolBarWnd,TB_ADDBUTTONS,(WPARAM)sizeof(buttonsLoadd)/sizeof(TBBUTTON),
(LPRAM)(LPTBBUTTON)和按钮加载);
//再创建10个按钮进行绘制
TBBUTTON用户按钮[]=
{   
{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
{0,IDM_椭圆,TBSTATE_启用,TBSTYLE_按钮,0,0},
{1,IDM_填充_椭圆,TBSTATE_启用,TBSTYLE_按钮,0,0},
{2,IDM_RECT,TBSTATE_ENABLED,TBSTYLE_按钮,0,0},
{3,IDM_填充,TBSTATE_启用,TBSTYLE_按钮,0,0},
{4,IDM_圆,TBSTATE_启用,TBSTYLE_按钮,0,0},
{5,IDM_填充_圆,TBSTATE_启用,TBSTYLE_按钮,0,0},
{6,IDM_正方形,TBSTATE_启用,TBSTYLE_按钮,0,0},
{7,IDM_填充_正方形,TBSTATE_启用,TBSTYLE_按钮,0,0},
{8,IDM_行,TBSTATE_已启用,TBSTYLE_按钮,0,0},
{9,IDM_文本,TBSTATE_已启用,TBSTYLE_按钮,0,0}
};
TBADDBITMAP tbBitmap={hInst,IDB_BITMAP1};
//将位图添加到工具栏
int idx=SendMessage(hToolBarWnd,TB_ADDBITMAP,(WPARAM)sizeof(tbBitmap)/sizeof(TBADDBITMAP),
(lpram)(LPTBADDBITMAP)和tbBitmap);

对于(int i=1;i我尝试创建一个示例并使用位图

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


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

我测试了代码,它没有问题。我认为问题是由创建的位图引起的。您能提供创建的位图来帮助我们重现问题吗?我不知道如何将.bmp文件上载到堆栈Overflow这是谷歌硬盘。它与我问题中的位图相同,
TB_ADDBITMAP
wParam
参数应该是位图中的图像数,而你传递的
sizeof(tbBitmap)/sizeof(TBADDBITMAP)
将等于1。我将你说的参数改为按钮数(这里是10)问题仍然存在。我多次重建项目,但问题仍然存在。但是,我创建了一个新的位图,现在它工作了。有关详细信息,请参阅问题中的新编辑。@Halsey在我的测试后,我发现Visual Studio将修改图片。您需要输入“资源视图”->“位图”来选择位图,然后然后保存它,它就可以正常显示了。感谢您不断的回复。我听从了您的建议,情况仍然存在(第一个位图仍然会导致问题,其他两个工作)。我不知道它出了什么问题。@Halsey我检查了三个位图(通过记事本打开),我发现以BMv开头的位图可以正常显示,而以BM6开头的位图会有这个问题。我认为您的位图格式有问题,但我可以通过在VS中保存位图来修改它。@Zhu,这就做到了。真的正如您所说的。我修改并保存了第一个位图(在您提到的资源视图中)并且它现在正常显示。