Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

BitBlt-что не так

30K
20 апреля 2010 года
cpentyc
85 / / 23.02.2010
Всем привет.Вот какой у меня косяк.анимирую человечка.все впрайты держу в одном изображении.
когда беру изображение из пиктура все работает нормально а когда использую image рисует черный квадратик
 
Код:
1)Graphics g = pictureBox1.CreateGraphics();
2)Graphics g = Graphics.FromImage(im);//im-картинка она загружается правильно это точно

 
Код:
IntPtr Hdc = g.GetHdc();
          IntPtr hdc = this.CreateGraphics().GetHdc();
          Graphics t = this.CreateGraphics();
          t.Clear(Color.White);
            i++;
            if (i > 2) i %= 3;
           
            BitBlt(hdc, p.X , p.Y , 23, 33, Hdc, 23 * i, 33 * str, SRCCOPY);
14
21 апреля 2010 года
Phodopus
3.3K / / 19.06.2008
Плохо понятно все тут, но если что - битмап может быть выбран лишь в один DC в один момент времени.
5
21 апреля 2010 года
hardcase
4.5K / / 09.08.2005
А зачем говорить ДВАЖДЫ CreateGraphics:
 
Код:
IntPtr hdc = this.CreateGraphics().GetHdc();
          Graphics t = this.CreateGraphics();
8.2K
22 апреля 2010 года
bagie2
299 / / 26.10.2008
тут вообще непонятно еще то, что вроде бы дотнет и в то же время используется WINAPI BitBlt
есть аналоги дотнетовские для этого.
30K
22 апреля 2010 года
cpentyc
85 / / 23.02.2010
Цитата:
А зачем говорить ДВАЖДЫ CreateGraphics:


я не про два раза спрашивал.это мои индуские заморочки)))))
можете сказать почему hdc из картинки не создается а из пиктура создается верней посему не работает правильно(((

8.2K
22 апреля 2010 года
bagie2
299 / / 26.10.2008
если что то тут есть пример анимации
5
22 апреля 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: cpentyc
я не про два раза спрашивал.это мои индуские заморочки)))))
можете сказать почему hdc из картинки не создается а из пиктура создается верней посему не работает правильно(((


 
Код:
IntPtr Hdc = g.GetHdc();
          IntPtr hdc = this.CreateGraphics().GetHdc();  // создаем графикс и получаем хдц, прежний графикс благополучно уничтожается GC
          Graphics t = this.CreateGraphics(); // создаем какойто другой графикс
          t.Clear(Color.White);
            i++;
            if (i > 2) i %= 3;
           
            BitBlt(hdc, p.X , p.Y , 23, 33, Hdc, 23 * i, 33 * str, SRCCOPY);
30K
27 апреля 2010 года
cpentyc
85 / / 23.02.2010
Код:
Image im1 = Image.FromFile("1.gif");
            Image im2 = Image.FromFile("2.gif");
            Image im3 = Image.FromFile("3.gif");
            Bitmap Bit = new Bitmap(this.Width, this.Height);        
            Graphics g =Graphics.FromImage(Bit);          
            for(int i=0;i<mapI;i++)
                for (int j = 0; j < mapJ; j++)
                {
                    switch (mapa[i, j])
                    {
                        case 1:
                            {
                                g.DrawImage(im1, i * 30, j * 30, 30, 30);
                            } break;
                        case 2:
                            {
                                g.DrawImage(im2, i * 30, j * 30, 30, 30);
                            } break;
                        case 3:
                            {
                                g.DrawImage(im3, i * 30, j * 30, 30, 30);
                            } break;
                    }
                    }  
            IntPtr Hdc = this.CreateGraphics().GetHdc();
            IntPtr hdc = g.GetHdc();
           BitBlt(Hdc, 0, 0, this.Width , this.Height , hdc, 0, 0, SRCCOPY);
            g.Dispose();

кто нибудь может сказать почему у меня черный экран рисует а не картинку
30K
27 апреля 2010 года
cpentyc
85 / / 23.02.2010
добавил
Код:
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        static extern bool DeleteDC(IntPtr hdc);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        static extern bool DeleteObject(IntPtr hObject);

и поменял
 
Код:
IntPtr pTarget = e.Graphics.GetHdc();
            IntPtr pSource = CreateCompatibleDC(pTarget);
            IntPtr pOrig = SelectObject(pSource, Bit.GetHbitmap());
            BitBlt(pTarget, 0, 0, 500,500, pSource, 0, 0, SRCCOPY);
            IntPtr pNew = SelectObject(pSource, pOrig);
            DeleteObject(pNew);
            DeleteDC(pSource);
            e.Graphics.ReleaseHdc(pTarget);

начало работать))) а теперь скажите что я сделал???
8.2K
27 апреля 2010 года
bagie2
299 / / 26.10.2008
Вы лучше скажите зачем вообще используете GDI напрямую в C# :)
30K
28 апреля 2010 года
cpentyc
85 / / 23.02.2010
Цитата:

Вы лучше скажите зачем вообще используете GDI напрямую в C#


а как надо???
раскажите

8.2K
28 апреля 2010 года
bagie2
299 / / 26.10.2008
я без понятия, что хотите сделать, но если анимацию из картинок, то можно так, как я постил выше ссылку. либо вот еще пример да и еще вариантов куча бывает.
30K
30 апреля 2010 года
cpentyc
85 / / 23.02.2010
Цитата:
я без понятия, что хотите сделать


я пытаюсь отрисовать кусок карты 11 на 11 ячеек на весь экран.
экран будет заблокирован от изменения размера.двумерный масив служит картой и в нем хранятся значения поверхностей(пол стены ямы и прочее) пытался рисовать чисто gdi+ но все так сильно мигало что никуда не годится.двойную буферизацию пробовал не помогло. вот BitBlt вроде побыстрей будет но вот ничего не выходит проктически.в google по запросу "BitBlt" уже до 6 странице дошел глухо как в танке.

253
30 апреля 2010 года
Proger_XP
1.5K / / 07.08.2004
Используй DirectX для игр, с GDI ты в лучшем случае будешь сильно мучаться.
Цитата: cpentyc
вот ничего не выходит проктически.в google по запросу "BitBlt" уже до 6 странице дошел глухо как в танке.


Если ты дошёл в гугле до конца первой страницы и ничего не нашёл, то в 90% случаев это значит, что ты спрашивал не то, что хотел найти (или искал не то, что спрашивал - смотря по настроению).

30K
01 мая 2010 года
cpentyc
85 / / 23.02.2010
Цитата: Proger_XP
Используй DirectX для игр, с GDI ты в лучшем случае будешь сильно мучаться.
.


я месяца два назад поднимал тему на чем писать мне сказали не мучайся с DirectX используй GDI+.сейчас время нет уже(((

14
04 мая 2010 года
Phodopus
3.3K / / 19.06.2008
Не боись, имея ТАКИЕ проблемы с GDI+, с DirectX-ом у тебя бы до сих пор вообще ничего бы не запускалось :)
Graphics[COLOR="Black"]::[/COLOR]DrawImage(Image*,INT,INT) чем не подходит?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог