'컴퓨터 > c자료' 카테고리의 다른 글

c관련 용어  (0) 2013.12.29
MFC Tip (출처 탑건매직님)  (0) 2013.12.29
LPCTSTR, LPTSTR 의 차이점  (0) 2013.12.29
MFC 파일 불러오기 , 파일 저장하기 다이얼로그 (출처 신기루님)  (1) 2013.12.29
lcd 출력  (0) 2013.12.29
by 리베리온 2013. 12. 29. 23:50

엔디안(endian)


단어를 형성하는 2진 바이트에서 저장하는 바이트의 순서를 나타내는 방법. 빅 엔디안(big-endian)과 리틀 엔디안(little-endian)이 있는데, 빅 엔디안은 최상위 비트(MSB)부터 부호화되어 저장되며, 리틀 엔디안은 최하위 비트(LSB)부터 부호화되어 저장된다. 예를 들면, 숫자 12는 2진수로 나타내면 1100인데 빅 엔디안은 1100으로, 리틀 엔디안은 0011로 각각 저장된다.

16진수 "4F52"을 빅 엔디안과 리틀 엔디안으로 표기하자면

빅 엔디안 --> "4F52"

리틀 엔디안 --> "524F"

리틀 엔디안은 완전 거꾸로인 "25F4"아닌 이유는 각 바이트 내에 들어있는 비트들은 모두 빅엔디안으로 정렬되어 있다.

즉, 저장된 바이트의 주어진 숫자에 의해 표현되는 전체적인 비트 스트림에 관해서는 빅이나 리틀 엔디안으로 하려는 시도가 없다는 것이다.

추가적인 예를 들어 16진수 "4F"가 저장공간 내에 주어진 저장주소 범위 내에 있는 다른 바이트들과 함께 저장될때 리틀이든 빅이든 간에 그 바이트 내의 비트 순서는 다음과 같이 된다.

01001111

그래서 리틀에서 바이트 단위로 저장되기 때문에 "25F4"가 아닌 "524F"가 되는 것이다

IBM 370 컴퓨터와 대부분의 RISC 기반의 컴퓨터들, 그리고 모토로라 마이크로프로세서는 빅 엔디안 방식을 사용하고 인텔 프로세서나 DEC의 알파 프로세서등 그것들 상에서 운영되는 일부 프로그램들은 리틀 엔디안을 사용한다.


메모리뱅크(memory bank)

메모리 칩을 1워드 폭을 갖는 bank로 구성하여 한 번에 여러 개의 word를 읽거나 쓰는 것

장점은 읽기에서는 어드레스를 여러 개의 bank로 전송하여 데이터를 동시에 읽을 수 있고

쓰기에서는 같은 bank가 아니면 기다리지 않고 계속 쓰기 가능하다.

실제 분할 예

4 개의 bank를 사용하는 경우, 어드레스를 워드 단위로 인터리브를 적용함.

Modulo 함수 이용

address modulo 4 = 0 이면 bank0

address modulo 4 = 1 이면 bank1

address modulo 4 = 2 이면 bank2

address modulo 4 = 3 이면 bank3








비동기식 버스(asynchronous bus)


송신측(sender)와 수신측(receiver) 모두 동의할 때만 다음 단계로 진행하는 일련의 처리 과정인 핸드쉐이킹 프로토콜(handshaking protocol)을 사용

버스에 연결될 수 있는 장치의 수 혹은 물리적인 길이 등으로 보아 입출력 버스에 적합하다

장점은 다양한 장치를 수용할 수 있고, 클록 스큐 혹은 동기화에 관련된 문제가 없기 때문에 길이가 긴 버스에도 사용 가능하다

단점은 핸드쉐이킹 신호를 송수신하기 위한 추가적인 제어선(control lines)이 필요 하고, 핸드쉐이킹 부담으로 인하여 비교적 속도가 느리다.


NOR / NAND Flash


NOR Flash는 읽는 속도는 빠른 반면 저장 용량을 확대하고 전력 소비량과 부피가큰 문제가 있고 NAND Flash는 저장용량이 NOR보다는 저장밀도가 높고 원가가 낮으며 그렇지만 쓰는 속도를 늘리는데 문제가 있다 주로 사용하는곳은 휴대폰에 주로 사용해서 MP3, 카메라 같은 것을 지원한다


전기적 소거 및 프로그램 가능 읽기 전용 기억 장치(EEPROM)


EEPROM은 사용자가 메모리 내의 내용을 수정할 수 있는 롬으로서, 정상보다 더 높은 전압을 이용하여 반복적으로 지우거나, 다시 프로그램 (기록)할 수 있다. EPROM 칩과는 달리, EEPROM은 기록된 내용을 수정하기 위해 컴퓨터에서 빼낼 필요가 없다. 그러나, EEPROM 칩은 일부 내용을 선택적으로 수정할 수는 없으며, 전체 내용을 지우고 다시 프로그램 해야만 한다. 이것은 또한, 사용할 수 있는 수명에도 제한이 있는데, 다시 프로그램할 수 있는 횟수가 10만회 미만으로 제한될 수 있다. 컴퓨터가 사용되는 동안 자주 다시 프로그래밍되는 EEPROM에서는, EEPROM의 수명이 아주 중요한 설계 고려사항이 될 수 있다고 한다.


SDRAM (synchronous dynamic random access memory)


SDRAM은 클록속도가 마이크로프로세서와 동기화되어 있는 DRAM의 다양한 종류를 모두 일컫는 일반 명칭이다. 클록속도의 동기화는 주어진 시간 내에 프로세서가 수행할 수 있는 명령어 개수를 증가시키는데 도움을 주고 속도는 나노초를 쓰지 않고 메가헤르츠(MHz)로 나타내는데, 이렇게 하면 버스 속도와 램 칩의 속도를 비교하기가 더 쉽기 때문이다.

그리고 DRAM의 발전된 형태고 보통 DRAM 과는 달리 제어 장치 입력을 클록펄스(Clock Pulse)와 동시에 일어나도록 하는 동기식 DRAM 이다.






DRAM (Direct-RAM-BUS)


DRAM은 REFRESH를 계속 해주어야한다 이유는 RAM이기 때문에 정보를 읽고 쓰는 것이 가능하나 전원 이 공급되고 있는 동안이라도 일정기간 내에 주기적으로 정보를 다시 써넣지 않으면 기억된 내용이 없어지는 메모리이기 때문이다. 그러나 Memory cell(기억소자)당 가격이 싸고 집적도를 높일 수 있기 때문에 대용량 메모리로서 널리 이용되고 있다. 하나의 기억소자는 1개의 트랜지스터와 1개의 캐패시터롤 구성되어 있다 SRAM과 다른점은

정적램이 반도체에 데이터를 저장하기 때문에 속도가 빠르고 다이나믹램과 같이 리프레시가 필요 없지만 다이나믹램에는 리프레시가 꼭 필요하다는게 차이점이다. (리프레시란 컨덴서란 전기 회로적 용어에 일정주기로 전력을 모아주는것을 말한다.) 이러한 리프레시를 일정기간에 한 번씩 해주어야 하므로 데이터를 처리하는데 상당한 성능 저하를 초래한다.


