📄 adjusthuedlg.cpp
字号:
// AdjustHueDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RSImageStar.h"
#include "AdjustHueDlg.h"
#include "MainFrm.h"
#include "RSImageStarDoc.h"
#include "RSImageStarView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAdjustHueDlg dialog
CAdjustHueDlg::CAdjustHueDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAdjustHueDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAdjustHueDlg)
m_check = FALSE;
m_slid2pos = 0;
m_slid1pos = 0;
m_nslid1=100;
m_nslid2=100;
//}}AFX_DATA_INIT
}
void CAdjustHueDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAdjustHueDlg)
DDX_Control(pDX, IDC_SLIDER2, m_slid2);
DDX_Control(pDX, IDC_SLIDER1, m_slid1);
DDX_Check(pDX, IDC_CHECK1, m_check);
DDX_Text(pDX, IDC_EDIT2, m_slid2pos);
DDV_MinMaxInt(pDX, m_slid2pos, -100, 100);
DDX_Text(pDX, IDC_EDIT1, m_slid1pos);
DDV_MinMaxInt(pDX, m_slid1pos, -100, 100);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAdjustHueDlg, CDialog)
//{{AFX_MSG_MAP(CAdjustHueDlg)
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
ON_WM_DESTROY()
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
ON_EN_CHANGE(IDC_EDIT2, OnChangeEdit2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAdjustHueDlg message handlers
void CAdjustHueDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
if( lpFrameWnd == NULL ) return;
CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
if(lpView)
{
m_nslid1=m_slid1.GetPos();
m_nslid2=m_slid2.GetPos();
if(lpView->m_pDoc->m_Dib!=NULL)
{
switch(pScrollBar->GetDlgCtrlID())
{
case IDC_SLIDER1:
str.Format("%d",(m_nslid1-100));
pEdit1->SetWindowText(str);
if(m_check)
{
if(nSBCode!=SB_THUMBTRACK)
{
AdjustBrightness(m_nslid1);
if(m_nslid2!=100)
AdjustContrast(m_nslid2);
}
}
break;
case IDC_SLIDER2:
str.Format("%d",(m_nslid2-100));
pEdit2->SetWindowText(str);
if(m_check)
if(nSBCode!=SB_THUMBTRACK)
AdjustContrast(m_nslid2);
break;
}
lpView->Invalidate(false);
}
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
BOOL CAdjustHueDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_slid1.SetRange(0,200,false);
m_slid2.SetRange(0,200,false);
m_slid1.SetPos(100);
m_slid2.SetPos(100);
CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
if( lpFrameWnd == NULL ) return 0;
CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
if(lpView->m_pDoc->m_Dib->m_hPreDib==NULL)
return false;
DWORD dwSize = GlobalSize(lpView->m_pDoc->m_Dib->m_hPreDib);
ASSERT(dwSize);
LPBYTE lpDib = (LPBYTE) ::GlobalLock(lpView->m_pDoc->m_Dib->m_hPreDib);
ASSERT(lpDib);
if( m_hDib != NULL )
{
GlobalUnlock( m_hDib );
GlobalFree( m_hDib );
m_hDib = NULL;
}
m_hDib = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize);
LPBYTE lpfile = (LPBYTE) ::GlobalLock(m_hDib);
if( m_hDib1 != NULL )
{
GlobalUnlock( m_hDib1 );
GlobalFree( m_hDib1 );
m_hDib1 = NULL;
}
m_hDib1 = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize);
LPBYTE lpfile1 = (LPBYTE) ::GlobalLock(m_hDib1);
memcpy(lpfile,lpDib,dwSize);
memcpy(lpfile1,lpDib,dwSize);
::GlobalUnlock(lpView->m_pDoc->m_Dib->m_hPreDib);
::GlobalUnlock(m_hDib);
::GlobalUnlock(m_hDib1);
m_slid1pos=0;
m_slid2pos=0;
pEdit1=(CEdit*)GetDlgItem(IDC_EDIT1);
pEdit2=(CEdit*)GetDlgItem(IDC_EDIT2);
CButton* button= (CButton*)GetDlgItem(IDC_CHECK1);
m_check=true;
lpView->m_PreView=true;
button->SetCheck(m_check);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CAdjustHueDlg::OnCheck1()
{
// TODO: Add your control notification handler code here
m_check=m_check?false:true;
CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
if( lpFrameWnd == NULL ) return;
CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
if(!m_check)
{
lpView->m_PreView=false;
lpView->Invalidate();
}
else
{
if(m_nslid1!=100)
AdjustBrightness(m_nslid1);
if(m_nslid2!=100)
AdjustContrast(m_nslid2);
lpView->m_PreView=true;
lpView->Invalidate();
}
}
BOOL CAdjustHueDlg::AdjustBrightness(int Percentage)
{
if (m_hDib == NULL)
return FALSE;
if (Percentage < 0)
return FALSE;
BOOL bSuccess = TRUE;
CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
if( lpFrameWnd == NULL ) return 0;
CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
LPBYTE lpDib = (LPBYTE) ::GlobalLock(lpView->m_pDoc->m_Dib->m_hPreDib);
ASSERT(lpDib);
LPBITMAPINFO lpbmi=(LPBITMAPINFO)lpDib;
int numcolor=lpView->m_pDoc->m_Dib->GetColorMapNum(lpbmi->bmiHeader.biBitCount);
int DibInfoSize = sizeof(BITMAPINFOHEADER) + numcolor*sizeof(RGBQUAD);
LPBYTE lpdata=lpDib+DibInfoSize;
int width=lpbmi->bmiHeader.biWidth;
int width1=(lpbmi->bmiHeader.biWidth*lpbmi->bmiHeader.biBitCount/8+3)&~3;
int height=lpbmi->bmiHeader.biHeight;
LPBYTE lpfile = (LPBYTE) ::GlobalLock(m_hDib);
LPBITMAPINFO lpbmi1=(LPBITMAPINFO)lpfile;
LPBYTE lpdata1=lpfile+DibInfoSize;
float scale=float(Percentage/100.0);
if(lpbmi->bmiHeader.biBitCount>8)
{
for (int y=0;y<height; y++)
{
RGBTRIPLE* pixptr = (RGBTRIPLE*)(lpdata1);
RGBTRIPLE* pixptr1 = (RGBTRIPLE*)(lpdata);
for (int x=0;x<width; x++)
{
pixptr1[x].rgbtRed = min(int(pixptr[x].rgbtRed*scale),255);
pixptr1[x].rgbtGreen =min(int(pixptr[x].rgbtGreen*scale),255);
pixptr1[x].rgbtBlue =min(int(pixptr[x].rgbtBlue*scale), 255);
}
lpdata+=width1;
lpdata1+=width1;
}
DWORD dwSize = GlobalSize(m_hDib1);
ASSERT(dwSize);
LPBYTE lpfile1 = (LPBYTE) ::GlobalLock(m_hDib1);
memcpy(lpfile1,lpDib,dwSize);
::GlobalUnlock(m_hDib1);
}
else
{
for(int i= 0; i < numcolor; i++)
{
lpbmi->bmiColors[i].rgbBlue =min(int(lpbmi1->bmiColors[i].rgbBlue*scale),255);
lpbmi->bmiColors[i].rgbGreen =min(int(lpbmi1->bmiColors[i].rgbGreen*scale),255);
lpbmi->bmiColors[i].rgbRed =min(int(lpbmi1->bmiColors[i].rgbRed*scale),255);
}
LPBYTE lpfile1 = (LPBYTE) ::GlobalLock(m_hDib1);
LPBITMAPINFO lpbmi2=(LPBITMAPINFO)lpfile1;
for( i= 0; i < numcolor; i++)
lpbmi2->bmiColors[i]=lpbmi->bmiColors[i];
::GlobalUnlock(m_hDib1);
}
::GlobalUnlock(lpView->m_pDoc->m_Dib->m_hPreDib);
::GlobalUnlock(m_hDib);
return bSuccess;
}
BOOL CAdjustHueDlg::AdjustContrast(int Percentage)
{
if (m_hDib == NULL)
return FALSE;
if (Percentage < 0)
return FALSE;
BOOL bSuccess = TRUE;
CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
if( lpFrameWnd == NULL ) return 0;
CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
LPBYTE lpDib = (LPBYTE) ::GlobalLock(lpView->m_pDoc->m_Dib->m_hPreDib);
ASSERT(lpDib);
LPBITMAPINFO lpbmi=(LPBITMAPINFO)lpDib;
int numcolor=lpView->m_pDoc->m_Dib->GetColorMapNum(lpbmi->bmiHeader.biBitCount);
int DibInfoSize = sizeof(BITMAPINFOHEADER) + numcolor*sizeof(RGBQUAD);
LPBYTE lpdata=lpDib+DibInfoSize;
int width=lpbmi->bmiHeader.biWidth;
int width1=(lpbmi->bmiHeader.biWidth*lpbmi->bmiHeader.biBitCount/8+3)&~3;
int height=lpbmi->bmiHeader.biHeight;
LPBYTE lpfile = (LPBYTE) ::GlobalLock(m_hDib1);
LPBITMAPINFO lpbmi1=(LPBITMAPINFO)lpfile;
LPBYTE lpdata1=lpfile+DibInfoSize;
float scale=float(Percentage/100.0);
if(lpbmi->bmiHeader.biBitCount>8)
{
for (int y=0;y<height; y++)
{
RGBTRIPLE* pixptr = (RGBTRIPLE*)(lpdata1);
RGBTRIPLE* pixptr1 = (RGBTRIPLE*)(lpdata);
for (int x=0;x<width; x++)
{
int value=128 + int((pixptr[x].rgbtRed - 128)*scale);
if(value<0)
value=0;
pixptr1[x].rgbtRed = min(value, 255);
value=128 + int((pixptr[x].rgbtGreen - 128)*scale);
if(value<0)
value=0;
pixptr1[x].rgbtGreen = min(value, 255);
value=128 + int((pixptr[x].rgbtBlue - 128)*scale);
if(value<0)
value=0;
pixptr1[x].rgbtBlue = min(value, 255);
}
lpdata+=width1;
lpdata1+=width1;
}
}
else
{
for(int i= 0; i < numcolor; i++)
{
int value=128 + int((lpbmi1->bmiColors[i].rgbRed - 128)*scale);
if(value<0)
value=0;
lpbmi->bmiColors[i].rgbRed = min(value, 255);
value=128 + int((lpbmi1->bmiColors[i].rgbGreen - 128)*scale);
if(value<0)
value=0;
lpbmi->bmiColors[i].rgbGreen = min(value, 255);
value=128 + int((lpbmi1->bmiColors[i].rgbBlue - 128)*scale);
if(value<0)
value=0;
lpbmi->bmiColors[i].rgbBlue = min(value, 255);
}
}
::GlobalUnlock(lpView->m_pDoc->m_Dib->m_hPreDib);
::GlobalUnlock(m_hDib1);
return bSuccess;
}
void CAdjustHueDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
if(m_hDib!=NULL)
{
GlobalUnlock(m_hDib);
GlobalFree(m_hDib);
m_hDib=NULL;
}
if(m_hDib1!=NULL)
{
GlobalUnlock(m_hDib1);
GlobalFree(m_hDib1);
m_hDib1=NULL;
}
CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
if( lpFrameWnd == NULL ) return ;
CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
lpView->m_PreView=false;
}
void CAdjustHueDlg::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
if( lpFrameWnd == NULL ) return;
CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
if(lpView==NULL)
return;
UpdateData(TRUE);
if(m_nslid1!=(100+m_slid1pos))
{
m_nslid1=(100+m_slid1pos);
m_slid1.SetPos(m_nslid1);
if(m_check)
{
AdjustBrightness(m_nslid1);
lpView->Invalidate(false);
}
}
}
void CAdjustHueDlg::OnChangeEdit2()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
if( lpFrameWnd == NULL ) return;
CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
if(lpView==NULL)
return;
UpdateData(TRUE);
if(m_nslid2!=(100+m_slid2pos))
{
m_nslid2=(100+m_slid2pos);
m_slid2.SetPos(m_nslid2);
if(m_check)
{
AdjustContrast(m_nslid2);
lpView->Invalidate(false);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -