以下是我的思路,大虾帮忙看下,是否正确
1)在Mainframe中获取已打开的几个文档void CMainFrame::getimage()
{
int i=0;
CDocManager* pManager=((CImageProcessApp *)AfxGetApp())->m_pDocManager;
if (pManager==NULL)
return;
POSITION postTemplate=pManager->GetFirstDocTemplatePosition();
if (postTemplate !=NULL)
{
CDocTemplate* pTemplate=pManager->GetNextDocTemplate(postTemplate);
POSITION posDoc=pTemplate->GetFirstDocPosition();
while((posDoc !=NULL)&&(i<3))
{
CImageProcessDoc* pThisOne=(CImageProcessDoc*)pTemplate->GetNextDoc(posDoc);
Hshuzu[i]=pThisOne->m_pDib;
i=i+1;
}
}}
2)图象合并的算法实现
HDIB UniteImageDIB(HDIB HDib1, HDIB HDib2, HDIB HDib3)
{
if (HDib1 == NULL)
return NULL;
HDIB hNewDIB = CopyHandle(HDib1);
BITMAPINFO *bmi = (BITMAPINFO *)GlobalLock(hNewDIB);
if (! bmi)
return NULL;
WaitCursorBegin();
WORD colorNum=DIBNumColors(hNewDIB);
if(colorNum)
AfxMessageBox("对不起,本功能暂时只支持24位位图");
LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)bmi;
LPBYTE lpbits=(LPBYTE)lpbi+lpbi->biSize;
BITMAPINFO *bmi2 = (BITMAPINFO *)GlobalLock(HDib2);
LPBITMAPINFOHEADER lpbi2 = (LPBITMAPINFOHEADER)bmi2;
LPBYTE lpbits2=(LPBYTE)lpbi2+lpbi2->biSize;
BITMAPINFO *bmi3 = (BITMAPINFO *)GlobalLock(HDib3);
LPBITMAPINFOHEADER lpbi3 = (LPBITMAPINFOHEADER)bmi3;
LPBYTE lpbits3=(LPBYTE)lpbi3+lpbi3->biSize;
int nDelta = WIDTHBYTES(lpbi->biBitCount*lpbi->biWidth) - lpbi->biWidth*lpbi->biBitCount/8;
for (int ny=0; ny<lpbi->biHeight; ny++)
{
for (int nx=0; nx<lpbi->biWidth; nx++) {
*(lpbits+1)=*(lpbits2+1);
*(lpbits+2)=*(lpbits3+2);
lpbits+=3;
lpbits2+=3;
lpbits3+=3;
}
lpbits+=nDelta;
lpbits2+=nDelta;
lpbits2+=nDelta;
}
GlobalUnlock(hNewDIB);
GlobalUnlock(HDib2);
GlobalUnlock(HDib3);
return hNewDIB;
}
3)点击菜单以实现功能
void CImageProcessView::OnUniteImage()
{
CImageProcessDoc *pDoc=(CImageProcessDoc *)GetDocument();
AfxGetApp()->BeginWaitCursor();
HDIB HDib1,HDib2;
CMainFrame * pMainFrame=(CMainFrame *)AfxGetMainWnd();
pMainFrame->getimage();
HDib1=pMainFrame->Hshuzu[1];
HDib2=pMainFrame->Hshuzu[2];
pDoc->m_pDib->uniteimage(HDib1,HDib2);
AfxGetApp()->EndWaitCursor();
pDoc->SetModifiedFlag(TRUE);
Invalidate();
}
1)在Mainframe中获取已打开的几个文档void CMainFrame::getimage()
{
int i=0;
CDocManager* pManager=((CImageProcessApp *)AfxGetApp())->m_pDocManager;
if (pManager==NULL)
return;
POSITION postTemplate=pManager->GetFirstDocTemplatePosition();
if (postTemplate !=NULL)
{
CDocTemplate* pTemplate=pManager->GetNextDocTemplate(postTemplate);
POSITION posDoc=pTemplate->GetFirstDocPosition();
while((posDoc !=NULL)&&(i<3))
{
CImageProcessDoc* pThisOne=(CImageProcessDoc*)pTemplate->GetNextDoc(posDoc);
Hshuzu[i]=pThisOne->m_pDib;
i=i+1;
}
}}
2)图象合并的算法实现
HDIB UniteImageDIB(HDIB HDib1, HDIB HDib2, HDIB HDib3)
{
if (HDib1 == NULL)
return NULL;
HDIB hNewDIB = CopyHandle(HDib1);
BITMAPINFO *bmi = (BITMAPINFO *)GlobalLock(hNewDIB);
if (! bmi)
return NULL;
WaitCursorBegin();
WORD colorNum=DIBNumColors(hNewDIB);
if(colorNum)
AfxMessageBox("对不起,本功能暂时只支持24位位图");
LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)bmi;
LPBYTE lpbits=(LPBYTE)lpbi+lpbi->biSize;
BITMAPINFO *bmi2 = (BITMAPINFO *)GlobalLock(HDib2);
LPBITMAPINFOHEADER lpbi2 = (LPBITMAPINFOHEADER)bmi2;
LPBYTE lpbits2=(LPBYTE)lpbi2+lpbi2->biSize;
BITMAPINFO *bmi3 = (BITMAPINFO *)GlobalLock(HDib3);
LPBITMAPINFOHEADER lpbi3 = (LPBITMAPINFOHEADER)bmi3;
LPBYTE lpbits3=(LPBYTE)lpbi3+lpbi3->biSize;
int nDelta = WIDTHBYTES(lpbi->biBitCount*lpbi->biWidth) - lpbi->biWidth*lpbi->biBitCount/8;
for (int ny=0; ny<lpbi->biHeight; ny++)
{
for (int nx=0; nx<lpbi->biWidth; nx++) {
*(lpbits+1)=*(lpbits2+1);
*(lpbits+2)=*(lpbits3+2);
lpbits+=3;
lpbits2+=3;
lpbits3+=3;
}
lpbits+=nDelta;
lpbits2+=nDelta;
lpbits2+=nDelta;
}
GlobalUnlock(hNewDIB);
GlobalUnlock(HDib2);
GlobalUnlock(HDib3);
return hNewDIB;
}
3)点击菜单以实现功能
void CImageProcessView::OnUniteImage()
{
CImageProcessDoc *pDoc=(CImageProcessDoc *)GetDocument();
AfxGetApp()->BeginWaitCursor();
HDIB HDib1,HDib2;
CMainFrame * pMainFrame=(CMainFrame *)AfxGetMainWnd();
pMainFrame->getimage();
HDib1=pMainFrame->Hshuzu[1];
HDib2=pMainFrame->Hshuzu[2];
pDoc->m_pDib->uniteimage(HDib1,HDib2);
AfxGetApp()->EndWaitCursor();
pDoc->SetModifiedFlag(TRUE);
Invalidate();
}
解决方案 »
- VC写的控件在BCB中报异常EOleSysError with message '未指定的错误'????高手帮帮忙!!!!!!
- vc++2005声称的lib库如何在vc++6.0下使用
- 关于对话框重绘的问题
- 那位有电站应用的VC程序
- #include问题
- 我要作一个项目,不知道是否该用完成端口来实现,请大伙帮我看看!
- 关于VBA中调用vc作成的dll函数的可以返回值的参数传递的问题 (急!! 多谢多谢)
- 请问:如何在文档类中使用主框架类的public变量?
- 在线等,VC+ADO+SQL Server问题,100分
- 嗨,各位,你们~~~见过PDG格式的文件吗?
- 关于布尔表达式的问题,请有兴趣的朋友指教一二!(用尽了我最后一点可用分,555)
- 菜单怎样显示位图?
将三张图片合成一张的算法我知道,但是在VC中具体怎么操作,
我碰到很多问题,因为我刚刚接触VC,
我是利用通道
一个图片占用一个颜色通道
比如a图片对应红色通道
b图片对应绿色通道
c图片对应蓝色通道