Watchdog Timer


카운터의 일종으로 계속 정기적인 리셋이 입력는 것이 정상상태이며, 비정상 상태에서 요구되는 리셋이 없어지고 카운터가 올라가면 시스템을 재부팅 시키는 펄스를 발생시키는 역할을 한다. 프로세스에 응용되는 프로그램을 작성하고 이식한 후 Run했을 때 동일한 루틴을 계속 반복하는 무한 루프(Endless Loop)를 돌거나 폭주 또는 프로그램 어드레스 영역 밖의 공간을 지정하게 되면 메모리에서 명령어를 가져와(patch) 실행할 수 없으므로 시스템이 정지된 상태가 된다. 이때 프로세서는 Holt, 즉 시스템의 안정성에 대해 신뢰할 수 없는 상태, 아무런 일을 할 수 없는 CPU가 죽은 때라 할 수 있다. PC도 어쩌다 발생할 경우가 있는데, 이 경우 사용자는 리셋 버튼을 눌러 빠져 나온다. 이렇게 CPU가 Holt 상태가 되었을 때 강제적으로 리셋을 눌러 초기화하는 감시용 타이머인 WDT(Watchdog Timer) 기능이 있는데 문자 그대로 집을 지키는 개를 뜻한다. 이는 주기적으로 개에게 밥을 주는데 일정시간이 지나도 먹이를 주지 않으면 주인을 물어 버리는 경우 즉, 강제적으로 리셋 또는 인터럽트(Interrupt)를 발생 시킨다 에서 유래되었다.


 

by 리베리온 2013. 12. 29. 23:47

출처 탑건매직 | 탑건매직
원문 http://blog.naver.com/topgunmagic/120035126718

 

1. DC얻기

CClientDC dc(this);


2. Client 영역 구하기

GetClientRect(&rect);

WM_SIZE 메시지발생후 cx,cy 사용


3. 문자열 사각형안에 그리기

pDC->DrawText(문자열,사각형,Style);

Style : DT_BOTTOM - 문자열을 사각형 맨아래줄에배열 반드시DT_SINGLELINE과 함께사용

DT_CENTER - 문자열을 가로중앙에 배치

DT_VCENTER - 문자열을 세로중앙에 배치

DT_LEFT,RIGHT - 문자열을 좌,우로 배치

DT_SINGLELINE - 문자열을 한줄로만 쓴다


4. Brush 사용법

CBrush brushname(RGB(red,green,blue)); //브러쉬 생성

//이전Brush 저장, 새로운 Brush 선택

CBrush *oldBrush=pDC->SelectObject(&brushname);

pDC->SelectObject(oldBrush); //원래의 브러쉬로 반환


5. Pen사용법

CPen pen(Pen Style,RGB(red,green,blue)); //브러쉬생성

//Style: PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_GEOMETRIC,PS_COSMETRIC

- 펜종류

PS_ENDCAP_ROUND,PS_ENDCAP_SQUARE - 펜끝을 둥글게,각지게 설정

CPen *oldPen=pDC->SelectObject(&pen); //이전Pen저장, 새로운 Pen설정

pDC->SelectObject(oldPen); //펜반환


6. 화면다시그리기

View Class에서 - Invalidate(TRUE) : 화면을 지우고다시그린다

Invalidate(FALSE) : 화면을 덮어씌운다

UpdateAllViews(NULL); // Doc Class에서 View 의 OnDraw 호출

RedrawWindow();


7. 메시지,함수 수동으로 넣기 (EX)버튼클릭함수넣기

헤더파일의 AFX_MSG_MAP 부분에 함수를 정의

// .cpp파일의 AFX_MSG 부분에 메시지를 추가한다

EX) afx_msg void funcName();

// ID 등록: View 메뉴의 Resource Symbol 에 들어가서 메뉴 ID 를 등록해준다..

EX) ON_BN_CLICKED(ID_NAME,funcName).

// .cpp파일의 맨아래에서 함수를 정의한다

EX) void CClass::funcName() { ... }


8. 마우스커서 바꾸기

리소스탭에서 커서를 그리고 저장한뒤 ID값은 준다음

SetCapture(); //커서의입력을 클라이언트영역을 벗어나더라도 받아낸다

SetCursor(AfxGetApp()->LoadCursor(nIDResource));

//APP클래스의 LoadCursor View의 SetCursor 사용

ReleaseCapture(); //SetCursor()상태를 해제한다


9. 색상표 사용하기

CColorDialog dlg;

if(dlg.DoModal()==IDOK) //Dialog 를 띄운후 OK버튼을누르면 실행할부분

MemberFunc: GetColor() //선택된 색상을 받아온다 return 형은 COLORREF 형


10. 팝업메뉴 만들기

CMenu menu; //메뉴 객체생성

CMenu *pmenu; //메뉴 포인터생성

menu.LoadMenu(IDR_MAINFRAME); //메뉴를 불러온다

pmenu=menu.GetSubMenu(3); //메뉴의 3번째 메뉴를 가져온다

menu.CheckMenuItem(ID_MENU,m_kind==ID_MENU ? MF_CHECKED : MF_UNCHECKED); //메뉴 체크하기 (메뉴 ID, ID 체크조건)

pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this) //(TMP_Style,x좌표,y좌표,hWnd) 메뉴 띄우기


*주의사항*

[안내]태그제한으로등록되지않습니다-OnContextMenu(CWnd* pWnd, CPoint point) //여기서 point 는 스크린 기준이고,

OnRButtonDown(UINT nFlags, CPoint point) //여기서 point 는 클라이언트 기준이다!


11. 클라이언트 포인터를 스크린 포인터로 변경

ClientToScreen(&point);


12. 그림판기능

if(m_flag==FALSE) return; //m_falg=그리기 기능 참,거짓설정 그리기 아니면 빠져나간다

CClientDC dc(this);

CPen myPen(PS_SOLID,m_width,m_color);

CPen *pOldPen=dc.SelectObject(&myPen);

switch(m_shape)

{

case ID_FREELINE: //자유선그리기

dc.MoveTo(m_oldpt.x,m_oldpt.y); //지난포인터부터

dc.LineTo(point.x,point.y); //새포인터까지 그린다

break;

case ID_RECT: //사각형그리기

dc.SetROP2(R2_NOTXORPEN);

dc.Rectangle(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y); //지워지는 효과

dc.Rectangle(m_spt.x,m_spt.y,point.x,point.y); //그려지는 효과

break;

case ID_ELLIPSE: //원그리기

dc.SetROP2(R2_NOTXORPEN);

dc.Ellipse(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y); //지워지는 효과

dc.Ellipse(m_spt.x,m_spt.y,point.x,point.y); //그려지는 효과

break;

case ID_LINE: //선그리기

dc.SetROP2(R2_NOTXORPEN);

dc.MoveTo(m_spt.x,m_spt.y); //시작점부터

dc.LineTo(m_oldpt.x,m_oldpt.y); //지난점까지 그은선을 지운다

dc.MoveTo(m_spt.x,m_spt.y); //시작점부터

dc.LineTo(point.x,point.y); //새로운점까지 그린다

break;

}

m_oldpt=point; //바로이전값 보관

dc.SelectObject(pOldPen); //펜 반환


13. MessageBox

AfxMessageBox()->전역함수를 이용하영 메세지 박스를 출력한다. //어디서든지 사용할수 잇다

int CWnd::MessageBox("메세지","창제목","아이콘|버튼(상수값)"); //View클래스에서 사용한다

아이콘 상수값 MB_IC[안내]태그제한으로등록되지않습니다 - xxONERROR,

MB_ICONWARNING, MB_ICONQUESTION,MB_ICONINFOMATION

MB_SYSTEMMODAL //시스템모달 대화창 닫기전에 다른작업 못함

MB_APPLMODAL //응용모달

버튼 상수값 MB_OK, MB_OKCANCEL, MB_YESNO


14. OS 컨트롤

ExitWindowEx(EWX_SHUTDOWN,NULL); //Shut Down

ExitWindowsEx(EWX_FORCE,0); //강제종료

ExitWindowsEx(EWX_LOGOFF,0); //로그오프

ExitWindowsEx(EWX_POWEROFF,0); //Shut Down -> Turn Off

ExitWindowsEx(EWX_REBOOT); //Shut Down -> Reboot


15. DialogBox 메시지 교환

UpdateData(FALSE); // 컨트롤에 멤버변수의 내용을 표시해준다

UpdateData(TRUE); // 컨트롤 내용을 다이얼로그 클래스의 멤버변수로 저장


16. 자료변환

atoi,itoa - int <=> ASCII(char) 변환

str.Format(" %d %d",x,y); // int형을 문자열로 변환

atol,ltoa - ASCII <=> long 변환

atof - ACSII => float 변환

fcvt,gcvt - 실수를 text로 변환

LPtoDP, DPtoLP - 장치좌표 <=> 논리좌표 변환


17. CEdit Class 사용하기

CEdit e_str.SetSel(int StartChae, int EndChar); //처음문자부터 마지막까지 블록 지정

CEdit e_str.GetSel(int SChar,int EChar); //블럭 지정한 처음문자와 마지막문자 받기

CString str=m_str.Mid(SChar,EChar-SChar); //블럭지정한 부분을 가져온다


18. 컨트롤과 자료교환

SetDlgItemText(컨트롤 ID,문자열) //컨트롤에 문자열을 넣는다

GetDlgItemText(컨트롤 ID,문자열) //컨트롤의 내용을 문자열에 넣는다

GetDlgItem(컨트롤 ID); //컨트롤의 주소를 가져온다


19. 상태바조작

CMainFrame 생성자 위에

static UINT indicators[] = //이안에 새로운 ID를 넣고 그 ID의 갱신핸들러를 만든다음 코딩

pCmdUI->SetText("표시할내용“);


20. 수동으로 Bitmap 컨트롤 사용하기

CStatic bitmap; //bitmap 컨트롤변수

bitmap.SetBitmap(CBitmap m_bitmap); //컨트롤에 비트맵지정

GetDlgItem(IDC_BITMAP)->ShowWindow(SW_SHOW,HIDE); // 그림을 보이거나 숨긴다.

 

21. 응용프로그램 실행하기

WinExec("프로그램경로“,SW_SHOW,HIDE); //응용프로그램실행,경로는 \\로 구분한다


22. Bitmap 사용하기

CBitmap bitmap.LoadBitmap(IDC_BITMAP); //비트맵객체에 비트맵지정

CDC memDC; //그림그릴 메모리DC생성

MemDC.CreateCompatibleDC(pDC); //화면 DC와 메모리 DC 호환 생성

CBitmap *pOldBitmap=MemDC.SelectObject(&m_bitmap); //메모리에 그림을그린다.

pDC->BitBlt(int x, int y,int Width, int Height, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop);

//BitBlt(그림x좌표,그림y좌표,그림넓이,그림높이,그림그려진메모리DC,그림시작x좌표,그림시작y좌표,스타일);

pDC->StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop )

//StretchBlt(그림x좌표,그림y좌표,그림넓이,그림높이,그림그려진메모리DC,그림x좌표,그림y좌표,메모리그림넓이,메모리그림높이,스타일);

MemDC.SelectObject(pOldBitmap); // 메모리DC반환


23. Font 바꾸기

CFontDialog dlg; //폰트다이얼로그 생성

LOGFONT m_logFont; //폰트받을변수선언

if(dlg.DoModal()==IDOK) //폰트다이얼로그표시

{dlg.GetCurrentFont(&m_logFont)} //선택된 폰트받기

OnDraw()

CFont newFont,*pOldFont; //폰트 객체 만들기

newFont.CreateFontIndirect(&m_logFont); //폰트 생성

pOldFont=(CFont *)pDC->SelectObject(&newFont); //폰트 선택

OnCreate()

CClientDC dc(this); //DC 생성

CFont *pFont=dc.GetCurrentFont(); //클라이언트 영역의 폰트를

pFont->GetLogFont(&m_logFont); //로그폰트 멤버값으로 지정


24. Font 만들기

LOGFONT logfont; //폰트를 만든다

logfont.lfHeight=50; //문자열 높이

logfont.lfWidth=0; //너비

logfont.lfEscapement=0; //문자열기울기

logfont.lfOrientation=0; //문자개별각도

logfont.lfWeight=FW_NORMAL; //굵기

logfont.lfItalic=TRUE; //이탤릭

logfont.lfUnderline=TRUE; //밑줄

logfont.lfStrikeOut=FALSE; //취소선

logfont.lfCharSet=HANGUL_CHARSET; //필수

logfont.lfOutPrecision=OUT_DEFAULT_PRECIS;

logfont.lfClipPrecision=CLIP_DEFAULT_PRECIS; //가변폭폰트 고정폭폰트

logfont.lfPitchAndFamily=DEFAULT_PITCH|FF_SWISS; //글꼴이름

strcpy(logfont.lfFaceName,"궁서체");

CClientDC dc(this);

CFont newFont; //폰트객체생성

newFont.CreateFontIndirect(&logfont); //폰트지정

CFont *pOldFont=dc.SelectObject(&newFont); //폰트선택

dc.TextOut(100,100,m_text);

dc.SelectObject(pOldFont); //폰트반환


25. Font 만들기 2

CFont newFont;

newFont.CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );

CFont *pOldFont=dc.SelectObject(&newFont);


26. ComboBox 사용하기

CComboBox combo; //콤보박스 선언

combo.Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

//Style - WS_CHILD|WS_VISIBLE

int n=combo.GetCurSel(); //선택된 아이템의 index를 가져온다

combo.AddString("문자열“); //문자열을 추가한다

combo.GetLBText(n,str); //n번째 아이템을 str에 저장


27. Spin 사용하기

Spin은 바로앞의 Tab Order에 따라 붙는다

m_spinr.SetRange(1900,3000); //스핀 범위 지정

m_spinr.SetPos(m_nYear); //스핀 위치 지정


28. CTime사용하기

CTime time; //시간객체생성

time=CTime::GetCurrentTime(); //현재시간을 저장

time.GetYear(),time.GetMonth();,time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond()


29. CListBox 메소드

AddString("문자열"); //리스트에 문자열 추가

DeleteString(index); //리스트에서 항목 삭제

GetCount() //전체 항목 갯수를 얻는다.

GetSelcount() //선택된 항목 갯수 리턴

GetSel() //선택된 것인지 아닌지를 리턴한다 -> 양수 = TRUE , 음수 => FALSE

GetText(int index,문자열변수) //index 번째 문자열을 문자열 변수에 넣는다

FindStringExact(문자열) //지정 문자열의 index 값 리턴 -> 없으면 리턴값 LB_ERR 반환

FindString("a") //"a"로 시작하는 항목을 모두 찾는다.

ResetCountent() //모든 내용을 지운다.


30. 파일입출력

프로젝트생성시 Step4 => Advanced => 저장파일확장자지정

//이 클래스를 저장,로드가능한 클래스로 쓰겟다는 선언

.h 파일에 DECLARE_SERIAL(CSawon)

.cpp 파일에 IMPLEMENT_SERIAL(CSawon,CObject,1) //이거를 해야 저장이 가능하다

void CFileioDoc::Serialize(CArchive& ar)

if (ar.IsStoring())

{

ar< < //저장하기

}

else //열기

{

ar>>m_shape; //불러올걸 쓴다. 읽을때도순서대로읽어야한다

}

 


31. MicroSoft FlexGrid 사용하기!

CMSFlexGrid m_Grid; //FlexGrid 컨트롤 변수

CString strTitle[]={"고객코드","고객성명","고객포인트","신장","몸무게","고객등급","BMT지수","판정결과"}; // Grid 의 제목에 넣을문자배열

int Width[]={900,900,1100,800,800,900,1000,900}; // Grid 의 열넓이 지정할 배열

m_Grid.SetRows(m_cnt+2); //전체행수 지정

m_Grid.SetCols(8); //전체열수 지정

m_Grid.Clear(); //지우기

m_Grid.SetFixedCols(0); //고정열은 없다.

m_Grid.SetRow(0); // 행선택

for(int i=0;i<=7;i++)

{

m_Grid.SetColWidth(i,Width[i]); //열 넓이 설정

m_Grid.SetCol(i); //열 선택

m_Grid.SetText(strTitle[i]); // 선택된행, 선택된열에 Text 를 넣는다

}


32. 4대 Class간 참조

//각각 헤더파일 include

#include "MainFrm.h" //메인프레임 헤더파일

#include "ClassDoc.h" //Doc클래스 헤더파일

#include "ClassView.h" //View를 include 할때는 반드시 Doc 헤더파일이 위에잇어야한다

#include "Class.h" //APP Class 의 헤더파일


void CClassView::OnMenuView() //뷰클래스

CClassApp *pApp=(CClassApp *)AfxGetApp(); //View -> App
CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //View -> MainFrm

//View -> MainFrm -> Doc

CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument();

CClassDoc *pDoc=(CClassDoc *)GetDocument(); //View -> Doc


//MainFrame 클래스

CClassView *pView=(CClassView *)GetActiveView(); //MainFrm -> View

CClassDoc *pDoc=(CClassDoc *)GetActiveDocument(); //MainFrm -> Doc

CClassApp *pApp=(CClassApp *)AfxGetApp(); //MainFrm -> App


//Doc 클래스

CClassApp *pApp=(CClassApp *)AfxGetApp(); //Doc -> App

CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //Doc -> MainFrm

// Doc -> MainFrm -> View

CClassView *pView=(CClassView *)pMain->GetActiveView();

CClassView *pView=(CClassView *)m_viewList.GetHead(); // Doc -> View


//App 클래스

CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //App -> MainFrm

//App -> MainFrm -> View

CClassView *pView=(CClassView *)pMain->GetActiveView();

//App -> MainFrm -> Doc

CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument();


33. ToolBar 추가하기

CMainFrame 으로 가서 멤버변수 추가

CToolBar m_wndToolBar1;

OnCreate 로 가서 다음 내용을 추가해준다

(위의 toolbar 부분을 복사하고 이름만 바꾸면 된다.3군데..)

if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE |

CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |

CBRS_SIZE_DYNAMIC) || !m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1))

{

TRACE0("Failed to create toolbar\n");

return -1; // fail to create

}


그 함수내에서 //TODO 아래에 내용추가..역시..복사해서 이름만 바꾸면 된다.

m_wndToolBar1.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);

//DockControlBar(&m_wndToolBar1); <= 이부분 대신..

이거를 넣는다..

CRect toolRect; //툴바 영역을 얻을 사각형

this->RecalcLayout(); //현상태의 Client 영역을 구해서 저장한다

m_wndToolBar.GetWindowRect(&toolRect); //툴바영역을 저장한다

toolRect.left+=1; //사각형의 왼쪽을 1Pixel 줄인다

//ToolRect에 툴바를 붙인다

DockControlBar(&m_wndToolBar1,AFX_IDW_DOCKBAR_TOP,&toolRect);

return 0;


34. ToolBar에 ComboBox붙이기

CComboBox m_combo; //객체생성

ID 등록 => view 메뉴 => resource symbol => new => ID_COMBO

oncreate 에 내용 추가 (콤보를 만들고 표시하는 내용)

m_wndToolBar.SetButtonInfo(10,IDC_COMBO,TBBS_SEPARATOR,150);

//툴바의 10번째버튼을 편집한다

CRect itemRect; //콤보를넣을 사각형을 만든다

m_wndToolBar.GetItemRect(10,&itemRect); //툴바의 10번째 버튼을 사각형에 넣는다
itemRect.left+=5; //앞여백

itemRect.right+=5; //뒤여백

itemRect.bottom+=100; //콤보가열릴 공간확보

m_combo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,itemRect,&m_wndToolBar,IDC_COMBO);

//콤보박스를 툴바에 붙여준다

m_combo.AddString("이름"); //내용추가

m_combo.SetCurSel(0); //셀 선택


35. Toolbar에 수동으로넣은 ComboBox 사용하기

afx_msg void [안내]태그제한으로등록되지않습니다-xxOnSelectCombo(); //원형

ON_CBN_SELCHANGE(IDC_COMBO,[안내]태그제한으로등록되지않습니다-xxOnSelectCombo) //메세지맵에 추가

CMainFrame *pMain=(CMainFrame *)GetParent(); //메인프레임 주소참조

CComboBox *pCom=(CComboBox *)(pMain->m_wndToolBar.GetDlgItem(IDC_COMBO));

//콤보박스의 주소를 가져온다, 접근할 때 메인프레임 -> 툴바 -> 콤보박스 의 순서로 가야한다

int n=pCom->GetCurSel(); //현재선택된 셀의 인덱스를 가져온다

if(n==CB_ERR) return; //선택된셀이 없으면 중지한다

CString str;

pMain->m_combo.GetLBText(n,str); //선택된셀의 Text를 가져온다


36. UPDATE_COMMAND 사용하기

pCmdUI->Enable(TRUE); //버튼 활성화

pCmdUI->SetText((bAdd)?"취소":"신규"); //버튼의 text 설정

pCmdUI->SetCheck(TRUE); //버튼 체크


37. 프로그램정보저장

CWinApp::GetProfileString(섹션명,항목명,기본값); // 함수를 사용한다. (문자열)

CWinApp::GetProfileInt(섹션명,항목명,기본값); //불러올때사용 (숫자)

CWinApp::WriteProfileString(섹션명,항목명,값); //저장할때 사용 (문자열)

CWinApp::WriteProfileInt(섹션명,항목명,값); //저장할때 사용 (숫자)

//불러올때 사용할함수

void CMainFrame::ActivateFrame(int nCmdShow) //프로그램 실행후 프레임생성될때 실행

//저장할 때 WM_DESTROY 메시지 사용


38. 컨트롤바 표시하기

CMainFrame *pMain=(CMainFrame *)GetParent(); //MainFrame 주소가져오기

//툴바를 bTool2 에따라 보이고 감춘다

pMain->ShowControlBar(&pMain->m_wndToolBar,bTool1,FALSE);


39. Window 창크기,위치정보 저장하기

MainFrame 의 WM_DESTROY 에

WINDOWPLACEMENT w;

this->GetWindowPlacement(&w); //윈도우의 정보를 저장한다.

CString strRect;

strRect.Format("%04d,%04d,%04d,%04d", //04d 는 4자리 확보하고 남은건 0으로 채워라

w.rcNormalPosition.left,w.rcNormalPosition.top,

w.rcNormalPosition.right,w.rcNormalPosition.bottom); //윈도우의 위치,크기 확보..

 

BOOL bMax,bMin; //윈도우의 상태를 저장하기위한 변수

//w.falg 는 이전상태의 정보를 가지고 잇다!!

if(w.showCmd==SW_SHOWMINIMIZED) //최소화 상태

{

bMin=TRUE;

if(w.flags==0) //falg 값이 0 이면 이전 상태가 보통상태이다!!

bMax=FALSE;

else //이전상태가 최대화 상태

bMax=TRUE;

}

else

{

if(w.showCmd==SW_SHOWMAXIMIZED) //최대화상태

{

bMax=TRUE;

bMin=FALSE;

}

else //보통 상태

{

bMax=FALSE;

bMin=FALSE;

}

}

AfxGetApp()->WriteProfileString("WinStatus","Rect",strRect);

AfxGetApp()->WriteProfileInt("WinStatus","Max",bMax);

AfxGetApp()->WriteProfileInt("WinStatus","Min",bMin);

 


//읽어올차례..

ActivateFrame 함수로 가서

WINDOWPLACEMENT w; //윈도우의 상태를 저장하는 구조체..

BOOL bMax,bMin; //최대,최소상태를 저장할 변수

CString strRect; //창크기를 받아올 변수

strRect=AfxGetApp()->GetProfileString("WinStatus","Rect","0000,0000,0500,0700");

bMin=AfxGetApp()->GetProfileInt("WinStatus","Min",FALSE);

bMax=AfxGetApp()->GetProfileInt("WinStatus","Max",FALSE);

int a=atoi(strRect.Left(4)); //문자열을 int 로 바꿔준다.

int b=atoi(strRect.Mid(5,4)); //atoi 아스키 값을 int형으로 바꿔준다..

int c=atoi(strRect.Mid(10,4));

int d=atoi(strRect.Mid(15,4));

w.rcNormalPosition=CRect(a,b,c,d);

if(bMin)

{

w.showCmd=SW_SHOWMINIMIZED;

if(bMax)

{

w.flags=WPF_RESTORETOMAXIMIZED ;

}

else

{

w.flags=0;

}

}

else

{

if(bMax)

{

w.showCmd=SW_SHOWMAXIMIZED;

}

else

{

w.showCmd=SW_SHOWNORMAL;

}

}

this->SetWindowPlacement(&w); //설정된 값으로 윈도우를 그리게 한다..

 

//CFrameWnd::ActivateFrame(nCmdShow); //이건 반드시 주석처리한다..


40. progress Bar 쓰기

m_progress.SetRange(m_first,m_last); //Progress 범위설정하기

m_progress.SetStep(m_step); //Progress Step설정하기

//m_progress.StepIt(); //스텝만큼 움직이기

//또는 다음을 사용한다

for(int a=m_first;a<=m_last;a+=m_step) //a가 처음부터 끝까지

{

m_progress.SetPos(a); // 위치를 a에 맞춘다

Sleep(50); //천천히 움직이게한다

}


41. 파일대화상자 FileDialog 사용하기

void CConDlg1::OnFileopen() //파일열기 버튼

{

CFileDialog *fdlg; //파일대화상자 객체 생성 // 포인터로 만든다..

static char BASED_CODE szFilter[] = "Animate Video Files (*.avi)|*.avi|All Files

(*.*)|*.*||";

//필터를 만들어 준다..이건 할줄 모름..

fdlg =new CFileDialog(TRUE, ".avi", NULL, OFN_HIDEREADONLY |

OFN_OVERWRITEPROMPT,szFilter);

//대화상자 만들기..이렇게 해야댄다..

if(fdlg->DoModal()==IDOK) //이제..대화상자를 띠우고..

{ //OK 누르면 실행될 부분..

m_filename=fdlg->GetPathName(); //대화상자에서 경로를 받아서 저장.

UpdateData(FALSE);

}

}

//파일 다이얼로그 만들기

CFileDialog fdlg(TRUE,"avi",".avi",OFN_OEVRWRITEPROMPT,"Vidoe Files(*.avi)

|*.avi|All Files(*.*)|*.*||");

 

42. Animate Control 사용하기

m_animate.Open(m_filename); //파일을 연다

m_animate.Play(0,-1,1); //(처음프레임,마지막프레임,반복횟수)

m_animate.Stop(); //정지시키기

m_ani.SetAutoStart(TRUE); //자동으로 시작한다

43. Control 의 Style 바꿔주기

Control.ModyfyStyle(제거할스타일,추가할스타일); //스타일은 MSDN내용 참조


44. 시스템 날자바꾸기 버튼

SetSystemTime(),GetSystemTime() //GMT 표준시를 가져온다.

GetLocalTime(),SetLocalTime() //현재 지역시간을 가져온다.


SYSTEMTIME st;

GetLocalTime(&st); //현재 시간, 날자를 넣는다.

st.wYear=m_date2.GetYear();

st.wMonth=m_date2.GetMonth();

st.wDay=m_date2.GetDay();

SetSystemTime(&st);


45. 시스템 시간 바꾸기 버튼

UpdateData(TRUE);

SYSTEMTIME st;

GetLocalTime(&st);

st.wHour=m_time.GetHour();

st.wMinute=m_time.GetMinute();

st.wSecond=m_time.GetSecond();

SetLocalTime(&st);


46.시스템의 드라이브 문자 얻기

char temp[50];

GetLogicalDriveStrings(sizeof(temp),temp);

CString str,str1;

int n=0;

while(*(temp+n)!=NULL)

{

str=temp+n;

str1+= " "+str.Left(2);

n+=4;

}


47. 현재 작업경로 얻기

char temp[MAX_PATH]; //MAX_PATH 는 경로길이의 최대를 define 해놓은것.

GetCurrentDirectory(sizeof(temp),temp); // 현작업하는 경로(경로 길이,문자형);


48. Tree Control 사용하기

HTREEITEM hmov,hmus; //핸들을받을 변수 이게 잇어야 하위 디렉토리 생성가능

hmov=m_tree.InsertItem("영화",TVI_ROOT,TVI_LAST); //,TVI_ROOT,TVI_LAST는 default

hm1=m_tree.InsertItem("외화",hmov); //hmov 아래 “외화”트리 생성

CImageList m_image; //그림을 사용하기 위한 클래스다!! 알아두자..

m_tree.SetImageList(&m_image,TVSIL_NORMAL); //Tree View Style Image List => TVSIL

hmov=m_tree.InsertItem("영화",0,1,TVI_ROOT,TVI_LAST);//TVI_ROOT,TVI_LAST는 default

hmus=m_tree.InsertItem("가요",1,2); //("문자열",처음그림번호,선택시그림)

hm1=m_tree.InsertItem("외화",2,3,hmov); //그림 번호는 default 로 0이 들어간다..


49. List Control 사용하기

m_list.ModifyStyle(LVS_TYPEMASK, LVS_ICON); //리스트를 큰아이콘형태로 보인다

m_list.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);//리스트를 작은아이콘형태

m_list.ModifyStyle(LVS_TYPEMASK, LVS_LIST); //리스트를 리스트형태로 보인다

m_list.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); //리스트를 자세히형태로 보인다

 

CImageList m_treeimage; //이미지리스트

CImageList m_small, m_large;

m_large.Create(IDB_LARGE,32,0,RGB(255,255,255)); //이거는 클래스에서 추가해준거다

m_small.Create(IDB_SMALL,16,0,RGB(255,255,255));// (bmp ID값,

m_list.SetImageList(&m_large,LVSIL_NORMAL);

m_list.SetImageList(&m_small,LVSIL_SMALL);

CString name[]={"홍길동","진달래","한국남","개나리"};

CString tel[]={"400-3759","304-7714","505-9058","700-9898"};

CString born[]={"1980-1-1","1981-12-20","1980-05-15","1981-08-31"};

CString sex[]={"남자","여자","남자","여자"};

 

m_list.InsertColumn(0,"이름",LVCFMT_LEFT,70);

m_list.InsertColumn(1,"전화번호",LVCFMT_LEFT,80);

m_list.InsertColumn(2,"생일",LVCFMT_LEFT,90);

m_list.InsertColumn(3,"성별",LVCFMT_LEFT,50);

LVITEM it; //리스트 구조체

char temp[100];

for(int a=0;a<4;a++)

{

int n=(sex[a]=="남자")?0:1;

m_list.InsertItem(a,name[a],n); //insert item 은 행을 만들고..

it.mask=LVIF_TEXT|LVIF_IMAGE; //마스크 설정

it.iItem=a;

it.iSubItem=1; //열 설정

strcpy(temp,tel[a]); //이거 모하는거냐..

it.pszText=temp;

m_list.SetItem(&it); // setitem 열에 정보를 넣는다.


it.iSubItem=2; //열 설정

strcpy(temp,born[a]); //이거 모하는거냐..

it.pszText=temp;

m_list.SetItem(&it); // setitem 열에 정보를 넣는다.


it.iSubItem=3; //열 설정

strcpy(temp,sex[a]); //이거 모하는거냐..

it.pszText=temp;

m_list.SetItem(&it); // setitem 열에 정보를 넣는다.

 

50. Bitmap Button 사용하기

CBitmapButton 을 사용한다! CButton 에서 상속 받는클래스임..

m_button1.Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,

CRect(310,20,370,50), this,IDC_MYBUTTON); //버튼만들기

m_button1.LoadBitmapsIDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE);//버튼의 그림설정

m_button1.SizeToContent(); //버튼을 그림 크기로 맞춰 준다!!


//그냥 버튼을 비트맵버튼으로 바꾸기 -> 버튼을 만든다 속성에서 OWNERDRA 속성에 체크!!

m_button2.LoadBitmaps(IDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE); //버튼 그림설정

m_button2.SizeToContent(); //버튼을 그림 크기로 맞춰 준다!!


51. 중복없는 난수발생하기

int su; //발생된 난수저장

int a,b;

BOOL bDasi; //숫자가중복될경우 다시하기위한 변수

for(a=0;a<9;a++) //난수 9개 발생

{

bDasi=TRUE;

while(bDasi)

{

bDasi=FALSE;

su=rand()%10; //난수발생

for(b=0;b

{

if(temp[b]==su) //중복이면

{

bDasi=TRUE; //중복이 잇으면 다시while 문을 실행한다

break;

}//if

}//for

}//while

temp[a]=su; //중복이 아니면 대입한다

 

52. 메뉴 범위로 사용하기

ON_COMMAND_RANGE(ID_LEVEL3,ID_LEVEL9,OnLevel); //범위메세지 발생

//메뉴 ID의 값이 연속된 숫자일 경우 범위로 지정해서 사용할수잇다


53. 한,영 전환함수

void CCustView::SetHangul(BOOL bCheck) //T:한글 F:영문 이건 외우자..

{

//뷰클래스의 윈도우 핸들포인터를 얻는다.

HIMC hm=ImmGetContext(this->GetSafeHwnd());

if(bCheck)

{

::ImmSetConversionStatus(hm,1,0); //1은 한글 0은 영문

}

else

{

::ImmSetConversionStatus(hm,0,0); //영문으로 바꿔준다

}

::ImmReleaseContext(this->GetSafeHwnd(),hm); //장치를 풀어준다

}

 

#include "imm.h" //헤더 반드시 추가하고

imm32.lib (라이브러리 파일)를 반드시 링크해주어야 한다!

**** 라이브러리 추가하기

프로젝트메뉴 -> 셋팅 -> 링크탭


54. DLL함수정의하기

임포트함수 : extern "C" __declspec(dllimport) 리터형 함수명(매개변수,...) ;

- 메인프로그램에서 DLL에 있는 함수를 호출할때 사용한다.


엑스포트함수 : extern "C" __declspec(dllexport) 리터형 함수명(매개변수,...)

{

내용;

 

'컴퓨터 > c자료' 카테고리의 다른 글

영상정보처리 레나 확대 1.6배  (0) 2013.12.29
c관련 용어  (0) 2013.12.29
LPCTSTR, LPTSTR 의 차이점  (0) 2013.12.29
MFC 파일 불러오기 , 파일 저장하기 다이얼로그 (출처 신기루님)  (1) 2013.12.29
lcd 출력  (0) 2013.12.29
by 리베리온 2013. 12. 29. 23:46

L : long..
P : pointer
C : constant
T : TCHAR
STR : String...

이런 의미입니다.

- Long이라는 것은 예전 16비트때 썼던 short 포인터 때문에 붙이는 것인데..
win32 환경에서는 별다른 의미가 없습니다.


- Constant라는 것은 해당 포인터를 수정할 수 없다는 것이겠고요.


- TCHAR는 generic char type으로 컴파일 타임에 유니코드나 mbcs, ansi 코드로 변경됩니다.
즉, TCHAR는 _UNICODE 디파인된 상태에서는 WCHAR로, 그렇지 않은 경우 char로 컴파일 됩니다.


즉, LPCTSTR은 변경불가한 generic한 문자열이라는 의미이지요.

 

저 같은 경우는 습관적으로 LPCTSTR과 LPTSTR을 사용합니다.

 

by 리베리온 2013. 12. 29. 23:45
출처 MIRAGE LAND | 신기루
원문 http://blog.naver.com/mirageld/150011661299

* 파일열기

CFileDialog dlg( true, "*.bmp", NULL, OFN_FILEMUSTEXIST, "BMP Files(*.bmp)|*.bmp|", NULL );

if( dlg.DoModal() == IDOK )
{

m_strPath = dlg.GetPathName();

...

}

 

*파일저장

CFileDialog dlg( false, "*.bmp", NULL, OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT, "BMP Files(*.bmp)|*.bmp|", NULL );

if( dlg.DoModal() == IDOK )
{

m_strPath = dlg.GetPathName();

...

}

 

'컴퓨터 > c자료' 카테고리의 다른 글

MFC Tip (출처 탑건매직님)  (0) 2013.12.29
LPCTSTR, LPTSTR 의 차이점  (0) 2013.12.29
lcd 출력  (0) 2013.12.29
CFontDialog (폰트 설정) (출처 아르님)  (0) 2013.12.29
c언어 로또 소스 (출처 컴사랑)  (0) 2013.12.29
by 리베리온 2013. 12. 29. 23:45

 

ex8_1.h

 

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
/* LCD 활성화 Enable(E) */
#define ENABLE (PORTA |= 0x04)
#define DISABLE (PORTA &= 0xFB)
/* LCD Instruction */
#define FUNCSET 0x28
#define ENTRYSET 0x06
#define LCDCLEAR 0x01
#define RETURNHOME 0x02
#define DISPLAYON 0x0C
#define CURSORON 0x0A
#define BLINKON 0x09
/* Timer */
#define CPU_CLOCK 16000000
#define TICKS_PER_SEC 1000

----------------------------------------

ex8_1.c

 

#include "ex8_1.h"
/* Timer 루틴 */
volatile unsigned int tic_time;
SIGNAL(SIG_OVERFLOW0)
{
tic_time++;
TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / 64);
}
void delay_ms(unsigned int msec)
{
tic_time = 0;
while(msec > tic_time);
}
void init_timer(void)
{
TCCR0 = (1 << CS02) | (0 << CS01) | (0 << CS00);
TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / 64);
TIMSK = (0 << OCIE0) | (1 << TOIE0);
sei();
}
/* 사용할 포트 초기화 */
void init_porta(void)
{
DDRA = 0xFF; // PORTA 출력
PORTA = 0xFF; // 초기 값
}

/* instruction function */
void instruction(unsigned char b) // 명령어 쓰기 함수
{
PORTA = b&0xF0; // 상위 4비트 출력
ENABLE;
DISABLE;
PORTA = (b<<4)&0xF0; // 하위 4비트 출력
ENABLE;
DISABLE;
delay_ms(2);
}
/* LCD에 한 문자 출력 */
void char_out(unsigned char b) // LCD에 한 문자 출력 함수
{
PORTA = (b&0xF0)|0x01; // 상위 4비트 출력
ENABLE;
DISABLE;
PORTA = ((b<<4)&0xF0)|0x01; // 하위 4비트 출력
ENABLE;
DISABLE;
delay_ms(2);
}
/* LCD에 문자열 출력 */
void string_out(unsigned char b, unsigned char *str)
{
unsigned int i = 0;
instruction(b); // LCD 위치 지정
do{
char_out(str[i]);
}while(str[++i]!='\0');
}
/* lcd 초기화 함수 */
void init_lcd(void)
{
init_porta(); // LCD를 연결한 포트 초기화
delay_ms(50);
instruction(FUNCSET); // LCD FUNCTION SET(16x2 LINE, 4 BIT, 5x8 DOT)
delay_ms(2);
instruction(FUNCSET); // LCD FUNCTION SET(16x2 LINE, 4 BIT, 5x8 DOT)
delay_ms(2);
instruction(DISPLAYON); // LCD DISPLAY ON, CURSOR OFF, BLINK OFF
instruction(LCDCLEAR); // LCD CLEAR
delay_ms(2);
instruction(ENTRYSET); // LCD ENTRY MODE SET
instruction(RETURNHOME); // RETURN HOME
instruction(LCDCLEAR); // LCD CLEAR
}
/* 메인 함수 */
int main(void)
{
unsigned char shift=0;
init_timer();
init_lcd();
instruction(LCDCLEAR); // LCD를 지운다
string_out(0x80, "LOTTO"); // LCD 첫번째 라인
string_out(0xC0, "ATmega128!"); // LCD 두번째 라인
delay_ms(2);
return 0; //
} //

/*while(1)
{
for(shift = 0; shift < 8; shift++) {
// S/C = 1, R/L = 1, 화면 오른쪽으로 시프트
instruction(0x1C);
delay_ms(500);
}
for(shift = 0; shift < 16; shift++) {
// S/C = 1, R/L = 0, 화면 왼쪽으로 시프트
instruction(0x18);
delay_ms(500);
}
for(shift = 0; shift < 8; shift++) {
// S/C = 1, R/L = 1, 화면 오른쪽으로 시프트
instruction(0x1C);
delay_ms(500);
}
}
return 0;
}
*/

 

by 리베리온 2013. 12. 29. 23:44
출처 angelic zoon | 아르
원문 http://blog.naver.com/pigjh1/20036441113

CFontDialog

윈도우에서 제공하는 공통 폰트 다이얼로그 박스

 

Example

CTextTestView::CTextTestView()

{
m_bTransparent = FALSE; //배경의 투명 여부 판단
m_colorText = RGB(0,0,0); //폰트 컬러
m_colorBK = RGB(255,255,255); //폰트배경 컬러

m_logFont.lfHeight = 0; //m_logFont 초기화
m_logFont.lfWidth = 0;
m_logFont.lfEscapement = 0;
m_logFont.lfOrientation = 0;
m_logFont.lfWeight = FW_NORMAL;
m_logFont.lfItalic = FALSE;
m_logFont.lfUnderline = FALSE;
m_logFont.lfStrikeOut = FALSE;
m_logFont.lfCharSet = DEFAULT_CHARSET;
m_logFont.lfOutPrecision = OUT_CHARACTER_PRECIS;
m_logFont.lfClipPrecision = CLIP_CHARACTER_PRECIS;
m_logFont.lfQuality = DEFAULT_QUALITY;
m_logFont.lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE;
strcpy(m_logFont.lfFaceName,"Arial");
}

 

void CTextTestView::OnDraw(CDC* pDC) //Draw함수에 의한 폰트 처리
{
CTextTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect); //창크기 구하기

//LOGFONT로부터 글꼴을 생성
CFont newFont, *pOldFont;
newFont.CreateFontIndirect(&m_logFont);
//생성된 글꼴을 DC에 선택
pOldFont = (CFont *)pDC->SelectObject(&newFont);
pDC->SetTextColor(m_colorText);
pDC->SetBkColor(m_colorBK);

//배경 모드를 설정
if(m_bTransparent) pDC->SetBkMode(TRANSPARENT);
else pDC->SetBkMode(OPAQUE);

//텍스트를 그림
pDC->DrawText("이것은 테스트입니다. This is a test.",
&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
}

 

//메뉴버튼 이벤트 함수들
void CTextTestView::OnTextColor() //텍스트 컬러 바꿈
{
CColorDialog dlg;
if(dlg.DoModal()==IDOK)
{
m_colorText=dlg.GetColor();
Invalidate(); //화면 갱신
}
}

void CTextTestView::OnTextFont() //텍스트 폰트 바꿈
{
CFontDialog dlg(&m_logFont); //m_logFont에 설정값으로 초기화
if(dlg.DoModal()==IDOK)
{
dlg.GetCurrentFont(&m_logFont);
Invalidate();

}

}

void CTextTestView::OnTextBKcolor() //텍스트 배경색 바꿈
{
CColorDialog dlg;
if(dlg.DoModal()==IDOK)
{
m_colorBK=dlg.GetColor();
Invalidate();
}
}


출처 : Tong - 통동이님의 C/C++통

 

 

by 리베리온 2013. 12. 29. 23:43
출처 컴퓨터 프로그램 정보 | 컴사랑
원문 http://blog.naver.com/kwak0423/30003529397

#include < stdio.h >

#include < stdlib.h >

#include < time.h >

 

void main()

{

int i, j, k, n, equal, lotto[6];

printf("몇 게임?");

scanf("%d", &n);

srand(time(NULL));

 

for (j=0; j < n; j++)

{

i = 1;

lotto[0] = rand()%45 + 1;

while (i < 6)

{
equal = 0;

lotto[i] = rand()%45 + 1;


for (k=0; k < i; ++k)

{

if (lotto[k] == lotto[i])
equal = 1;

}

++i;

if (equal == 1)
--i;


}

for (k=0; k< 6; ++k)

printf("%d ", lotto[k]);

printf("\n");

}

scanf("%d", &i);

}

선언 부분에 k가 없었던 것과 버그가 있던 부분을 수정하였습니다

 

 

 

출처:네이버지식

 

 

 

 

 

 

 

 

 

 

 

 

by 리베리온 2013. 12. 29. 23:42
 

#include "ex8_1.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Timer 루틴 */
volatile unsigned int tic_time;
SIGNAL(SIG_OVERFLOW0)
{
tic_time++;
TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / 64);
}
void delay_ms(unsigned int msec)
{
tic_time = 0;
while(msec > tic_time);
}
void init_timer(void)
{
TCCR0 = (1 << CS02) | (0 << CS01) | (0 << CS00);
TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / 64);
TIMSK = (0 << OCIE0) | (1 << TOIE0);
sei();
}
/* 사용할 포트 초기화 */
void init_porta(void)
{
DDRA = 0xFF; // PORTA 출력
PORTA = 0xFF; // 초기 값
}

/* instruction function */
void instruction(unsigned char b) // 명령어 쓰기 함수
{
PORTA = b&0xF0; // 상위 4비트 출력
ENABLE;
DISABLE;
PORTA = (b<<4)&0xF0; // 하위 4비트 출력
ENABLE;
DISABLE;
delay_ms(2);
}

/* LCD에 한 문자 출력 */
void char_out(unsigned char b) // LCD에 한 문자 출력 함수
{
PORTA = (b&0xF0)|0x01; // 상위 4비트 출력
ENABLE;
DISABLE;
PORTA = ((b<<4)&0xF0)|0x01; // 하위 4비트 출력
ENABLE;
DISABLE;
delay_ms(2);
}
//////////////////////////////////////////////////////////////////////////////////////
/* LCD에 문자열 출력 */
void string_out(unsigned char b, unsigned char *str) // 한쪽 int
{
unsigned int i = 0;
instruction(b); // LCD 위치 지정
do{
char_out(str[i]);
}while(str[++i]!='\0'); //\0
}
////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////
/* lcd 초기화 함수 */
void init_lcd(void)
{
init_porta(); // LCD를 연결한 포트 초기화
delay_ms(50);
instruction(FUNCSET); // LCD FUNCTION SET(16x2 LINE, 4 BIT, 5x8 DOT)
delay_ms(2);
instruction(FUNCSET); // LCD FUNCTION SET(16x2 LINE, 4 BIT, 5x8 DOT)
delay_ms(2);
instruction(DISPLAYON); // LCD DISPLAY ON, CURSOR OFF, BLINK OFF
instruction(LCDCLEAR); // LCD CLEAR
delay_ms(2);
instruction(ENTRYSET); // LCD ENTRY MODE SET
instruction(RETURNHOME); // RETURN HOME
instruction(LCDCLEAR); // LCD CLEAR
}

/* 메인 함수 */

int main(void)
{
//char *str;
int aaa = 0;
aaa = rand() % 45 + 1;
//itoa(aaa, str);

//unsigned char shift=0;
init_timer();
init_lcd();
instruction(LCDCLEAR); // LCD를 지운다
string_out(0x80, "LOTTO"); // LCD 첫번째 라인
string_out(0xC0, "1 2 3 4 5 6"); // LCD 두번째 라인
delay_ms(2);
return 0; //
} //

/*while(1)
{
for(shift = 0; shift < 8; shift++) {
// S/C = 1, R/L = 1, 화면 오른쪽으로 시프트
instruction(0x1C);
delay_ms(500);
}
for(shift = 0; shift < 16; shift++) {
// S/C = 1, R/L = 0, 화면 왼쪽으로 시프트
instruction(0x18);
delay_ms(500);
}
for(shift = 0; shift < 8; shift++) {
// S/C = 1, R/L = 1, 화면 오른쪽으로 시프트
instruction(0x1C);
delay_ms(500);
}
}
return 0;
}
*/
//////////////////////////////////////

//헤더파일

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

/* LCD 활성화 Enable(E) */
#define ENABLE (PORTA |= 0x04)
#define DISABLE (PORTA &= 0xFB)
/* LCD Instruction */
#define FUNCSET 0x28
#define ENTRYSET 0x06
#define LCDCLEAR 0x01
#define RETURNHOME 0x02
#define DISPLAYON 0x0C
#define CURSORON 0x0A
#define BLINKON 0x09
/* Timer */
#define CPU_CLOCK 16000000
#define TICKS_PER_SEC 1000

 

 

by 리베리온 2013. 12. 29. 23:41

C로 테트리스 구현

 

문제점 게임 오버될때 위에 ****** 중 3~4칸 이상이 채워져야 게임 오버표시

 

 

% 폴더 암호 걸어놈

% 열람금지

 

 

테트리스-hak228.zip

 

by 리베리온 2013. 12. 29. 23:41
| 1 2 3 |