태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

왜 발생하는가 -> 

extern struct_wpt* m_ptWptAll;

이런식으로 정해두고나서 쓰질 정의된 것이 없기때문에

참조를 하지 못하여 에러가 뜨는 것.


구글링을 해서 검색을 하면 무슨 라이브러리를 추가해야한다는둥 하는데

그냥 코딩을 잘못 한 것인 경우일 확률이 더 높다.

왜 저게 잘못되었냐.. 면 

struct_wpt* m_ptWptAll;

라는 문장을 코딩하지 않아서 이다.



위에

 extern struct_wpt* m_ptWptAll; 
라고 코딩한 내용은 선언이지 정의가 아니다.

다시 말해서 위의 extern 문은 프로그램안에 이런 변수가 있다고 알려주는 역할 밖에는 하지 않는다.
 

변수의 영역을 잡아주지도 않았는데 어떻게 참조할 수가 있겠는가?

그런고로  

.cpp 파일중 하나에서 
struct_wpt* m_ptWptAll;  

라는 문을 첨가해야 비로소 컴파일러는 해당 변수의 영역을 생성하는 코드를 만들게 된다.
 
저작자 표시 비영리
신고
Posted by 졸가메
프로그램 내에서 사용되는 코드들을 적어두는 포스팅.

일단은 외형을 짜는 방법부터 시작하였다.
 

대화상자[ 다이얼로그 ] 를 활용한 경로 알아내기 와 얻은 경로를
에디트 컨트롤 에 집어넣는 법.




도구상자들을 통하여 위와 같이 만들고

우측 파일 찾기 를 더블클릭하거나  이벤트 처리기 추가 를 통해 클릭 관련 처리를 만들어준다.

더보기


여기서 쓰인 중요 코드는  

CFileDialog Dlg(TRUE, _T("DAT"), NULL,
OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
_T("DAT Files(*.dat)|*.dat|All Files(*.*)|*.*||"),this);

파일 경로 를 알아내는 파일 대화 상자 코드이다.


원형은 다음과 같다

CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE);  



책에서는 CWnd 이후는 안적혀있다.

차례대로 열기 인지 저장 인지 명시하는 플래그  bOpenFileDialog

저장 모드일 시 입력받은 파일명에 덧붙일 확장명을 적어주는   lpszDefExt [열기 이므로 본 코드에선 NULL이다.]

 경로 입력 필드에 출력할 기본 값  lpszFileName 

그리고  
dwFlags  에는 속성이 들어가며  (OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST) 이 두 속성을 정하면

열려는 파일과 경로가 분명하게 있음을 의미함. 여기에 OFN_ALLOWMULTISELECT를 입력하여 추가하면 여러 파일을 선택할 수 있다.

원형에 쓰인  OFN_HIDEREADONLY  은 숨긴 파일은 보이지 말라는 속성이고  OFN_OVERWRITEPROMPT 은 저장모드에서 이미 같은 이름의 파일이 있을 때 경고창을 띄우라는 속성이다.

그 다음으로 중요한  속성은 
lpszFilter  가 있다.

이는 흔히 가장 첫번째로 해당 프로그램에서 사용할 파일들의 확장자를 정하여 그것들만 보이게 필터링 할 때 사용된다.

본문에 쓰인 것 처럼 띄어쓰기를 하지 않아야 잘 작동하므로 보기 편하라고 띄어쓰기를 하면 작동이 되지 않으니 주의해야한다. 

속성의 마지막에는 ||를 붙여서 끝을 표시해야 한다.
 
pParentWnd 는 새로 만들 파일 대화 상자의 부모 윈도우의 주소이다.



조건문인   if(Dlg.DoModal() == IDOK) 
를 통하여 정상적으로 파일을 입력시킨 경우에 해당 코드를 실행하게 한다. 


CString strValue;                               // 입력할 변수선언
strValue = Dlg.GetPathName();           // 입력할 내용
SetDlgItemText(IDC_LOG,strValue);    //저장.

GetPathName 을 통하여 대화상자에서 얻은 파일의 경로명을 스트링 변수에 집어넣고

그 값을 왼측의 에디트 컨트롤 에 집어넣는다. 


코드 파일 업로드.




ps. 주석처리 된 부분은 책에 있는 내용으로 주석을 해제하면 대화 상자에서 입력을 마치는 즉시 파일명 경로명 파일의 확장자 가 메시지로 출력된다. 


**공부에 도움이 되었다면 손가락 버튼을 클릭해주심 좋겠습니다.**   
저작자 표시 비영리
신고
Posted by 졸가메
6. C버튼 처리를 넣어준다.


void CCALCDlg::OnBnClickedClear()
{
mS = "";//초기화
m_sub = 0;
UpdateData(false);//변경된 변수값을 화면에 적용.
}

