繁体   English   中英

WinAPI:tabcontrol,图像和换行符

[英]WinAPI: tabcontrol, images and line breaks

我正在使用带有选项卡的子窗口来显示程序的结果。 选项卡上不需要按钮或其他控件,仅需要一些文本和图像。 但是,到目前为止,我所能实现的就是在标签上放置一些没有换行符的文本。

这是我用来创建输出窗口的方法:

LRESULT CALLBACK ChildProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    TCITEMW tie;
    INITCOMMONCONTROLSEX icex;

    switch(msg) {

        case WM_CREATE:

          icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
          icex.dwICC = ICC_TAB_CLASSES;
          InitCommonControlsEx(&icex);

          // Create tab control
          hTab = CreateWindowW(WC_TABCONTROLW, NULL, WS_CHILD | WS_VISIBLE,
                0, 0, X_FENSTER-15, Y_FENSTER-120, hWnd,(HMENU) ID_TABCTRL, NULL, NULL);

        // Create 8 tabs
        int i;
            tie.mask = TCIF_TEXT;
            for (i = 0; i < 8; i++){
                // Set labels for tab 
                switch(i){
                    case 0: tie.pszText = L"Übersicht";
                            break;
                    case 1: tie.pszText = L"Einzel";
                            break;
                    case 2: tie.pszText = L"Topol. 1";
                            break;
                    case 3: tie.pszText = L"Topol. 2";
                            break;
                    case 4: tie.pszText = L"Topol. 3";
                            break;
                    case 5: tie.pszText = L"Topol. 4";
                            break;
                    case 6: tie.pszText = L"Topol. 5";
                            break;
                    case 7: tie.pszText = L"Topol. 6";
                            break;
                }

                // Create tab          
                SendMessageW(hTab, TCM_INSERTITEMW, (LRESULT)i, (LPARAM) (LPTCITEM) &tie);

            // Receive string to write on tab
                wchar_t puffer[ERGSTRING];
                ausgabe(i - 1, puffer);  // writes string to puffer

            // Write string on tab
                kartei[i] = CreateWindowExW(0, L"STATIC", puffer, WS_CHILD | WS_VISIBLE | SS_CENTER | SS_CENTERIMAGE ,  // control style
                            175,         // x position
                            75,         // y position
                            200,        // control width
                            60,         // control height
                            hTab,       // parent control
                            (HMENU)i,       // menu/ID info
                            hInst,     // instance handler
                            NULL        // no extra creation data
                );
                ShowWindow(kartei[i], SW_HIDE);
            }

                            ShowWindow(kartei[0], SW_SHOW);  // First tab to the foreground


            // Create Button (BTN_CLOSE)
            CreateWindowW(WC_BUTTONW, L"Schließen", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                80, Y_FENSTER - 90, 80, 30, hWnd, (HMENU) BTN_CLOSE, NULL, NULL);
            break;

结果看起来像这样:

我的输出窗口的屏幕截图

但是,我想显示多行文本并添加图片。 我已经尝试使用此位图加载位图:

HANDLE bmp7 = LoadImageA(hInst, MAKEINTRESOURCE (8002), 0, 0, 0, LR_DEFAULTCOLOR);
            if (bmp7 == NULL) MessageBox(NULL, "Bitmap not loaded.", "Error!", MB_ICONEXCLAMATION | MB_OK);

这将返回我要显示的位图的句柄。 错误消息不会被触发,但是我不知道如何将该图像放置在我的选项卡上。 我能做什么?

如果您可以将图像转换为图标,这将是解决此问题的简便方法,则大多数标准控件(尤其是静态控件)只能处理图标,而不能处理常规位图。

如果这不是一个选择,那么您的下一个最佳选择可能是创建另一个窗口类,其实例将充当选项卡控件客户区。 然后,该类将负责绘制您想要显示的位图和文本。

我解决了问题。

  • 换行符:那些被禁用,因为我使用了错误的窗口样式。 我现在使用SS_LEFT代替SS_CENTER和SS_CENTERIMAGE。
  • 图像:我必须为图像创建单独的HWND。 现在,我使用以下代码。

     HANDLE topoBitmap = LoadImageA(hInst, MAKEINTRESOURCE (8000+i), 0, 0, 0, LR_DEFAULTCOLOR); if (topoBitmap != NULL){ kartei[i+8] = CreateWindowExW(0, L"STATIC", puffer, WS_CHILD | WS_VISIBLE | SS_LEFT | SS_BITMAP, 20, 75, 100, 100, hTab, (HMENU)i, hInst, NULL); SendMessage(kartei[i+8], STM_SETIMAGE, (WPARAM) IMAGE_BITMAP, (LPARAM) topoBitmap); } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM