MFC在单文档打开的图片中怎么选中某个区域,并且得到该区域的内容和RGB值
MFC在单文档打开的图片中怎么选中某个区域,如何用LButtonDown,LButtonUp,MouseMove实现?并且在另外一个对话框中显示该区域内容和得到其RGB值...
MFC在单文档打开的图片中怎么选中某个区域,如何用LButtonDown,LButtonUp,MouseMove实现?并且在另外一个对话框中显示该区域内容和得到其RGB值的范围.
我的代码编译连接没错,但是运行时会报错崩溃,运行到MessageBox("Hello!");//检测语句前都没错,下一句 CBitmap::FromHandle(g_hBitmap)->GetBitmap(&bmp);就崩溃了.
void CHSIDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
int width, height;
width = SelectedRect.right - SelectedRect.left;
height = SelectedRect.bottom - SelectedRect.top;
char title[128];
sprintf(title, "预览 %d * %d", width, height);
SetDlgItemText(IDC_HSIRANGE_PREVIEW, title);
CWnd *Pic;
Pic = GetDlgItem(IDC_PICTURE);
RECT PicRect;
Pic->GetWindowRect(&PicRect);
ScreenToClient(&PicRect);
CDC *pdc = GetDC();
HDC hdc = pdc->m_hDC;
HDC memdc = ::CreateCompatibleDC(hdc);
BITMAP bmp;
MessageBox("Hello!");//检测语句
CBitmap::FromHandle(g_hBitmap)->GetBitmap(&bmp);
::SelectObject(memdc, g_hBitmap);
::StretchBlt
(
hdc,
PicRect.left + 1,
PicRect.top + 1,
PicRect.right - PicRect.left - 2,
PicRect.bottom - PicRect.top - 2,
memdc,
SelectedRect.left+scroll_lefttop.x,
SelectedRect.top+scroll_lefttop.y,
width,
height,
SRCCOPY
);
ReleaseDC(pdc);
::DeleteDC(memdc);
// Do not call CDialog::OnPaint() for painting messages
} 展开
我的代码编译连接没错,但是运行时会报错崩溃,运行到MessageBox("Hello!");//检测语句前都没错,下一句 CBitmap::FromHandle(g_hBitmap)->GetBitmap(&bmp);就崩溃了.
void CHSIDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
int width, height;
width = SelectedRect.right - SelectedRect.left;
height = SelectedRect.bottom - SelectedRect.top;
char title[128];
sprintf(title, "预览 %d * %d", width, height);
SetDlgItemText(IDC_HSIRANGE_PREVIEW, title);
CWnd *Pic;
Pic = GetDlgItem(IDC_PICTURE);
RECT PicRect;
Pic->GetWindowRect(&PicRect);
ScreenToClient(&PicRect);
CDC *pdc = GetDC();
HDC hdc = pdc->m_hDC;
HDC memdc = ::CreateCompatibleDC(hdc);
BITMAP bmp;
MessageBox("Hello!");//检测语句
CBitmap::FromHandle(g_hBitmap)->GetBitmap(&bmp);
::SelectObject(memdc, g_hBitmap);
::StretchBlt
(
hdc,
PicRect.left + 1,
PicRect.top + 1,
PicRect.right - PicRect.left - 2,
PicRect.bottom - PicRect.top - 2,
memdc,
SelectedRect.left+scroll_lefttop.x,
SelectedRect.top+scroll_lefttop.y,
width,
height,
SRCCOPY
);
ReleaseDC(pdc);
::DeleteDC(memdc);
// Do not call CDialog::OnPaint() for painting messages
} 展开
1个回答
展开全部
哥们。。。你为啥全写在OnPaint里面啊?OnPaint是窗口重绘时调用的。。直接在View类里面按个增加消息响应LButtonDown,LButtonUp,MouseMove函数,代码我就不说了。。意思跟你说下吧。。在view类里加一个成员变量(CPoint类型),保存鼠标点击的坐标(初始坐标)。。在,LButtonUp里还有个CPiont类型的变量point(VC默认的),这个点是终点。。有了起点和终点,CRect就出来了。。区域就是这个CRect。。
至于对话框。。在RescourcesView里先自己加个出来。。再从class wizard里加相应的处理。。显示该区域内容和得到其RGB值的范围都有现成的函数用的。。MSDN查下吧。。
至于您那段代码。。小弟没看。。。咩哈哈
至于对话框。。在RescourcesView里先自己加个出来。。再从class wizard里加相应的处理。。显示该区域内容和得到其RGB值的范围都有现成的函数用的。。MSDN查下吧。。
至于您那段代码。。小弟没看。。。咩哈哈
追问
谢谢回答啊~直接在View类里面按个增加消息响应LButtonDown,LButtonUp,MouseMove函数我一开始都实现了,问题是要从另一个Dialog里显示出来,代码是在Dialog里的.不过现在解决了.还是谢谢你的回答啊!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询