www.pudn.com > 20061010_WaterMark.rar > WaterMarkDlg.cpp


// WaterMarkDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "WaterMark.h" 
#include "WaterMarkDlg.h" 
#include "Dib.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaterMarkDlg dialog 
 
CWaterMarkDlg::CWaterMarkDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CWaterMarkDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CWaterMarkDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
	show[0]=show[1]=show[2]=FALSE; 
	hwnd[0]=hwnd[1]=hwnd[3]=NULL; 
	hSrcDC[0]=hSrcDC[1]=hSrcDC[2]=hDesDC[0]=hDesDC[1]=hDesDC[2]=NULL; 
	m_dib = new CDib(); 
	m_dib1 = new CDib(); 
	pEdit=pEdit1=NULL; 
	pStatic=pStatic1=NULL; 
	Mark=FALSE; 
	m_tOriPixelArray=m_watermarkdata=m_waterEmbed=m_pickupwater=NULL; 
	ImageHeight=m_Ih=ImageWidth=m_Iw=WaterHeight=m_Wh=WaterWidth=m_Ww=0; 
	number=0; 
} 
 
void CWaterMarkDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CWaterMarkDlg) 
	DDX_Control(pDX, IDC_STATIC0, m_pic); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CWaterMarkDlg, CDialog) 
	//{{AFX_MSG_MAP(CWaterMarkDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_BUTTON1, OnOpenFile) 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_BUTTON2, OnOpenWaterMark) 
	ON_BN_CLICKED(IDC_BUTTON3, OnWaterEmbed) 
	ON_BN_CLICKED(IDC_BUTTON5, OnPick_Up) 
	ON_BN_CLICKED(IDC_BUTTON4, OnSaveWEBitmap) 
	ON_BN_CLICKED(IDC_BUTTON6, OnOpenW_E_Bitmap) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaterMarkDlg message handlers 
 
BOOL CWaterMarkDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CWaterMarkDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CWaterMarkDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CWaterMarkDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CWaterMarkDlg::OnOpenFile()  
{ 
	// TODO: Add your control notification handler code here 
	CFileDialog dlg(TRUE, "", NULL,  
					OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,  
					"(*.bmp)|*.bmp|所有文件(*.*)|*.*||",AfxGetMainWnd()); 
	//读取图象的文件名CString filename; 
	if(dlg.DoModal()==IDOK) 
	{ 
	//Bitmap2Data()将图象的转换为数据保存在二维数组m_tOriPixelArray 
	POSITION pos = dlg.GetStartPosition(); 
	filename = dlg.GetNextPathName(pos); 
	Bitmap2Data(); 
	////////////////////////////////// 
	if(hwnd[0]!=NULL) 
		hwnd[0]=NULL; 
	if(hSrcDC[0]!=NULL) 
		hSrcDC[0]=NULL; 
	if(hDesDC[0]!=NULL) 
		hDesDC[0]=NULL; 
 
	hwnd[0] = GetDlgItem(IDC_STATIC0); 
	hDesDC[0] = hwnd[0]->GetDC()->m_hDC; 
	hSrcDC[0] = CreateCompatibleDC(hDesDC[0]);			 
		 
	filename=dlg.GetPathName(); 
	hBitmap[0]=(HBITMAP)LoadImage(AfxGetInstanceHandle(),filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 
	GetObject(hBitmap[0], sizeof BITMAP, &bm[0]);		 
	SelectObject(hSrcDC[0], hBitmap[0]); 
	hwnd[0]->GetClientRect(&rect[0]); 
		 
	::SetStretchBltMode(hDesDC[0],COLORONCOLOR);        
	::StretchBlt(hDesDC[0], rect[0].left, rect[0].top, rect[0].right, rect[0].bottom, hSrcDC[0], 0, 0, bm[0].bmWidth, bm[0].bmHeight,+SRCCOPY); 
	show[0]=TRUE; 
	SetTimer(NULL,50,0); 
				 
	GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); 
	}	 
	else 
	{/*	GetDlgItem(IDC_STATIC0)->MoveWidow(rect(0,0,bm.bmWidth,bm.bmHeight)); 
		hwnd->MoveWidow(rect(0,0,bm.bmWidth,bm.bmHeight)); 
		m_pic.SetBitmap(hBitmap); 
		this->RedrawWindow();*/ 
		TRACE("错误"); 
	} 
 
	CString s,s0,s1,s2; 
	s.Format("%2d",bm[0].bmHeight); 
	s1.Format("%2d",bm[0].bmWidth); 
	s0.Format("%d",m_dib->GetBiBitCount()); 
	s2="宿主图象"+s0+"位H×W:"+s+"X"+s1; 
		 
	if(pEdit!=NULL) 
		pEdit=NULL; 
	r.left=35;r.top=rect[0].bottom+2;r.right=200+r.left;r.bottom=r.top+20; 
	pEdit=new CEdit; 
	pEdit->Create(ES_CENTER|WS_VISIBLE|ES_READONLY,r,this,1); 
	CFont * cFont=new CFont; 
	cFont->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,  
                                         ANSI_CHARSET,OUT_DEFAULT_PRECIS, 
                                         CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, 
                                         DEFAULT_PITCH&FF_SWISS,"Arial"); 
	pEdit->SetFont(cFont,TRUE); 
	pEdit->SetWindowText(s2); 
} 
 
 
void CWaterMarkDlg::OnOpenWaterMark()  
{ 
	// TODO: Add your control notification handler code here 
	CFileDialog dlg1(TRUE,"bmp",".bmp",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp|JPEG 文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||");	 
	if(dlg1.DoModal()==IDOK) 
	{ 
	if(hwnd[1]!=NULL) 
		hwnd[1]=NULL; 
	if(hSrcDC[1]!=NULL) 
		hSrcDC[1]=NULL; 
	if(hDesDC[1]!=NULL) 
		hDesDC[1]=NULL; 
	hwnd[1] = GetDlgItem(IDC_STATIC1); 
	hDesDC[1] = hwnd[1]->GetDC()->m_hDC; 
	hSrcDC[1] = CreateCompatibleDC(hDesDC[1]);			 
	watermark=dlg1.GetPathName(); 
	hBitmap[1]=(HBITMAP)LoadImage(AfxGetInstanceHandle(),watermark,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 
	GetObject(hBitmap[1], sizeof BITMAP, &bm[1]); 
 
	SelectObject(hSrcDC[1], hBitmap[1]); 
	hwnd[1]->GetClientRect(&rect[1]); 
	::SetStretchBltMode(hDesDC[1],COLORONCOLOR);        
	::StretchBlt(hDesDC[1], rect[1].left, rect[1].top, rect[1].right, rect[1].bottom, hSrcDC[1], 0, 0, bm[1].bmWidth, bm[1].bmHeight,+SRCCOPY); 
	show[1]=TRUE; 
		 
	if ((bm[0].bmHeight*bm[0].bmWidth)<2*(bm[1].bmHeight*bm[1].bmWidth)) 
	{	 
		//不能嵌入水印		 
		MessageBox("水印图象过大请更换较大宿主图象","错误",MB_OK); 
		Mark=FALSE; 
	} 
	else 
	{ 
		SetTimer(NULL,50,0); 
		//WaterBitmap2Data()将图象的转换为数据保存在二维数组_watermarkdata 
		POSITION pos = dlg1.GetStartPosition(); 
		watermark = dlg1.GetNextPathName(pos);; 
		WaterBitmap2Data();//GetDlgItem(IDC_STOP_BUTTON)->EnableWindow(FALSE); 
		Mark=TRUE; 
		GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE); 
	} 
 
	CString s,s0,s1,s2; 
	s.Format("%2d",bm[1].bmHeight); 
	s1.Format("%2d",bm[1].bmWidth); 
	s0.Format("%d",m_dib1->GetBiBitCount()); 
	s2="水印图象"+s0+"位H×W:"+s+"X"+s1; 
		 
	if(pEdit1!=NULL) 
		pEdit1=NULL; 
	r1.left=rect[0].right+35;r1.top=rect[1].bottom+2;r1.right=200+r1.left;r1.bottom=r1.top+20; 
	pStatic1 = new CStatic; 
	pStatic1->Create(s2,ES_CENTER|WS_VISIBLE|ES_READONLY,r1,this,4); 
	} 
		 
} 
 
void CWaterMarkDlg::Bitmap2Data()//将宿主图象的转换为数据保存在二维数组m_tOriPixelArray 
{ 
	int i,j; 
	 
	if(m_tOriPixelArray !=NULL) 
		if(m_Ih!=0) 
			for(i=0; iOpen(filename); 
	ImageWidth = m_dib->GetWidth(); 
	ImageHeight = m_dib->GetHeight(); 
	biBitCount = m_dib->GetBiBitCount();  
 
	BYTE  *colorTable; 
	colorTable =(BYTE *) m_dib->m_pDibBits; 
	int byteBitCount = m_dib->GetBiBitCount()/8; 
 
	m_tOriPixelArray =new RGBQUAD*[ImageHeight]; 
	 
	for (int l=0;l=0; i--) 
	{ 
		for(j=0; jOpen(watermark);if(m_dib1->GetBiBitCount()>8) MessageBox("目前仅对8位的水印信息有效"); 
	 
	WaterWidth=m_dib1->GetWidth(); 
	WaterHeight=m_dib1->GetHeight(); 
	biBitCount1 = m_dib1->GetBiBitCount(); 
	 
	BYTE  *colorTable; 
	colorTable =(BYTE *) m_dib1->m_pDibBits; 
	int byteBitCount = m_dib1->GetBiBitCount()/8; 
 
	m_watermarkdata =new RGBQUAD*[WaterHeight];	 
	for (int l=0;l=0; i--) 
	{ 
		for(j=0; j0;i++) 
			for(j=0;j0;j++,count--)//下面可以用一条语句的 但为了测试还是多句 
			{	 
				m_r=m_waterEmbed[i][j].rgbRed; 
				m_b=m_waterEmbed[i][j].rgbBlue; 
				BYTE &a=m_r; 
				BYTE &b=m_b; 
				BYTE c=m_copymater[i*ImageHeight+j].rgbGreen; 
				Operate_Byte(a,b,c); 
				m_waterEmbed[i][j].rgbRed=m_r; 
				m_waterEmbed[i][j].rgbBlue=m_b;				 
				//TRACE("\n%d",c);k++; 
			} 
		PutInWaterMessage();// 
	} 
	else  
		return;	 
 
	//TRACE("\n次数是%d",k); 
 
	CDC *dc=GetDC();//将象素打印出来 
	RECT m_rect; 
	float w,h,p,q; 
	GetDlgItem(IDC_STATIC2)->GetClientRect(&m_rect); 
	if(m_rect.rightSetPixel(2+(int)(q*w),235+(int)(p*h),RGB(m_waterEmbed[i][j].rgbRed, 
			 m_waterEmbed[i][j].rgbGreen,m_waterEmbed[i][j].rgbBlue)); 
 
	ReleaseDC(dc); 
	 
	delete [] m_copymater; 
	 
	m_Ih=ImageHeight;//为保证直接更换水印信息而没有更换宿主图象提供原宽高 void error bug 
	m_Iw=ImageWidth; 
	m_Wh=WaterHeight; 
	m_Ww=WaterWidth; 
	TRACE("\n%d\n",ImageHeight); 
	GetDlgItem(IDC_BUTTON4)->EnableWindow(TRUE); 
	GetDlgItem(IDC_BUTTON5)->EnableWindow(TRUE); 
} 
 
 
 
void CWaterMarkDlg::ShowBitmap(CString filename) 
{ 
 
} 
 
void CWaterMarkDlg::SetBitmap2Pixel() 
{ 
	if(ImageWidth*ImageHeight==0) 
		return	; 
	CDC *dc=GetDC(); 
	for(int i=0;iSetPixel(5+j,i+220,RGB(m_tOriPixelArray[i][j].rgbRed, 
			 m_tOriPixelArray[i][j].rgbGreen,m_tOriPixelArray[i][j].rgbBlue)); 
 
	ReleaseDC(dc); 
} 
 
void CWaterMarkDlg::SetWaterBitmap2Pixel() 
{ 
	if(ImageWidth*ImageHeight==0) 
		return	; 
	CDC *dc1=GetDC(); 
	for(int i=0;iSetPixel(5+j,i+220,RGB(m_watermarkdata[i][j].rgbRed, 
			 m_watermarkdata[i][j].rgbGreen,m_watermarkdata[i][j].rgbBlue)); 
	 
	ReleaseDC(dc1); 
} 
 
void CWaterMarkDlg::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
		if (show[0]) 
		{ 
			::StretchBlt(hDesDC[0], rect[0].left, rect[0].top, rect[0].right, \ 
				rect[0].bottom, hSrcDC[0], 0, 0, bm[0].bmWidth, bm[0].bmHeight,+SRCCOPY); 
		} 
	 
		if (show[1]) 
		{ 
			::StretchBlt(hDesDC[1], rect[1].left, rect[1].top, rect[1].right, \ 
				rect[1].bottom, hSrcDC[1], 0, 0, bm[1].bmWidth, bm[1].bmHeight,+SRCCOPY); 
		} 
		if(show[2]) 
		{ 
			::StretchBlt(hDesDC[2], rect[2].left, rect[2].top, rect[2].right, \ 
				rect[2].bottom, hSrcDC[2], 0, 0, bm[2].bmWidth, bm[2].bmHeight,+SRCCOPY); 
		} 
		CDialog::OnTimer(nIDEvent); 
} 
 
 
void CWaterMarkDlg::Operate_Byte(BYTE &operate1, BYTE &operate2, BYTE m_operate) 
{ 
	//将m_operate最低四位取出来放到L里最高四位放到H里, 
	//最后将H赋值给operate1最后四位 L赋值给operate2最后四位 
	int i; 
	BYTE M=240,t=m_operate;//1111 0000 
	BYTE H,L,x[8],y[4]; 
	y[3]=8;y[2]=4;y[1]=2;y[0]=1; 
 
	for(i=0;i<8;i++) 
	{ 
		x[i]=m_operate&1; 
		m_operate>>=1; 
	} 
	 
	H=x[7]*y[3]+x[6]*y[2]+x[5]*y[1]+x[4]*y[0];//hight 
	L=x[3]*y[3]+x[2]*y[2]+x[1]*y[1]+x[0]*y[0];//low 
 
	operate1&=M; 
	operate2&=M; 
	operate1+=H; 
	operate2+=L; 
} 
 
 
void CWaterMarkDlg::OnPick_Up()  
{ 
	// TODO: Add your control notification handler code here 
	 
	PickUpWaterMessage(m_Wh,m_Ww); 
} 
 
void CWaterMarkDlg::PickUpWaterMessage(long h,long w) 
{ 
	int i,j; 
	RGBQUAD *m_color; 
	m_color = new RGBQUAD[h*w]; 
	 
	int count=number; 
	if(m_Ih!=0) 
	for(i=0;i0;i++) 
		for(j=0;j0;j++,count--) 
			m_color[i*m_Ih+j]=m_waterEmbed[i][j]; 
			 
 
 
	if(m_pickupwater!=NULL) 
		if(m_pwh!=0) 
			for(i=0;i0;i++) 
		for(j=0;j0;j++,count--) 
		{ 
			m_pickupwater[i][j].rgbGreen=Operate_ByteOut(m_color[i*h+j].rgbRed,m_color[i*h+j].rgbBlue); 
			m_pickupwater[i][j].rgbRed=m_pickupwater[i][j].rgbGreen; 
			m_pickupwater[i][j].rgbBlue=m_pickupwater[i][j].rgbGreen; 
			//TRACE("\n#%d\n",m_pickupwater[i][j].rgbGreen);k++; 
		} 
 
	//TRACE("\n提取的次数是%d\n",k); 
 
	CDC *dc=GetDC();//将象素打印出来 
	RECT m_rect; 
	GetDlgItem(IDC_STATIC3)->GetClientRect(&m_rect); 
 
	for(  i=0;iSetPixel(m_rect.right+2+j,235+i,RGB(m_pickupwater[i][j].rgbRed, 
			 m_pickupwater[i][j].rgbGreen,m_pickupwater[i][j].rgbBlue)); 
 
	ReleaseDC(dc); 
 
	 
	m_pwh=h;//获得最后一次水印的信息位图的宽高信息 
	m_pww=w; 
} 
 
void CWaterMarkDlg::PutInWaterMessage() 
{ 
	long a,b,c,d; 
	a = ImageHeight; 
	b = ImageWidth; 
	c = WaterHeight; 
	d = WaterWidth; 
	 
} 
 
BYTE CWaterMarkDlg::Operate_ByteOut(BYTE operate1, BYTE operate2) 
{ 
	//相对与Operate_Byte() 
	int i = 0; 
	BYTE x[8],y[8],data; 
	 
	for (i=0;i<4;i++) 
	{ 
		x[i]=operate2&1; 
		operate2>>=1;//取出最低的四位 
	} 
	 
	for (i=4;i<8;i++) 
	{ 
		x[i]=operate1&1; 
		operate1>>=1;//取出最高的四位 
	} 
 
	y[0]=1;y[1]=2;y[2]=4;y[3]=8;y[4]=16;y[5]=32;y[6]=64;y[7]=128; 
	data=x[0]*y[0]+x[1]*y[1]+x[2]*y[2]+x[3]*y[3]+x[4]*y[4]+x[5]*y[5]+x[6]*y[6]+x[7]*y[7]; 
	 
	return data; 
} 
 
void CWaterMarkDlg::OnSaveWEBitmap()  
{ 
	// TODO: Add your control notification handler code here 
	CFileDialog dlg(FALSE,"未标题bmp","未标题.bmp",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp"); 
	if(dlg.DoModal()!=IDOK) 
		return ; 
	CString s; 
	CDib *m_dib_save; 
	m_dib_save = new CDib(); 
	m_dib_save = m_dib; 
	s=dlg.GetPathName(); 
	int i,j; 
	int byteBitCount = m_dib_save->GetBiBitCount()/8; 
	long H=m_dib_save->GetHeight(); 
	long W=m_dib_save->GetWidth(); 
	int ct =0; 
	 
	for(i=H-1;i>=0;i--)//0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j) 
	{ 
		for(j=0;jm_pDibBits)[ct++] = m_waterEmbed[i][j].rgbBlue; 
			((BYTE*) m_dib_save->m_pDibBits)[ct++] = m_waterEmbed[i][j].rgbGreen; 
			((BYTE*) m_dib_save->m_pDibBits)[ct++] = m_waterEmbed[i][j].rgbRed; 
			ct +=byteBitCount -3; 
		} 
		ct +=(4-(W*byteBitCount)%4)%4; 
	} 
	m_dib_save->Save(s); 
} 
 
void CWaterMarkDlg::OnOpenW_E_Bitmap()  
{ 
	// TODO: Add your control notification handler code here 
	CFileDialog dlg(TRUE, "", NULL,  
					OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,  
					"(*.bmp)|*.bmp|所有文件(*.*)|*.*||",AfxGetMainWnd()); 
	if(dlg.DoModal()!=IDOK) 
		return ; 
 
 
	if(hwnd[2]!=NULL) 
		hwnd[2]=NULL; 
	if(hSrcDC[2]!=NULL) 
		hSrcDC[2]=NULL; 
	if(hDesDC[2]!=NULL) 
		hDesDC[2]=NULL; 
 
	hwnd[2] = GetDlgItem(IDC_STATIC2); 
	hDesDC[2] = hwnd[2]->GetDC()->m_hDC; 
	hSrcDC[2] = CreateCompatibleDC(hDesDC[2]);			 
	CString file; 
	file=dlg.GetPathName(); 
 
	POSITION pos = dlg.GetStartPosition(); 
	file = dlg.GetNextPathName(pos); 
 
	Embed2Data( file); 
	hBitmap[2]=(HBITMAP)LoadImage(AfxGetInstanceHandle(),file,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 
	GetObject(hBitmap[2], sizeof BITMAP, &bm[2]);		 
	SelectObject(hSrcDC[2], hBitmap[2]); 
	hwnd[2]->GetClientRect(&rect[2]); 
		 
	::SetStretchBltMode(hDesDC[2],COLORONCOLOR);        
	::StretchBlt(hDesDC[2], rect[2].left, rect[2].top, rect[2].right, rect[2].bottom, hSrcDC[2], 0, 0, bm[2].bmWidth, bm[2].bmHeight,+SRCCOPY); 
	show[2]=TRUE; 
	SetTimer(NULL,50,0);				 
} 
 
void CWaterMarkDlg::Embed2Data(CString m_filename)//需要加入代码避免错误 
{ 
	int i,j,H,W; 
	m_dib->Open(m_filename); 
	H = m_dib->GetHeight(); 
	W = m_dib->GetWidth(); 
			 
	if(m_waterEmbed !=NULL)//m_waterEmbed是水印.嵌入后.的位图数据全局变量 
		if(m_Ih!=0) 
		for(int l =0;lm_pDibBits; 
	int byteBitCount = m_dib->GetBiBitCount()/8; 
	 
	int count =0; 
	for(i=H-1;i>=0;i--) 
	{ 
		for(j=0;j