Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Прозрачный Фон! Разве это фантастика?


Автор: Феликс 24.8.2007, 18:16
Здраствуйте,
При нажатии по кнопке на форме всплывает модальное окно, на котором и хотелось бы разместить рисунок с прозрачным фоном. Делаю вот так вот:
Код

// Обработчик модального окна
void CLogoDlg::OnPaint() {
    CDC* dc = GetDC();
    CImage m_Frame;
    m_Frame.Load(MAKEINTRESOURCE(IDB_LOGO));
    TransparentBlt(    dc->m_hDC, 
                    100, 
                    100, 
                    m_Frame.GetWidth(), 
                    m_Frame.GetHeight(), 
                    m_Frame.GetDC(), 
                    0, 
                    0, 
                    m_Frame.GetWidth(), 
                    m_Frame.GetHeight(), 
                    RGB(255, 255, 255));
    m_Frame.ReleaseDC();
}


При запуске программы и нажатии по кнопке, програма закрывается.
Я уверен что мой код не верен, но и в сети нет достойных примеров!
Заранее спасибо за помощь.

Автор: zkv 24.8.2007, 18:28
Код

#pragma once
#include <atlimage.h>


// CPaintDlg dialog

class CPaintDlg : public CDialog
{
    DECLARE_DYNAMIC(CPaintDlg)
    CImage m_image;
public:
    CPaintDlg(CWnd* pParent = NULL);   // standard constructor
    virtual ~CPaintDlg();

// Dialog Data
    enum { IDD = IDD_DIALOG2 };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnPaint();
};

// PaintDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestDlg.h"
#include "PaintDlg.h"
#include ".\paintdlg.h"


// CPaintDlg dialog

IMPLEMENT_DYNAMIC(CPaintDlg, CDialog)
CPaintDlg::CPaintDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CPaintDlg::IDD, pParent)
{
    m_image.LoadFromResource( AfxGetInstanceHandle(), IDB_BITMAP1 );
}

CPaintDlg::~CPaintDlg()
{
}

void CPaintDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CPaintDlg, CDialog)
    ON_WM_PAINT()
END_MESSAGE_MAP()


// CPaintDlg message handlers

void CPaintDlg::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    TransparentBlt(    dc.m_hDC, 
                    100, 
                    100, 
                    m_image.GetWidth(), 
                    m_image.GetHeight(), 
                    m_image.GetDC(), 
                    0, 
                    0, 
                    m_image.GetWidth(), 
                    m_image.GetHeight(), 
                    RGB(255, 255, 255));
    m_image.ReleaseDC();
}

Автор: Феликс 24.8.2007, 18:44
#zkv, работает!!! но вот мне еще надо сделать модальное окно прозрачным. Не поможеш?

Автор: zkv 24.8.2007, 19:14
нашел, http://www.codeproject.com/gdi/coolrgn.asp?

Автор: Феликс 24.8.2007, 21:53
Цитата(zkv @ 24.8.2007,  19:14)
нашел, http://www.codeproject.com/gdi/coolrgn.asp?

Спасибо конечно за примерчик, но примерчик оставляет желать лучшего. Там много лишнего, а разобраться в таком примерчике не легкое дело. Может есть способ по проше?

Автор: zkv 24.8.2007, 23:26
Цитата(Феликс @  24.8.2007,  21:53 Найти цитируемый пост)
Спасибо конечно за примерчик, но примерчик оставляет желать лучшего.

если напишите достойную альтернативу, просьба, сообщите. 
Удачи!

Автор: zkv 25.8.2007, 03:56
поражают такие личности. Как сделать не знают, но берутся утверждать, что лишнее, а что нет...

Автор: Andrey44 25.8.2007, 13:29
SetLayeradWindowAttributes() smile 

Автор: Феликс 25.8.2007, 17:28
Цитата(zkv @ 25.8.2007,  03:56)
поражают такие личности. Как сделать не знают, но берутся утверждать, что лишнее, а что нет...

А вот не надо вот этого! Я не думаю что в мелкософте сидят тормоза. Они делают всё оптимально. А этот код, это просто чейто проект, кто знает что туда наталкали. Был бы пример с MSDN, вот тогда я бы промолчал.

Автор: Earnest 26.8.2007, 08:38
Цитата(Феликс @  24.8.2007,  22:53 Найти цитируемый пост)
Спасибо конечно за примерчик, но примерчик оставляет желать лучшего. Там много лишнего, а разобраться в таком примерчике не легкое дело.

А кто тебе обещал "легкое", когда ты в программисты пошел? Кроме того, половина, если не больше, работы программиста заключается в том, чтобы разбираться в чужом коде, причем он почти всегда раздражает и кажется дебильным, даже если ты сам его написал ...дцать лет назад. Так что это тоже полезное упражнение.
Цитата(Феликс @  25.8.2007,  18:28 Найти цитируемый пост)
Я не думаю что в мелкософте сидят тормоза. Они делают всё оптимально.

Просто умираю от смеха. Достаточно посмотреть код MFС... smile  smile  smile 
Цитата(Феликс @  25.8.2007,  18:28 Найти цитируемый пост)
А этот код, это просто чейто проект, кто знает что туда наталкали. 

Как я уже сказала, тебе всю жизнь придется иметь дело с "чьими-то" проектами...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)