//화면내용 나타내주는 변수를 초기화 하고 변경된 값을 화면 출력으로 보냄.
//저장된 다른 앞의 항도 초기화해줌. 


7. 

4개의 사칙연산에 따른 코드 작성.

 

void CCALCDlg::OnBnClickedPlus()
{

m_sub = _tstoi(mS);
m_Newsub = 1;
mS = "";
UpdateData(false);

}

void CCALCDlg::OnBnClickedMinus()
{

m_sub = _tstoi(mS);
m_Newsub = 2;
mS = "";
UpdateData(false);
}
 
= 연산에서 처리하기 위해 각 버튼마다 int값의 표시를 만듬.


8.  

= 버튼의 코드를 작성



void CCALCDlg::OnBnClickedEq()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

CString exx;
int dab;


switch(m_Newsub)
{
case 1://덧셈
dab = m_sub + _tstoi(mS);

exx.Format(_T("%d"), dab);
mS = exx;

UpdateData(false);
m_sub = _tstoi(mS);
break;


case 2://뺄셈
dab = m_sub - _tstoi(mS);
exx.Format(_T("%d"), dab);
mS = exx;

UpdateData(false);
m_sub = _tstoi(mS);
break;
case 3://곱셈
dab = m_sub * _tstoi(mS);
exx.Format(_T("%d"), dab);
mS = exx;

UpdateData(false);
m_sub = _tstoi(mS);
break;
case 4://나눗셈
dab = m_sub / _tstoi(mS);
exx.Format(_T("%d"), dab);
mS = exx;
UpdateData(false);
m_sub = _tstoi(mS);
break;
}


}


////////////////

까지 하면 사칙연산을 간단하게 할 수 있는 계산기가 완성됩니다.

오오 계산기 오오.

 /////////////////////

하지만 이렇게 짜게되면 버튼입력으로 한 내용만. 계산이 가능한 뭔가 모자란 계산기가 된다.

이를 방지하려면 4칙연산과 = 버튼의 처리 시 UpdateData(true); 를 제일 위에 위치시켜주어

에디트 박스에 있는 값을 mS값에 입력시켜주면

잘 작동하게 된다.

////////////////////////




코드파일 업로드.

 

저작자 표시 비영리
신고
Posted by 졸가메

1. 외형을 짠다.

2. 외형에 맞는 아이콘별 아이디로 바꾸어준다. 

3. 변수를 지정해준다.

여기까지 진행한 후의 스샷.

 왼쪽은 미출력.

4. 각 숫자 버튼에 따른 클릭시에 숫자 추가하는 이벤트를 넣어준다.

public:
CString mS;
  afx_msg void OnBnClickedNumber0();
afx_msg void OnBnClickedNumber1();
afx_msg void OnBnClickedNumber2();
afx_msg void OnBnClickedNumber3();
afx_msg void OnBnClickedNumber4();
afx_msg void OnBnClickedNumber5();
afx_msg void OnBnClickedNumber6();
afx_msg void OnBnClickedNumber7();
afx_msg void OnBnClickedNumber8();
afx_msg void OnBnClickedNumber9();

//윗 부분은 자동추가. 

 

void CCALCDlg::OnBnClickedNumber0()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
mS +="0";
UpdateData(false);
} // 0번 키를 누를 시에 원래값, 에다 추가하는 명령을 내린다.
//다른 숫자 버튼들도 같은 작업을 하게 한다.


void CCALCDlg::OnBnClickedNumber1()
{
mS +="1";
UpdateData(false);
}


//......  아래로 9까지 반복.


5. 백스페이스 버튼 처리를 넣어준다.


void CCALCDlg::OnBnClickedBacks()
{
 
CString back;
UpdateData(true);
back.Format(_T("%s"), mS);
if(back != "0"){ // 문자열에 숫자값이 있을경우.
   
back.Delete(back.GetLength()-1, 1);
   if(back.GetLength() == 0)
    {
     back = "";
    }
   mS =(back);
UpdateData(false);
  }
 
}


이후는 다음이시간에.

현재까지의 코드 파일은 업로드 해둠.

**공부에 도움이 되었다면 손가락 버튼을 클릭해주심 좋겠습니다.**  
저작자 표시 비영리
신고
Posted by 졸가메
냅다 출력화면부터 보고!



#endif //_DEBUG


//추가부분


inline void RGBtoGray(COLORREF& rgb)

{


BYTE byGray = (GetRValue(rgb) *30

+ GetGValue(rgb) *59

+ GetBValue(rgb) *11) /100;


rgb = RGB(byGray,byGray,byGray);


}



//여기까지

//CSaveGrayDemoView.cpp에 추가하는 코드
//이 코드는 RGB를 흑백화 하는 코드이다. 
/////////////////////////////////


void CSaveGrayDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

