📄 rightbar.cpp
字号:
if(CursorInRedRect&&LButtonDown)// 开始拖动红框
{
int dx = point.x - StartPt.x;
int dy = point.y - StartPt.y;
RedRect.OffsetRect(dx, dy);
if(!IsImageFillStatic)
{
DrawRedRect(RedRect);
}
StartPt = point;
}
}
else
{
CDialogBar::OnMouseMove(nFlags, point);
}
}
void CRightBar::PostNcDestroy()
{
if(bTempDCCreate && bTempBMPCreate)
{
tempDC.SelectObject(pOldbmp);
tempDC.DeleteDC();
bTempDCCreate = false;
bTempBMPCreate = false;
}
CDialogBar::PostNcDestroy();
}
BOOL CRightBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if(nHitTest == HTCLIENT && IsOpenImage)
{
if(CursorInImage)
{
if(CursorInRedRect)
{
if(LButtonDown)
SetCursor( AfxGetApp()->LoadCursor(IDC_HANDGRABED));
else
SetCursor( AfxGetApp()->LoadCursor(IDC_HANDWANTGRAB));
return true;
}
SetCursor( AfxGetApp()->LoadCursor(IDC_HANDPOINT));
return true;
}
switch(pWnd->GetDlgCtrlID())
{
case IDC_SLIDER_BRIGHTNESS:
case IDC_SLIDER_CONTRAST:
SetCursor( AfxGetApp()->LoadCursor(IDC_HANDWANTGRAB));
return TRUE;
}
}
return CDialogBar::OnSetCursor(pWnd, nHitTest, message);
}
void CRightBar::DrawRedRect(CRect RedRect)
{
int dx, dy;
if(RedRect.left<ImageRect.left+1)
{
dx = ImageRect.left+1 - RedRect.left;
RedRect.OffsetRect(dx, 0);
}
else if(RedRect.right>ImageRect.right)
{
dx = ImageRect.right - RedRect.right;
RedRect.OffsetRect(dx, 0);
}
if(RedRect.top<ImageRect.top+1)
{
dy = ImageRect.top+1 - RedRect.top;
RedRect.OffsetRect(0, dy);
}
else if(RedRect.bottom>ImageRect.bottom)
{
dy = ImageRect.bottom - RedRect.bottom;
RedRect.OffsetRect(0, dy);
}
CClientDC dc(this);
dc.StretchBlt(ImageRect.left, ImageRect.top, ImageRect.Width()+1, ImageRect.Height()+1,
&tempDC,
0, 0, ImageRect.Width()+1, ImageRect.Height()+1,
SRCCOPY);
pOldPen = dc.SelectObject(&RedPen);
dc.SetROP2(R2_COPYPEN);
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(RedRect);
dc.SelectObject(pOldPen);
CPoint SCT;
SCT.x = int( (float)(RedRect.left - ImageRect.left-1) /(float)ImageRect.Width()*TVS.cx+0.5 );
SCT.y = int( (float)(RedRect.top - ImageRect.top-1) /(float)ImageRect.Height()*TVS.cy+0.5 );
CFrameWnd* pFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
CImageLABView* pView = (CImageLABView*)pFrameWnd->GetActiveFrame()->GetActiveView();
if(pView->fShowScale > 1)
{
int ImageSclae = int(pView->fShowScale);
SCT.x = (SCT.x+ ImageSclae- 1)/ImageSclae*ImageSclae;
SCT.y = (SCT.y+ ImageSclae- 1)/ImageSclae*ImageSclae;
}
if(pView->IsKindOf(RUNTIME_CLASS(CImageLABView)))
{
pView->ScrollToPosition(SCT);
pView->ScrollOrgPt = SCT;
}
}
LRESULT CRightBar::HandleInitDialog(WPARAM wparam, LPARAM lparam)
{
slider_B = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_BRIGHTNESS);
slider_C = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_CONTRAST);
m_Bright = MidBright;
m_Contrast = RangeContrast;
slider_B->SetRange(0, RangeBright);
slider_B->SetPos(m_Bright);
slider_B->SetTic(0);
slider_B->SetTic(25);
slider_B->SetTic(50);
slider_B->SetTic(75);
slider_B->SetTic(100);
slider_B->SetTic(125);
slider_B->SetTic(151);
slider_B->SetTic(177);
slider_B->SetTic(203);
slider_B->SetTic(229);
slider_B->SetTic(255);
slider_C->SetRange(0, RangeContrast+ RangeContrast);
slider_C->SetPos(RangeContrast);
slider_C->SetTic(0);
slider_C->SetTic(13);
slider_C->SetTic(25);
slider_C->SetTic(38);
slider_C->SetTic(50);
slider_C->SetTic(63);
slider_C->SetTic(75);
slider_C->SetTic(88);
slider_C->SetTic(102);
slider_C->SetTic(114);
slider_C->SetTic(127);
lpClip = Clip + 200;
memset(Clip, 255, 800);
for(int i= 0; i< 200; i++)
{
Clip[i] = 0;
}
for(i= 0; i< 256; i++)
{
lpClip[i] = BYTE(i);
}
return TRUE;
}
void CRightBar::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CSliderCtrl* pSlider = (CSliderCtrl*)pScrollBar;
slider_B = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_BRIGHTNESS);
slider_C = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_CONTRAST);
CFrameWnd* pFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
CImageLABView* pView = (CImageLABView*)pFrameWnd->GetActiveFrame()->GetActiveView();
if( pView == NULL ) return;
CImageLABDoc *m_pDoc = pView->GetDocument();
if( m_pDoc == NULL || m_pDoc->Image.m_lpDibArray == NULL ) return;
int ImageSize = m_pDoc->Image.m_ImageSize;
BYTE *lpImageStart, *lpImageEnd, *lpImageBakup;
if( m_pDoc->Image.m_lpDibArrayBuff == NULL )
m_pDoc->Image.BackUp();
if(pSlider == slider_B)
{
lpImageStart = m_pDoc->Image.m_lpDibArray;
lpImageEnd = m_pDoc->Image.m_lpDibArray + ImageSize;
lpImageBakup = m_pDoc->Image.m_lpDibArrayBuff;
m_Bright = pSlider->GetPos();
m_pDoc->Image.m_Bright = m_Bright;
m_AddB = m_Bright - MidBright;
for(BYTE* NowPixel= lpImageStart; NowPixel< lpImageEnd; NowPixel++, lpImageBakup++)
*NowPixel = *(lpClip + *lpImageBakup + m_AddB);
pView->Invalidate(false);
}
else if(pSlider == slider_C)
{
lpImageStart = m_pDoc->Image.m_lpDibArrayBuff;
lpImageEnd = m_pDoc->Image.m_lpDibArrayBuff + ImageSize;
m_Contrast = pSlider->GetPos();
m_pDoc->Image.m_Contrast = m_Bright;
m_AddB = m_Contrast - RangeContrast;
int max_r = *lpImageStart++;
int min_r = max_r;
for(BYTE* NowPixel= lpImageStart; NowPixel< lpImageEnd; NowPixel++)
{
if ( *NowPixel > max_r )
max_r = *NowPixel;
else if ( *NowPixel < min_r )
min_r = *NowPixel;
}
int GrayRange = max_r - min_r;
if( GrayRange == 0 ) return;
double a, b, fTemp;
if( m_AddB > 0 )
{
a = min_r - (double)(min_r + OverRange)* m_AddB/ OverRange;
b = (double)(255 + OverRange - max_r)* m_AddB/ OverRange + max_r;
}
else
{
int mid = GrayRange / 2;
a = min_r - (double) mid* m_AddB/ (double)OverRange;
b = max_r + (double) mid* m_AddB/ (double)OverRange;
if( fabs(b-a)< 2 )
{
a -= 1;
b += 1;
}
}
double ratio = (double)(b- a)/(double)(max_r - min_r);
// -----建立查找表-----
BYTE LUT[256];
for(int i= min_r; i<256; i++)
{
fTemp = (i- min_r)* ratio + a + 0.5;
if( fTemp < 0 )
LUT[i] = 0;
else if( fTemp < 255 )
LUT[i] = BYTE( fTemp );
else
LUT[i] = 255;
}
// -----进行线性变换-----
lpImageStart = m_pDoc->Image.m_lpDibArray;
lpImageEnd = m_pDoc->Image.m_lpDibArray + ImageSize;
lpImageBakup = m_pDoc->Image.m_lpDibArrayBuff;
for(NowPixel= lpImageStart; NowPixel< lpImageEnd; NowPixel++, lpImageBakup++)
{
*NowPixel = LUT[ *lpImageBakup ];
}
pView->Invalidate(false);
}
CDialogBar::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CRightBar::ButtonReset()
{
slider_B = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_BRIGHTNESS);
slider_C = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_CONTRAST);
if( !slider_B->IsWindowEnabled() ) return;
CFrameWnd* pFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
CImageLABView* pView = (CImageLABView*)pFrameWnd->GetActiveFrame()->GetActiveView();
if( pView == NULL ) return;
CImageLABDoc *m_pDoc = pView->GetDocument();
if( m_pDoc == NULL || m_pDoc->Image.m_lpDibArray == NULL ) return;
int ImageSize = m_pDoc->Image.m_ImageSize;
m_Bright = MidBright;
m_Contrast = RangeContrast;
slider_B->SetPos(m_Bright);
slider_C->SetPos(m_Contrast);
m_pDoc->Image.m_Contrast = -1;
m_pDoc->Image.m_Bright = -1;
m_pDoc->Image.ImgSwap();
m_pDoc->Image.BackUp();
pView->Invalidate(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -