Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++/MFC] Вставка рисунка на форму! 
V
    Опции темы
SAVEL
Дата 23.3.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 31.1.2007

Репутация: нет
Всего: -1



Ув прораммисты ! Пытаюсь наклеить картинку на форму, ничего не выходит, рисунок не показывает ! Подскажите где ошибка!

Код

#include <afxwin.h>
#include "menuM.h"
#include "res.h"

BOOL CMenuApp::InitInstance()
{
const char *szWndClass = AfxRegisterWndClass(CS_HREDRAW, LoadStandardCursor(IDC_UPARROW), (HBRUSH) COLOR_BACKGROUND + 7,  LoadStandardIcon(IDI_EXCLAMATION)); 

CMainWindow *pWnd = new CMainWindow;
pWnd->CreateEx(0,szWndClass, "Окошко с дыркой [MFC]",WS_OVERLAPPEDWINDOW, 0,  0,500,500,NULL, NULL);
m_pMainWnd = pWnd;
HWND hwnd;

HBRUSH hNewBrush = ::CreateSolidBrush(RGB(0, 255, 0));
hwnd=pWnd->GetSafeHwnd();
::SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)hNewBrush);

SetWindowRgn(hwnd, Region, TRUE);
pWnd->ShowWindow(m_nCmdShow);
pWnd->UpdateWindow();
return TRUE;
}
CMenuApp theApp;

void CMenuApp::OnPaint()
{
CWnd *wnd;
CPaintDC dc(wnd); // device context for painting
HBITMAP m_Bmap;
CRect rect;
HDC memdc;

CString m_ifilename1;

m_ifilename1 = "E:\\it\vs2005\mfcmessages\mfcmessages\wall.bmp";

::GetClientRect(NULL,&rect);

m_Bmap=(HBITMAP)::LoadImage(NULL,m_ifilename1,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
memdc=::CreateCompatibleDC(dc.m_hDC);
::SelectObject(memdc,m_Bmap);

BitBlt(dc.m_hDC,0,0,rect.right,rect.bottom,memdc,0 ,0,SRCCOPY); 
DeleteObject(m_Bmap);
DeleteObject(memdc); 
}

 smile 
--------------------
В любых делах при максимуме сложности подход к проблеме всё-таки один! Желание - это множество возможностей, а нежелание - это множество причин !!!
PM MAIL   Вверх
SAVEL
  Дата 25.3.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 31.1.2007

Репутация: нет
Всего: -1



Да помогите ж хоть кто-нибудь! Срочно надо!!! smile  smile  smile 


Вот еще нашел
Код

CBitmap m_Bitmap,*p;
CDC dcMemory,*pDC;

BITMAP bm;
m_Bitmap.LoadBitmap(IDB_BITMAP1);
dcMemory.CreateCompatibleDC(&pDC);
dcMemory.SelectObject(p);
p.GetBitmap(&bm);
pDC->BitBlt(50,50,bm.bmWidth,bm.bmHeight,&dcMemory,0,0,SRCCOPY);


Но опять же пишет ошибку, что *p и *pDC is being used without being defined.

HELP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Это сообщение отредактировал(а) SAVEL - 25.3.2008, 16:41
--------------------
В любых делах при максимуме сложности подход к проблеме всё-таки один! Желание - это множество возможностей, а нежелание - это множество причин !!!
PM MAIL   Вверх
Gongex
Дата 13.4.2008, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 1.1.2008

Репутация: нет
Всего: 0



на счет hDC седня я на своем примере разобрался.
Надо написать типа HDC pDC=GetDC(hWnd);
или CDC pDC=GetDC(hWnd); а она этот пидиси не узнает,так даем ей "вспомнить"

но у меня ошибок нет,но картинка тоже не появляется.

Код


    HDC hdc=GetDC(hWnd);
 static HBITMAP hBitmap,oldBitmap;
HDC hdcMem;
static BITMAP bm;

            hBitmap=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
                GetObject(hBitmap,sizeof(LPSTR),&bm);
                hdcMem=CreateCompatibleDC(hdc);
                SelectObject(hdcMem,hBitmap);
                BitBlt(hdc,150,150,bm.bmWidth+50,bm.bmHeight+50,hdcMem,0,0,SRCCOPY);
                //DeleteDC(hdcMem);




Может и мне подскажете?

Это сообщение отредактировал(а) Gongex - 14.4.2008, 00:01
PM MAIL   Вверх
creatorcode
Дата 14.4.2008, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 12.6.2006
Где: Ленинград

Репутация: 3
Всего: 4



А вы уверенны, что у Вас картинка загружается?
Код

m_ifilename1 = "E:\\it\\vs2005\\mfcmessages\\mfcmessages\\wall.bmp";

Проверьте m_Bmap.
PM MAIL   Вверх
dizzy1984
Дата 15.4.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Ну вот хороший фак, коих море-океян. Товарищи! Вы совсем не тратите силы на поиск подобной информации! Ее настолько много на форуме и в интернете, что вам уже должно быть стыдно!
Итак, сравниваем код в факе с кодом SAVEL, а.
1. Видим первую странность - CDC *pDC используется без инициалиации - пойди туда, не знаю куда...
Надо либо
Код

CDC *pDC = GetDC();

если вызов идет не из CWnd::OnPaint, но т.к нормально делать отрисовку только оттуда, то должно быть
Код

CPaintDC dc(this);
//...
CDC *pDC = &dc;

2. Затем видна еще одна странность - мы применяем взятие адреса на CDC *, т.е &pDC, что в контексте BOOL CDC::CreateCompatibleDC(CDC *pDC) вообще не должно скомпилироваться... нужно
Код

dcMemory.CreateCompatibleDC(pDC);

3. Снова начинаем смеяться - вызов CDC::SelectObject(CGdiObject* pObject) идет с неинициализированным параметром... нужно
Код

p = &m_bitmap;
dcMemory.SelectObject(p);

4. Но так делать тоже нельзя, нужно сохранить предыдущий битмап, находившийся в контексте устройства
Код

CBitmap * oldBitmap = dcMemory.SelectObject(p);

А затем восстановать его
Код

mem.SelectObject(oldBitmap);

5. Строка p.GetBitmap(&bm);  вызывает GetBitmap с помощью ".", должно быть "->"
Код

p->GetBitmap(&bm);

6. Код загрузки битмапа лучше всего разместить на процесс инициализации приложения, например в конструкторе класса диалога. Код отрисовки лучше всего разместить в обработчике OnPaint.
7. Переменные CBitmap *p и CDC *pDC не нужны.

Вот мой итоговый вариант
Код

class CTest2Dlg : public CDialog
{
    //...
protected:
        CBitmap m_bitmap;
    //...
};

CTest2Dlg::CTest2Dlg(CWnd* pParent /*=NULL*/)
    : CDialog(CTest2Dlg::IDD, pParent)
{
    //...
    m_bitmap.LoadBitmap(IDB_BITMAP1);
    //...
};

void CTest2Dlg::OnPaint() 
{
    CPaintDC dc(this);
    //...
    if (IsIconic())
    {
        //...
    }
    else
    {    
        CDialog::OnPaint();
        
        BITMAP bm;
        CDC mem;
        
        mem.CreateCompatibleDC(&dc);
        CBitmap * oldBitmap = mem.SelectObject(&m_bitmap);
        m_bitmap.GetBitmap(&bm);
        dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&mem,0,0,SRCCOPY);
        mem.SelectObject(oldBitmap);    
    }
};


Это сообщение отредактировал(а) dizzy1984 - 15.4.2008, 10:45
PM MAIL   Вверх
SAVEL
Дата 16.4.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 31.1.2007

Репутация: нет
Всего: -1



Благодарю за ответ! Я давно разобрался, и тут мой метод

Код

void CChildView::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
 int x=GetSystemMetrics(SM_CXMAXIMIZED);

  int y=GetSystemMetrics(SM_CYMAXIMIZED);    
    CBitmap BkBmp, *pOldBmp;
    BkBmp.LoadBitmap(IDB_BITMAP1);
    CDC BmpDc;
    BmpDc.CreateCompatibleDC(&dc);
    pOldBmp=BmpDc.SelectObject(&BkBmp);
    dc.BitBlt(0-310,0,x,y,&BmpDc,0,0,SRCCOPY);
    
    BmpDc.SelectObject(pOldBmp);
    // TODO: Add your message handler code here
    // Do not call CWnd::OnPaint() for painting messages
}


--------------------
В любых делах при максимуме сложности подход к проблеме всё-таки один! Желание - это множество возможностей, а нежелание - это множество причин !!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1410 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.