Ох уж эти ListBoxы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
HellScream
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 03.10.2004 (Вс) 17:33
Откуда: Из ада, откуда же ещё

Ох уж эти ListBoxы

Сообщение HellScream » 03.10.2004 (Вс) 18:49

Народ помогите?
как ЕОЛНОСТЬЮ изменить интерфейс listboxa или сделать его из чегонибудь другово :)
а то он вид портит :)) :wink:
заранее спасибо
Everything is Possible

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.10.2004 (Вс) 18:57

Ну дык же! :)

ЕОЛНОСТЬЮ - это ж очень просто! Ставим OWNERDRAW (либо FIXED, либо VARIABLE - по обстоятельствам), ловим MEASURE и DRAWITEM, и рисуем! Делов-то :)

http://msdn.microsoft.com/library/defau ... tboxes.asp
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 03.10.2004 (Вс) 18:57

В смысле?
Можно, я думаю, поставить на него хук и рисовать самому, можно новый контрол сделать или найти уже существующий... Что конкретно ты хочешь?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 03.10.2004 (Вс) 18:58

Да, приоритет, похоже, не у меня :)

HellScream
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 03.10.2004 (Вс) 17:33
Откуда: Из ада, откуда же ещё

Сообщение HellScream » 03.10.2004 (Вс) 19:03

А по подробнее :)
Everything is Possible

HellScream
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 03.10.2004 (Вс) 17:33
Откуда: Из ада, откуда же ещё

Сообщение HellScream » 03.10.2004 (Вс) 19:06

[quote="GSerg"]Ну дык же! :)

ЕОЛНОСТЬЮ - это ж очень просто! Ставим OWNERDRAW (либо FIXED, либо VARIABLE - по обстоятельствам), ловим MEASURE и DRAWITEM, и рисуем! Делов-то :)

а это где ставить? :)
Everything is Possible

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.10.2004 (Вс) 19:37

Ну ссылка зачем дадена? :)
Там же всё написано. Ставим стиль OWNERDRAW... Через SetWindowLong.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

HellScream
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 03.10.2004 (Вс) 17:33
Откуда: Из ада, откуда же ещё

Сообщение HellScream » 05.10.2004 (Вт) 14:35

Ты уж извини не чето я совсем тупой.....
Где етот OWNERDRAW... Через SetWindowLong искать..
Everything is Possible

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 05.10.2004 (Вт) 21:54

Ну там же даже пример есть! (Правда на С, но принцип-то ясен)
Код: Выделить всё
#define XBITMAP 80
#define YBITMAP 20

#define BUFFER MAX_PATH

HBITMAP hbmpPencil, hbmpCrayon, hbmpMarker, hbmpPen, hbmpFork;
HBITMAP hbmpPicture, hbmpOld;

void AddItem(HWND hwnd, LPSTR lpstr, HBITMAP hbmp)
{
    int nItem;

    nItem = SendMessage(hwndList, LB_ADDSTRING, 0, lpstr);
    SendMessage(hwndList, LB_SETITEMDATA, nItem, hbmp);
}

DWORD APIENTRY DlgDrawProc(
        HWND hDlg,            // window handle to dialog box
        UINT message,         // type of message
        UINT wParam,          // message-specific information
        LONG lParam)
{
    int nItem;
    TCHAR tchBuffer[BUFFER];
    HBITMAP hbmp;
    HWND hListBox;
    TEXTMETRIC tm;
    int y;
    HDC hdcMem;
    LPMEASUREITEMSTRUCT lpmis;
    LPDRAWITEMSTRUCT lpdis;
    RECT rcBitmap;
   HRESULT hr;
   size_t * pcch;

    switch (message)
    {

        case WM_INITDIALOG:

            // Load bitmaps.

            hbmpPencil = LoadBitmap(hinst, MAKEINTRESOURCE(700));
            hbmpCrayon = LoadBitmap(hinst, MAKEINTRESOURCE(701));
            hbmpMarker = LoadBitmap(hinst, MAKEINTRESOURCE(702));
            hbmpPen = LoadBitmap(hinst, MAKEINTRESOURCE(703));
            hbmpFork = LoadBitmap(hinst, MAKEINTRESOURCE(704));

            // Retrieve list box handle.

            hListBox = GetDlgItem(hDlg, IDL_STUFF);

            // Initialize the list box text and associate a bitmap
            // with each list box item.

            AddItem(hListBox, "pencil", hbmpPencil);
            AddItem(hListBox, "crayon", hbmpCrayon);
            AddItem(hListBox, "marker", hbmpMarker);
            AddItem(hListBox, "pen",    hbmpPen);
            AddItem(hListBox, "fork",   hbmpFork);

            SetFocus(hListBox);
            SendMessage(hListBox, LB_SETCURSEL, 0, 0);
            return TRUE;

        case WM_MEASUREITEM:

            lpmis = (LPMEASUREITEMSTRUCT) lParam;

            // Set the height of the list box items.

            lpmis->itemHeight = 20;
            return TRUE;

        case WM_DRAWITEM:

            lpdis = (LPDRAWITEMSTRUCT) lParam;

            // If there are no list box items, skip this message.

            if (lpdis->itemID == -1)
            {
                break;
            }

            // Draw the bitmap and text for the list box item. Draw a
            // rectangle around the bitmap if it is selected.

            switch (lpdis->itemAction)
            {
                case ODA_SELECT:
                case ODA_DRAWENTIRE:

                    // Display the bitmap associated with the item.

                    hbmpPicture =(HBITMAP)SendMessage(lpdis->hwndItem,
                        LB_GETITEMDATA, lpdis->itemID, (LPARAM) 0);

                    hdcMem = CreateCompatibleDC(lpdis->hDC);
                    hbmpOld = SelectObject(hdcMem, hbmpPicture);

                    BitBlt(lpdis->hDC,
                        lpdis->rcItem.left, lpdis->rcItem.top,
                        lpdis->rcItem.right - lpdis->rcItem.left,
                        lpdis->rcItem.bottom - lpdis->rcItem.top,
                        hdcMem, 0, 0, SRCCOPY);

                    // Display the text associated with the item.

                    SendMessage(lpdis->hwndItem, LB_GETTEXT,
                        lpdis->itemID, (LPARAM) tchBuffer);

                    GetTextMetrics(lpdis->hDC, &tm);

                    y = (lpdis->rcItem.bottom + lpdis->rcItem.top -
                        tm.tmHeight) / 2;
                  
               hr = StringCchLength(tchBuffer, BUFFER, pcch);
               if (FAILED(hr))
               {
               // TODO: write error handler
               }

                    TextOut(lpdis->hDC,
                        XBITMAP + 6,
                        y,
                        tchBuffer,
                        pcch);                   

                    SelectObject(hdcMem, hbmpOld);
                    DeleteDC(hdcMem);

                    // Is the item selected?

                    if (lpdis->itemState & ODS_SELECTED)
                    {
                        // Set RECT coordinates to surround only the
                        // bitmap.

                        rcBitmap.left = lpdis->rcItem.left;
                        rcBitmap.top = lpdis->rcItem.top;
                        rcBitmap.right = lpdis->rcItem.left + XBITMAP;
                        rcBitmap.bottom = lpdis->rcItem.top + YBITMAP;

                        // Draw a rectangle around bitmap to indicate
                        // the selection.

                        DrawFocusRect(lpdis->hDC, &rcBitmap);
                    }
                    break;

                case ODA_FOCUS:

                    // Do not process focus changes. The focus caret
                    // (outline rectangle) indicates the selection.
                    // The IDOK button indicates the final
                    // selection.

                    break;
            }
            return TRUE;

        case WM_COMMAND:

            switch (LOWORD(wParam))
            {
                case IDOK:
                    // Get the selected item's text.

                    nItem = SendMessage(GetDlgItem(hDlg, IDL_STUFF),
                       LB_GETCURSEL, 0, (LPARAM) 0);
                       hbmp = SendMessage(GetDlgItem(hDlg, IDL_STUFF),
                            LB_GETITEMDATA, nItem, 0);

                    // If the item is not the correct answer, tell the
                    // user to try again.
                    //
                    // If the item is the correct answer, congratulate
                    // the user and destroy the dialog box.

                    if (hbmp != hbmpFork)
                    {
                        MessageBox(hDlg, "Try again!", "Oops", MB_OK);
                        return FALSE;
                    }
                    else
                    {
                        MessageBox(hDlg, "You're right!",
                            "Congratulations.", MB_OK);

                      // Fall through.

                    }

                case IDCANCEL:

                    // Destroy the dialog box.

                    EndDialog(hDlg, TRUE);
                    return TRUE;

                default:

                    return FALSE;
            }

        case WM_DESTROY:

            // Free any resources used by the bitmaps.

            DeleteObject(hbmpPencil);
            DeleteObject(hbmpCrayon);
            DeleteObject(hbmpMarker);
            DeleteObject(hbmpPen);
            DeleteObject(hbmpFork);

            return TRUE;

        default:
            return FALSE;

    }
    return FALSE;
}

HellScream
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 03.10.2004 (Вс) 17:33
Откуда: Из ада, откуда же ещё

Сообщение HellScream » 06.10.2004 (Ср) 2:05

Во! теперь сенк :)
Everything is Possible


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 78

    TopList