CWnd* pWndDesktop = GetDesktopWindow();
CWindowDC ScrDC(pWndDesktop); //바탕화면 윈도우 DC
CClientDC dc(this); //뷰 윈도우 DC

CImage Image;
Image.Create(300,300,ScrDC.GetDeviceCaps(BITSPIXEL)); //바탕화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.


CDC* pDC = CDC::FromHandle(Image.GetDC());
pDC->BitBlt(0,0,300,300, &ScrDC, 0, 0, SRCCOPY);
Image.ReleaseDC(); //이미지 DC와 화면 DC에 바탕화면 윈도우 DC를 출력한다.


COLORREF rgb;
for(int x = 0; x<200; x++)//폭
for(int y = 0; y <200; ++y)//높이
{
rgb = Image.GetPixel(x,y);
//여기부터
RGBtoGray(rgb);
Image.SetPixel(x,y,rgb);      //Gray RGB값으로 변환

}
}

Image.BitBlt(dc.m_hDC,0,0); //흑백으로 변환된 이미지를 화면 DC에 출력

CView::OnLButtonDown(nFlags, point);
}

해당 코드대로 입력한 경우 + 윈도우창을 바탕화면상의 왼쪽 위에 둔채로 마우스 클릭을 하게되면 위과 같은 출력화면이 나온다. 

 바탕화면 일부분 스캔 + 일부분 흑백화 [클릭으로 출력활성화되며 onpaint가 아니고 OnLButtonDown이므로  윋도우 크기변경이나 이동겹침등으로 지워질 수 있다.


  

 CImage 클래스의 Create()메서드의 원형은 다음과 같다.

BOOL CImage::Create( int nWidth, int nHeight, int nBPP, DWORD dwFlags = 0) throw() ;

마지막 인자의 기본값이 0이며 이번 예제에서도 이 값을 사용하였다.
이 인자는 32비트 비트맵의 경우에 알파채널을 명시한다. 세번째 인자인 int nBPP 가 반드시 32 가 되어야 알파채널 을 명시할 수있다. 
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

다음은 해당 프로젝트에서 우클릭 을 하면 바탕화면을 별도의 이미지 파일로 저장하여 보여주는 코드이다.

이 역시 핸들러를 통해 추가하고 코드를 넣는다.



void CSaveGrayDemoView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.




CWnd* pWndDesktop = GetDesktopWindow();
CWindowDC ScrDC(pWndDesktop); //바탕화면 윈도우 DC
CClientDC dc(this); //뷰 윈도우 DC

CRect Rect;
pWndDesktop->GetWindowRect(&Rect); //바탕화면 윈도우의 크기를 알아낸다.

CImage Image; //바탕화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.
int cx = Rect.Width(); //바탕화면의높이
int cy = Rect.Height(); //바탕화면의 넓이
Image.Create(cx,cy,ScrDC.GetDeviceCaps(BITSPIXEL));

CDC* pDC = CDC::FromHandle(Image.GetDC());
pDC->BitBlt(0,0,cx,cy, &ScrDC,0,0,SRCCOPY);
dc.BitBlt(0,0,cx,cy, pDC,0,0,SRCCOPY);
Image.ReleaseDC();                    //이미지 DC와 화면 DC에 바탕화면 윈도우 화면을 출력한다.

Image.Save(TEXT("Desktop.jpg"),Gdipluse::ImageFormatJPEG); 
//JPEG형식으로 바탕화면 이미지를 저장한다.
::ShellExecute(NULL, TEXT("open"), TEXT("Desktop.jpg"), NULL,NULL,SW_SHOW);


CView::OnRButtonDown(nFlags, point);
}

//////////////////////////////////////////////////

바탕화면 윈도우의 크기를 알아내기 위해  GetWindowRect()함수를 사용한 부분과

이미지 저장 및 뷰어 실행을 빼면 왼클릭 함수와 크게 다르지 않다.

예제에서 Save() 함수는 현재 선택한 비트맵 이미지를 주어진 파일 형식으로 변환하여 저장하는 역할을 한다.

장 가능한 파일 형식으로는 ImageFormatGIF,ImageFormatBMP,ImageFormatPNG 등이 있다.

마지막에 있는 ::ShellExecute 라고 쓰인 API함수는  윈도우 탐색기에서 해당 파일을 더블클릭한 것과 같은 동작을 나타내는 함수이다.


원형과 인자에 관한 설명은 은 다음과 같다.

더보기



//////////////////////////
////////////////
 해당 코딩 후

좌클릭을 먼저하고  우클릭을 한 경우.

이러한 화면이 캡쳐되어 뜨게된다.

 

 또한 프로그램이 있는 위치에 Desktop.jpg 라는 파일이 하나 생기고 여기에 저 화면이 입력되어있게 된다.


마지막으로 코드가 있는 파일을 업로드.




 
저작자 표시 비영리
신고
Posted by 졸가메


티스토리 툴바