Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по Visual C++ (MFC, платформа .NET)


Информационный Канал Subscribe.Ru

Visual C++. FAQ. Уроки по программированию с сайта http://progs.biz

Рассылка №37

Visual C++. FAQ. Вопрос 7. Как использовать один bitmap для вывода нескольких разных картинок?
Visual C++. FAQ. Вопрос 8. Как переместить кнопку Пуск (Start)?
Visual C++. FAQ. Вопрос 9. Как поместить bitmap на форму?
Visual C++. FAQ. Вопрос 10. Как сделать фон у надписи прозрачным?
Visual C++. FAQ. Вопрос 11. Как изменить цвет фона у SDI-приложения?

Полные версии уроков (с картинками) можно найти по адресам
Вопрос 7. Как использовать один bitmap для вывода нескольких разных картинок?
Вопрос 8. Как переместить кнопку Пуск (Start)?.
Вопрос 9. Как поместить bitmap на форму?
Вопрос 10. Как сделать фон у надписи прозрачным?
Вопрос 11. Как изменить цвет фона у SDI-приложения?

FAQ по Visual C++. Вопрос 7. Как использовать один bitmap для вывода нескольких разных картинок?

Задача такая - у вас есть один bitmap, в котором содержится много картинок. Мы хотим вывести на экран в неком окне не весь bitmap, а лишь его часть. Делается это с помощью метода BitBlt класса CDC:

void CTestView::OnDraw(CDC* pDC)
{
    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CDC dcDC;
    CBitmap cb;
    cb.LoadBitmap(IDR_BITMAP1);
    dcDC.CreateCompatibleDC(pDC);
    dcDC.SelectObject(cb);
    //выводим правую половину bitmap'а
    pDC->BitBlt(0,0,30,30,&dcDC,30,0,SRCCOPY);
    //выводим левую половину bitmap'а
    pDC->BitBlt(30,0,30,30,&dcDC,0,0,SRCCOPY);
}

В приведенном примере подразумевается, что в наш проект включен bitmap с идентификатором IDR_BITMAP1 размером 60 на 30.

После запуска в окне мы увидим, что части нашего bitmap'а расположены по отдельности (правый - слева, а левый - справа). Самое существенное здесь - это метод BitBlt класса CDC:

    ...
 pDC->BitBlt(0,0,30,30,&dcDC,30,0,SRCCOPY);
    ...

Для нас интересны следующие его параметры: первые два (0 и 0) - это координаты вывода изображения на нашей форме (вернее в контексте устройства). Вторая пара (30 и 30) - это размер вырезаемой области из нашего bitmap'а (каждый раз мы вырезаем по квадратику). Третья пара (параметры номер 6 и 7, у нас они равны 30 и 0) - это координаты левого верхнего угла вырезаемой области из нашего bitmap'а.

Наверх

FAQ по Visual C++. Вопрос 8. Как переместить кнопку Пуск (Start)?

Сделать это совсем нетрудно. Например, для консольного приложения это можно сделать так:

#include <windows.h>
void main(){
    HWND hwndToolBar=FindWindowEx(NULL, NULL, "Shell_TrayWnd", NULL);
    HWND hwndStartButton=FindWindowEx(hwndToolBar, NULL, "Button", NULL);
    MoveWindow(hwndStartButton,100,1,56,22, TRUE);
}

После запуска программы кнопка Start сдвинется на новое место.

Пару слов про то, что наш код делает. В строке

    ...
    HWND hwndToolBar=FindWindowEx(NULL, NULL, "Shell_TrayWnd", NULL);
    ...

в переменную hwndToolBar записывается хендл на панель задач (кажется, именно так она называется по-русски).

В следующей строке мы ищем кнопку Start на нашей панели задач:

    ...
    HWND hwndStartButton=FindWindowEx(hwndToolBar, NULL, "Button", NULL);
    ...

Хендл для этой кнопки запишется в переменную hwndStartButton.

И, наконец, в последней строке

    ...
    MoveWindow(hwndStartButton,100,1,56,22, TRUE);
    ...

мы сдвигаем нашу кнопку куда захотим.

Наверх

FAQ по Visual C++. Вопрос 9. Как поместить bitmap на форму?

Вот два способа сделать это. Каждый способ предполагает, что у нас есть bitmap с идентификатором IDB_BITMAP1.

Способ первый:

void CBitmapView::OnDraw(CDC* pDC)
{

    // TODO: add draw code for native data here
    CBitmap bitmap;
    BITMAP bmp;
    bitmap.LoadBitmap(IDB_BITMAP1);
    bitmap.GetObject(sizeof(BITMAP), &bmp);
    pDC->DrawState(CPoint(0,0),
                CSize(bmp.bmWidth,bmp.bmHeight),bitmap, DST_BITMAP);
}

Способ второй - использую функцию BitBlt. Он рассмотрен в вопросе 7.

Наверх

FAQ по Visual C++. Вопрос 10. Как сделать фон у надписи прозрачным?

Если выводить текст методом TextOut, то фон у букв не совпадает с цветом формы, что не очень красиво. Например, следующий фрагмент

void CSomeView::OnDraw(CDC* pDC)
{
    CSomeView* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CBrush *pBr=new CBrush;
    pBr->CreateSolidBrush(RGB(0, 0, 255));
    pDC->SelectObject(pBr);
    pDC->Rectangle(0, 0, 100, 100);
    pDC->TextOut(10, 10, "Text");
}

даст результат с белым фоном.

Если же мы добавим одну строчку:

  ...
    pDC->Rectangle(0, 0, 100, 100);
    pDC->SetBkMode(TRANSPARENT);
    pDC->TextOut(10, 10, "Text");
 ...

то результат будет с прозрачным фоном.

Наверх

FAQ по Visual C++. Вопрос 11. Как изменить цвет фона у SDI-приложения?

Это надо делать в методе PreCreateWindow для класса вида. Вот код:

BOOL CBitmapView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    cs.lpszClass = AfxRegisterWndClass(0, 0, (HBRUSH)COLOR_HIGHLIGHT, 0);
    return CView::PreCreateWindow(cs);
}

В результате цвет фона станет серым.

Наверх
Новые рассылки сайта progs.biz
Delphi (библиотека VCL, создание собственных компонентов, базы данных и др.).
HTML, PHP, mySQL, WEB-дизайн

Copyright Алексеев Игорь, 2002

Copyright cайт progs.biz, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное