'여러이야기'에 해당되는 글 125건

  1. 2015.05.03 뇌를 활성화시키는 4가지 방법 by TwoTen
  2. 2015.03.03 [우분투] 분실한 mysql root 비번 재 설정 by TwoTen
  3. 2015.03.03 검지, 넷째 손가락, 남성 호르몬 by TwoTen
  4. 2015.03.03 [우분투] APM 설치 by TwoTen
  5. 2015.02.27 스마트 펜 by TwoTen
  6. 2015.02.25 스마트 칠판(smart marker) by TwoTen
  7. 2015.02.24 [C/C++] GDI 를 이용한 그래픽 by TwoTen 3
  8. 2015.02.23 [우분투] 10.04 APM 설치 및 셋팅 by TwoTen
  9. 2015.02.23 [우분투] Zend Guard 설치 by TwoTen
  10. 2015.02.23 [우분투] Zend Optimizer 설치 by TwoTen
http://m.media.daum.net/m/life/health/list/newsview?newsId=20150430114506073


뇌는 가소성이 있는 장기다. 훈련시키기 나름으로 역할과 기능 패턴이 변할 수 있다는 의미다. 아이들처럼 하루가 다르게 급속도로 성장하진 않더라도 지속적으로 자극을 가하면 조금씩 변화가 가능하다. 그렇다면 뇌는 어떤 방법으로 활성화할 수 있을까. 신경과학자들의 연구결과들을 중심으로 몇 가지 방법을 소개한다.

◆이상한 나라의 앨리스 읽기=뇌는 말이 안 되는 황당한 상황에 닥쳐 불안감이 들 때 보다 활성화되는 경향이 있다. 미국 캘리포니아대학교 산타바바라 캠퍼스 심리학과 연구팀이 학술지 '심리과학(Psychological Science)저널'에 발표한 논문에 따르면 터무니없는 기이한 내용의 글을 읽는 사람들은 데이터를 분석하거나 새로운 패턴을 학습하는 능력이 2배 이상 향상된다.

당황스럽고 혼란스러운 비일상적인 상황에 노출되면 뇌가 활성화된다는 것이다. 가령 아방가르드 퍼포먼스를 관람한다거나 초현실주의 작품을 접하는 식이다. 낯선 나라로 여행을 가 문화충격을 경험한 사람들은 문제해결능력이 20% 정도 상승한다는 연구결과도 있다.

◆적당한 커피숍 찾기=일리노이대학교의 한 연구에 따르면 쥐 죽은 듯 고요한 곳보다 약간의 소음이 들리는 곳에서 생각을 할 때 좀 더 창의적인 해결책이 많이 나온다. 배경소음이 마음을 산란케 만들면 좀 더 추상적인 사고를 하게 되고 창의성을 강화하게 된다는 것이다.

즉 아이디어가 떠오르지 않을 땐 조용한 도서관을 나와 적당한 소음이 있는 공간을 찾는 방법이 있다. 지나치게 시끄럽다는 느낌보다는 활기가 있다는 정도의 느낌이 드는 공간이 좋다. 소리 세기를 기준으로 보면 70데시벨 정도의 소음이 들리는 공간을 의미하는데 보통 커피숍이 이 정도 소음이 난다. 또 커피에 든 카페인 역시 기억을 상기시키는데 도움이 된다.

◆유산소 운동하기=신체건강을 지키기 위해서는 근력운동과 유산소운동을 병행해야 한다. 하지만 뇌의 활성화 영역으로 한정한다면 유산소운동이 깊은 연관성이 있다. 일리노이대학교 연구팀이 유산소운동과 다른 운동들을 비교해본 결과, 유산소운동이 기억력 및 집중력과 연관이 있는 뇌 영역의 부피를 증가시키는 효과가 나타났다.

유산소운동이 뇌유래신경영양인자(BDNF)를 강화하는 효과적인 운동이라는 것이다. BDNF는 뉴런의 성장을 돕는 단백질을 의미한다. 일주일에 3~4시간 정도 조깅, 산책, 자전거타기 등의 유산소운동을 하면 뇌와 신체 건강을 모두 향상시킬 수 있다. 연구팀에 따르면 좀 더 짧은 시간 고강도운동을 하는 것 역시 BDNF를 증가시키는데 도움이 된다.

◆혼자 중얼거리기=혼자 중얼거리는 모습을 상상하면 보기 좋지 않다는 느낌이 들지만 다른 사람에게 방해가 되지 않는 수준이라면 뇌를 활성화하는 방법으로 활용할 수 있다. 대화를 나누듯 말을 하는 것이 뇌를 강화하는 한 방법이라는 것이 그리스 테살리아대학교 연구팀의 설명이다. 이러한 방법이 집중력을 향상시키고 스포츠를 할 때 수행능력을 높인다. 새로운 것을 학습하거나 수행능력을 강화할 때 혼자 중얼거리면 보다 효과적인 결과를 얻을 수 있다는 것이다.
Posted by TwoTen
l

출처 : http://www.litcoder.com/?p=495&ckattempt=1


분실한 mysql root password 재설정하기

Mysql을 처음 설치할 때 database root 계정으로 사용할 password를 설정한다. 하지만 시간이 오래 지나서 그때 설정한 password를 기억할 수 없다면 다음의 방법으로 재설정할 수 있다. (Ubuntu 12.04 기준)

Step 1. 실행중인 mysql service를 중지 시킨다.

# service mysql stop

Step 2. Password를 검사하지 않도록 mysql 환경설정 파일을 수정한다.
: /etc/mysql/my.conf file에 skip-grant-tables를 추가하면 password를 검사하지 않는다.

[mysqld]
#
# * Basic Settings
#
user         = mysql
pid-file     = /var/run/mysqld/mysqld.pid
socket       = /var/run/mysqld/mysqld.sock
port         = 3306
basedir      = /usr
datadir      = /var/lib/mysql
tmpdir       = /tmp
lc-messages-dir = /usr/share/mysql

skip-external-locking

skip-grant-tables

Step 3. 새로운 설정 값으로 mysql service를 실행한다.

# sudo service mysql start

Step 4. root 계정으로 mysql database를 연다.

$ mysql -uroot mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.29-0ubuntu0.12.04.1 (Ubuntu)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Step 5. root password를 재설정한다.

mysql> UPDATE user SET password=PASSWORD('ROOT_비밀번호') WHERE user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0
Step 6. my.conf를 복원하고 mysql service를 재실행 시킨다.

=========================================

mysql root 암호 분실 되어때 복구 하는 방법.

 

1. 먼저 mysql데모를 멈춘다.

# /etc/init.d/mysqld stop  또는 아래 방법

# service mysqld stop


2. mysql 강제 접속 하는 방법.

# /usr/bin/mysqld_safe --skip-grant &

# mysql -u root -p

# 엔터 하면 접속 됨.

mysql > use mysql

mysql > update user set password=password('패스워드') where user='root';

mysql > flush privileges;



'여러이야기 > IT' 카테고리의 다른 글

데비안 설치  (0) 2015.05.31
Lubuntu 설치  (0) 2015.05.29
[우분투] APM 설치  (0) 2015.03.03
스마트 펜  (0) 2015.02.27
스마트 칠판(smart marker)  (0) 2015.02.25
Posted by TwoTen
l

[사이언스] 넷째 손가락 길수록.. 매력적 연인, 자상한 남편


[손가락을 보면 남자가 보인다] 태아때 性호르몬 조사해보니 검지는 여성호르몬 영향 받고 약지는 남성호르몬 영향 받아 약지 길수록 외모·행동 매력적… 여성에게 30% 더 부드러워져...



↑ 이미지를 클릭하시면 그래픽 뉴스로 크게 볼 수 있습니다. / 조선닷컴

' 열 길 물속은 알아도 한 길 사람 속은 모른다'고 했다. 지금은 이 남자가 하늘의 별이라도 따줄 것처럼 말하지만, 결혼하고 나면 얼굴을 바꾸지 않을까. 그렇다면 결혼반지를 끼워주기 전에 손가락 길이를 유심히 볼 필요가 있다. 최근 오른손 약지(넷째 손가락)와 검지(둘째 손가락)의 상대적 비율로 알아낼 수 있는 남자의 비밀이 속속 드러나고 있기 때문. 약지가 길면 매력적인 연인이자 자상한 남편이 될 가능성이 크다. 반면 남성의 암인 전립선암에 걸릴 위험은 커진다. 과연 내 남자의 손가락은 어떨까.

◇약지 길면 여성에게 부드러운 행동

캐나다 맥길대 연구진은 국제 학술지 '성격과 개인 차이' 3월호에 "검지가 짧고 약지가 긴 남성은 여성에게 부드러운 행동을 하는 경향이 있다"는 연구 결과를 발표했다.

연 구진은 남성 78명과 여성 77명을 대상으로 최근 3주간 만났던 이성(異性)의 태도를 적도록 하고 남성의 손가락 길이 비율을 조사했다. 약지를 1로 했을 때 검지의 비율이 작은 남성, 즉 상대적으로 약지가 더 긴 남성은 그렇지 않은 남성보다 호감을 주는 행동이 30%쯤 많았던 것으로 나타났다. 퉁명스러운 행동은 30% 적었다. 약지가 긴 남성은 여성에게 더할 나위 없는 상대인 셈이다. 연구진은 "이번 조사 결과는 남성의 약지가 길수록 자녀가 많다는 앞선 연구 결과도 설명해줄 수 있다"고 밝혔다. 반면 검지가 상대적으로 더 긴 남성은 남녀 모두에게 퉁명스럽게 대하는 것으로 나타났다.

손가락 길이가 남성의 행동과 연관되는 것은 태아 시기 성호르몬의 영향으로 설명된다. 영국의 존 매닝 교수는 1990년대부터 이와 같은 주장을 폈다. 매닝 교수에 따르면 약지는 남성호르몬인 테스토스테론, 검지는 여성호르몬 에스트로겐의 영향을 받는다. 덕분에 남성은 일반적으로 약지가 검지보다 길고, 여성은 두 손가락 길이가 거의 비슷하다.

◇손가락 길이로 신체 비밀도 예측

결국 태아일 때 남성호르몬의 영향을 더 많이 받았던 남성은 여성의 호감을 얻기 위한 행동을 본능적으로 안다고 볼 수 있다. 이는 여성에게도 인정을 받는다. 2011년 스위스 제네바대 연구진은 약지가 긴 남성일수록 여성에게 더 남성적이고 매력 있는 얼굴로 인식되는 경향이 있음을 밝혀냈다.

심지어 겉으로 보기 어려운 남성의 비밀도 손가락으로 알 수 있다. 2011년 가천의대 길병원 비뇨기과 김태범 교수는 '아시아 남성과학회지'에 발표한 논문에서 "검지에 비해 약지가 길수록 남성의 생식기 길이도 길다"고 밝혔다.

연 구진은 20세 이상 남성 환자 144명의 동의를 받고 비뇨기 수술을 하기 전 손가락 길이 비율과 생식기의 길이를 쟀다. 약지를 1로 할 때 검지의 길이는 0.88~1.12로 평균 0.97이었다. 이 비율이 작을수록, 즉 약지가 길수록 생식기의 길이도 긴 것으로 드러났다.

물론 약지가 길다고 무조건 좋은 것은 아니다. 김 교수팀은 2009년 '영국 비뇨기과학회지'에 발표한 논문에서 약지가 길면 전립선암에 걸릴 위험도 크다는 연구 결과를 발표했다. 약지를 1로 할 때 검지의 길이가 0.95 이하인 남성은 그 이상인 남성보다 전립선암 특이 항원 수치가 1.7배 높게 나왔다. 전립선암 환자도 3.2배나 많았다. 약지가 길면, 다시 말해 검지가 짧으면 전립선암에 걸릴 확률이 더 높은 것이다.

이듬해 영국 워릭대 연구진도 김 교수팀의 연구를 뒷받침했다. 연구진은 전립선암 환자 1500명과 건강한 남성 3000명을 15년간 추적 조사했다. 그 결과 약지 길이가 검지와 같거나 더 짧은 남성들이, 약지가 긴 남성들보다 전립선암에 걸린 확률이 33% 낮은 것으로 나타났다.


'여러이야기' 카테고리의 다른 글

접촉으로 성별이 바뀌는 생물  (0) 2016.01.11
인간의 가장 편안한 각도 127도  (0) 2016.01.11
나이가 준 선물...(2014. 3. 7)  (0) 2014.03.07
영화 / Man from earth  (0) 2014.02.18
Jean Michael Basquiat  (0) 2014.02.18
Posted by TwoTen
l

출처 : http://blog.fun25.co.kr/ubuntu-14-04-apache-php-mysql-lamp/


아파치 설치

# apt-get update

# apt-get install apache2

 

아파치 시작은

# service apache2 start

 

아파치 종료는

# service apache2 stop

 

아파치 설정을 변경 후 설정을 다시 적용할 때는

# service apache2 reload

 

아파치 디렉토리

/etc/apache2

apache2.conf - 기본 설정 파일

conf-available - 사용가능한 추가 설정 파일들

conf-enabled - 현재 적용된 추가 설정 파일들

envvars - 환경변수 설정

magic - mime 관련

mods-available - 사용가능한 모듈들

mods-enabled - 적용된 모듈들

ports.conf - 포트 설정

sites-available - 사용가능한 사이트 설정들

sites-enabled - 적용된 사이트 설정들

available 이라는 디렉토리들은 보통 사용가능한 설정 파일들을 저장하고 여기서 enabled 라는 디렉토리로 심볼릭 링크를 걸어서 사용하는 경우가 많습니다.


MySQL 설치

# apt-get install mysql-server php5-mysql

설치를 진행하다 보면 root 계정의 암호를 입력하라고 나옵니다. 암호를 입력하고 계속 진행하면 설치가 완료가 됩니다. 여기서 입력한 암호는 꼭 기억을 하고 있어야 설치 후에 mysql 접속이 가능합니다.

lamp2

 

 

# mysql_install_db

# mysql_secure_installation

mysql_secure_installation 을 실행하면 root 암호를 바꿀건지..root 를 리모트에서 접속이 가능하게 할건지 등을 물어봅니다.

 

MySQL 서버 시작

# service mysql start

 

MySQL 서버 종료

# service mysql stop

 

my.cnf

/etc/mysql/my.cnf

 

우분투에서 mysql 서버를 설치하면 기본적으로 외부에서는 접속이 안 되도록 되어 있습니다. 로컬에서만 접속이 가능하도록 되어 있는데요. 외부에서 접속이 가능하도록 할려면 /etc/mysql/my.cnf 파일에서

bind-address 127.0.0.1 

로 되어 있는 부분을

bind-address 0.0.0.0 

으로 변경 후에 mysql 서버를 재시작 하면 됩니다.

 

접속 테스트

# mysql -u root -p

해서 암호를 입력하면 접속이 됩니다. 접속이 안 될 경우는 MySQL 서버가 실행이 되어 있는지 확인해 보시고 root 암호도 정확한지 한번 확인해 보시면 됩니다.


PHP 설치

# apt-get install php5 libapache2-mod-php5 php5-mcrypt

php.ini

/etc/php5/apache2/php.ini 

 

PHP 를 아파치의 모듈로 설치를 했으므로 /etc/apache2/mods-enabled 라는 디렉토리로 가서 ls 명령어로 한번 확인을 해 보면

lamp3

php5.conf 와 php5.load 라는 심볼릭 링크가 만들어져 있고 실제 파일들은 mods-available 에 있는 것을 볼 수 있습니다. 여기서 dir.conf 파일을 vi 등으로 열어서 index.php 가 index 파일에 추가되어 있는지 확인해 보도록 합니다.

<IfModule mod_dir.c>

        DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm

</IfModule>

 

테스트

/var/www/html 아래에 phpinfo.php 파일을 만들어서 php 설치를 확인해 봅니다.

<?php

phpinfo();

?>



'여러이야기 > IT' 카테고리의 다른 글

Lubuntu 설치  (0) 2015.05.29
[우분투] 분실한 mysql root 비번 재 설정  (0) 2015.03.03
스마트 펜  (0) 2015.02.27
스마트 칠판(smart marker)  (0) 2015.02.25
[C/C++] GDI 를 이용한 그래픽  (3) 2015.02.24
Posted by TwoTen
l

스마트 펜

여러이야기/IT 2015. 2. 27. 23:50

어떤 종이에나 사용이 가능


Wacom inkling : http://inkling.wacom.eu/?en/inkling

사용기 : http://story.pxd.co.kr/463

소개 : http://ryueyes11.tistory.com/1042

사용기 : http://blog.naver.com/PostView.nhn?blogId=fourccd&logNo=220103654872

사용기 : http://blog.naver.com/PostView.nhn?blogId=4086088&logNo=120197191941

사용기 : http://blog.naver.com/PostView.nhn?blogId=azuchan&logNo=40205911290

사용기 : http://blog.naver.com/PostView.nhn?blogId=dodogas77&logNo=150177152411

사용기 : http://blog.naver.com/PostView.nhn?blogId=rabeca&logNo=60205470786

http://minkyoungseop.com/705






Lollol : http://www.penandfree.co.kr/en/product_lollol.html    :  84000원

http://blog.naver.com/PostView.nhn?blogId=zzang_a923&logNo=110160184745

http://blog.daum.net/injcj/58

http://blog.naver.com/PostView.nhn?blogId=beendong&logNo=30160285019





Equil : http://www.myequil.com/smartpen2/

http://blog.naver.com/PostView.nhn?blogId=skyrunner9&logNo=220267045370



ElectroFlip : Mobile Digital Class NoteTaker Ballpoint Pen

http://www.rakuten.com/prod/penn-state-mobile-digital-class-notetaker-ballpoint-pen/231102917.html?listingId=217507934&sclid=pla_google_ElectroFlip&adid=29963&gclid=CPSPgsbJh8QCFQguaQodejAAOA


http://www.beboxx.com/coen/usb-mobile-note-taker.html : $89.00


IOGear : http://www.iogear.com/product/GPEN200N/   GPEN200N, GPEN100C



SolidTek DM-L2 DigiMemo L2 8-1/2-by-11-Inch Digital Notepad :

 

MyInk (iOS/Win/Android) - A digital pen for transferring inking on paper into text : 

http://www.penpowerinc.com/product.asp?sn=696



aiptek mynote : http://www.aiptek.de/index.php/en/products/archive/archive-graphic-tablets/mynote-bluetooth



Kanvus


http://global.kworld-global.com/main/index.aspx

https://www.youtube.com/watch?v=q7nZ5VsouzI




Ncode 인쇄되어 있는 전용 종이가 필요



Livescribe

http://awesome.tistory.com/8

http://www.jijipapa.com/191

http://www.jijipapa.com/168      :  neo N1과 live scribe sky wifi 비교

http://kr.aving.net/news/view.php?articleId=702152&mn_name=news

http://ardors.tistory.com/15

http://eagles-eye.tistory.com/194




Neo N2 : http://www.neolab.kr/smartpen/   178000 원 




pen generation : Pen+ : http://blog.naver.com/pengen7

http://second-brain.tistory.com/513


Logitech IO2 Digital Pen :

http://www.amazon.com/Logitech-IO2-Digital-Pen-965154-0403/dp/B000F4CUKY



IRISNotes Executive 2 Digital Pen :

http://www.irislink.com/c2-2353-189/IRISNotes-2---Digital-Pen.aspx?adwp=GGS-IN-US&gclid=CKKK0NDeh8QCFQmpaQodM6kAcg


Note Pad Type


Sony Digital Paper system : http://pro.sony.com/bbsc/ssr/cat-digitalpaper/cat-digitalpapersub : $999.00




Adesso Cyber-pad 8"x11"digital notepad.

https://www.youtube.com/watch?v=qlUzGETuuaA


'여러이야기 > IT' 카테고리의 다른 글

[우분투] 분실한 mysql root 비번 재 설정  (0) 2015.03.03
[우분투] APM 설치  (0) 2015.03.03
스마트 칠판(smart marker)  (0) 2015.02.25
[C/C++] GDI 를 이용한 그래픽  (3) 2015.02.24
[우분투] 10.04 APM 설치 및 셋팅  (0) 2015.02.23
Posted by TwoTen
l
스마트 펜이라는 것을 보면서...
이것을 응용해서 스마트 칠판을 만들면 좋겠다는 생각을 한적이 있다...

생각이 현실을 못 쫓아가는 듯한...
이 짧은 생각...
어찌할거나...ㅠ.ㅠ

Watch "Equil Smart Marker + OMNI SMART TUTOR를 활용한 스마트한 교…" on YouTube

Equil Smart Marker + OMNI SMART TUTOR를 활용한 스마트한 교…: http://youtu.be/uUU2gLCKsrg

'여러이야기 > IT' 카테고리의 다른 글

[우분투] APM 설치  (0) 2015.03.03
스마트 펜  (0) 2015.02.27
[C/C++] GDI 를 이용한 그래픽  (3) 2015.02.24
[우분투] 10.04 APM 설치 및 셋팅  (0) 2015.02.23
[우분투] Zend Guard 설치  (0) 2015.02.23
Posted by TwoTen
l

출처 : http://blog.naver.com/PostView.nhn?blogId=kjg5345&logNo=150106170859


C &  C++  GDI 를 이용한 그래픽 .대화상자와 컨트롤 . 객체지향 프로그래밍의 이해(Object Oriented Programming) Dialog . control    


- 객체지향 프로그래밍의 이해(Object Oriented Programming)

 

프로그램을 작성할 때 객체를 기본으로 프로그램 작성

클래스(Class)를 이용하여 객체 표현

C와 C++ 프로그래밍 구조 비교

C

C++

구조적 프로그래밍

객체지향 프로그래밍

프로그램을 기능 단위로 세분

프로그램을 객체단위로 세분

함수로 구성

클래스로 구성

중형 프로그램

대형 프로그램


-객체지향 프로그래밍의 예

중국집에서의 작업

C(별도의 메시지가 필요 없음)

C++(메시지로 각 역할의 시작과 종료)

인사

자리안내

주문접수

요리

요리서빙

계산

인사함수()

자리함수()

주문함수()

요리함수()

서빙함수()

계산함수()

종업원

인사

자리안내

주문접수

요리서빙

요리사

요리

카운터

계산


- Class의 생성

ClassView에서 생성:

ClassView->오른쪽마우스->New Class선택->Class 이름 및 base Class선택

변수추가: Class이름 오른쪽마우스->Add Member varibles

함수추가: Class이름 오른쪽마우스->Add Member Functions


ClassWizard를 사용해서 생성:

ClassWizard->add Class선택 이후 과정은 동일

변수추가: Member variables탭 사용

함수추가: 메시지 연동 함수만 추가 가능 message선택 -> add function


- 지역변수 전역변수

지역변수: 함수내에서만 사용

전역변수: 프로그램 전체에서 사용

int a;

void function()

{

        int b,c;

        ...

}


- 데이터 캡슐화

C

C++

변수만을 캡슐화

변수와 함수를 캡슐화

외부의 함수에 의해 수동으로 제어

내부의 함수를 통해 능동적으로 동작

struct Point{

   int x;

   int y;

};

class Point{

   int m_nX;

   int m_nY;

   void Move(int nX, int nY);

}


- Class의 개요

클래스의 선언(*.h)

Class Test{

public:

        int m_nX;

        int m_nY;

        

        void SetPosition(int nX, int nY);

}

        

클래스의 구현(*.cpp)

void Test::SetPosition((int nX, int nY)

{

        m_nX=nX;

        m_nY=nY;

}

클래스의 사용

Test a;

a.m_nX=10;

a.m_nY=20;

a.SetPosition(30,40);


- 생성자, 소멸자

Class CTest{

        CTest();

        virtual ~CTest();

}

생성자: Class초기화 메모리 생성, 변수에 초기값 지정

       생성자 호출: CTest a;

소멸자: 메모리 정리

        소멸자 호출: 자동


- public, private, protected

public:  클래스 외부에서도 사용

private: 클래스 내부에서만 사용

protect: 클래스 내부에서만 사용


- 연산자 오버로딩: 연산자를 함수처럼 사용

연산자의 종류

단항연산자: (전위형)a++; (후위형)++a;

이항연산자: a = a + b;


void Point::Increase()

{

        m_nX++;

        m_nY++;

}


main()

{

        Point p;

        p.Increase();

}

전위형 연산자의 연산자 오버로딩을 할 경우

main()

{

        Point p;

        ++p;

}


class Point

{

        void Increase();

        void operator++();

}

클래스의 사용

p.operator++(); -> ++p;

void Point::operator++()

{

        m_nX++;

        m_nY++;

}

아래 형식이 가능하게 할려면

Point p,q;

q = ++p;

Point Point::operator++()

{

        m_nX++;

        m_nY++;

        Point newPoint;

        newPoint.m_nX = m_nX;

        newPoint.m_nY = m_nY;

}


이항연산자의 오버로딩

Point a,b,c;

a = b + c;

a = b.operator+(c);


Point Point::operator+(Point &point)

{

        Point temp;

        temp.m_nX = m_nX + point.m_nX;

        temp.m_nY = m_nY + point.m_nY;

        return temp;

}


- 상속성: 이미 존재하는 클래스의 모든 특성을 물려받아서 새로운 클래스 생성

기반클래스, 파생클래스

class BaseClass{

public:

        int BaseVariable1;

        int BaseVariable2;


        void BaseFunction1();

        void BaseFunction2();

}


class DerivedClass : public BaseClass{

        int DrivedVarivariable;

        void DrivedFunction();

}


Protected와 Private의 차이

public: 클래스내부와 외부에서 모두 사용

protected: 클래스내부에서만 사용, 파생클래스 내부에서 사용가능

private: 클래스내부에서만 사용, 파생클래스 내부에서 사용 불가능


public상속과 private상속

public상속: 기반클래스의 public 멤버를 외부에서 사용 가능

private상속: 기반클래스의 public 멤버를 외부에서 사용 불가능


멤버함수의 재정의(Overriding)***: 파생클래스를 생성 후 기존 함수 중 필요한 함수를 재 정의


class Point3D : public Point

{

public:

        int m_nZ;

        void Show();

}

void Point3D::Show()

{

        cout << "Z=" << m_nZ << "Y=" << m_nY << "X=" <<m_nX;

}


void Point3D::Show()

{

        cout << "Z=" << m_nZ;

        Point::Show();

}


오버로딩(overloading)과 오버라이딩(overriding)

오버로딩: 중첩해서 여러 개의 기능을 하나의 함수나 연산자에게 추가하는 것

오버라이딩: 옛날의 기능을 없애고 새로운 기능을 부여


함수 오버로딩

class test

{

        int max(int a, int b);

        double max(double a, double b);

}

int test::max(int a, int b)

{

        if(a > b) return a;

        else     return b;

}

double test::max(double a, double b)

{

        if(a > b) return a;

        else     return b;

}


가상함수(Virtual Function): 동적 바인딩

함수의 바인딩: 컴파일을 하면 함수의 메모리상의 위치가 저장

        정적바인딩: 컴파일을 할 때 바인딩이 되는 경우

        동적바인딩: 실행을 할 때 바인딩(점프할 위치를 결정)이 되는 경우

                    단점-속도저하, 메모리 번지를 저장할 포인터 필요


Point *p;

Point point;

Point3D point3d;


p = &point;

p->Show();

p = &point3d;

p->Show();


두 가지 경우 모두 Point 클래스의 Show함수를 호출


기반 클래스의 Show를 가상함수로 선언하면 문제 해결된다.-실행할 때 바인딩을 해 주기 때문에

virtual void Show();


inline함수: 함수를 호출하는 부분에 통째로 복사; 수행속도가 빨라짐, 실행파일의 크기가 큼


inline함수의 선언

묵시적인방법: 헤더파일에서 함수의 본체 선언

명시적인방법: 함수를 선언할 때 inline이라는 예약어를 사용

              inline void SetPosition(int x, int y)

              {

              }


-레퍼런스

값 복사에 의한 호출: call by value

void Swap(int a, int b)

{

        int temp;

        temp = a;

        a = b;

        b = temp;

}


main()

{

        int x=10, y=20;

        Swap(x,y);

        cout << x << y;

}


레퍼런스에 의한 호출: call by reference

void Swap(int &a, int &b)

{

        int temp;

        temp = a;

        a = b;

        b = temp;

}


-this 포인터

class Where

{

        int data;

        void PrintPointer();

}


void Where::PrintPointer()

{

        cout << “오브젝트의 주소는” << this << “ 번지입니다.\n";

}//각 객체의 주소 출력, 파라미터로 자신의 주소를 다른 함수에 넘겨줄 때 활용


main()

{

        Where a,b,c;

        a.PrintPointer();

        b.PrintPointer();

        c.PrintPointer();

}


-const 변수/함수: 변수의 값을 변경 못하게 함

const double pi = 3.141592;

pi = 10; //에러


class Count {

        int GetCount() const; //멤버변수를 변경 시키지 못함

        int m_nCount;

}

int GetCount() const

{

        return m_nCount;

}


2. Visual C++의 구성


-MFC: 약 300개의 클래스로 구성

프로그램의 뼈대: AFX(application frameworks)

윈도우

그래픽

자료구조

파일 및 데이터베이스

인터넷

OLE: 분산 환경 컴포넌트

에러처리 디버깅


-간단한 자료구조 클래스들

CPoint: 2차원 좌표계

CSize: 가로세로의 길이를 지정

CRect: 사각형의 좌측상단과 우측하단의 좌표지정, 사각형의 현태 지정

CString: 문자열의 저장


3. 코딩의 규칙: 의미 있는 변수 명 지정

클래스 멤버변수 표기법: m_

헝가리안 표기법: 표1-7참조

        m_lpszFilename = m_ + lp + sz +Filename

데이터형:

        BOOL: 0 or 1

        BYTE: 8bits unsigned 정수

        LONG: 32bits signed 정수

        FLOAT: 소숫점

        UINT: 32bits unsigned 정수

        LPSTR: 널 문자로 끝나는 윈도우 문자열 포인터


Chapter 2


1. 프로그램의 뼈대


-일관된 사용자 인터페이스

-프로그램의 뼈대:AFX 공통적으로 수행하는 기능을 자동 구현

-윈도우 프로그램의 객체지향적 분할

CFramWnd: 윈도우의 틀(윈도의 모양변화)

  CView: 윈도우(데이터를 화면에 표시)

  CDocument: 자료,데이터, 여러 개의 View윈도우와 관련 가능





-AFX클래스들의 계층구조

CObject: 기반클래스

        CCmdTarget: 이벤트 처리

                CWinApp: 프로그램 구동

                CDocument: 자료

                CWnd: 윈도우

                        CFrameWnd: 윈도우 틀

                        CView: 윈도우 내부


CWinApp클래스

-윈도우 프로그램의 동작방식: 메시지 구동 방식

WM_CREATE

WM_ACTIVATE

WM_PAINT

WM_MOUSEMOVE/ LBUTTONDOWN/ LBUTTONUP/ LBUTTONDBLCLK

WM_COMMAND

WM_KEYDOWN/ KEYUP

WM_SIZE/ MOVE/ TIMER/ DESTROY


****spy++ 프로그램으로 메시지 확인


-메시지 구조

typedef struct tagMSG{

        HWND       hwnd;            윈도우 핸들,포인터

        UINT        message;         메시지 종류

        WPARAM    wParam;          추가정보; 키보드문자, 마우스버튼

        LPARAM     lParam;           추가정보

        DWORD      time;              시간

        POINT       pt;               마우스 좌표

}


-CWinApp의 역할: 프로그램을 구동

파생클래스 생성(APP Wizard)






CWinApp의 프로그램 구동 원리








- CWnd 클래스: 윈도우 프로그램의 핵심

300여개의 멤버함수(100: 윈도우 상태제어, 200: 메시지 처리 함수)

WM_CREATW          ->     OnCreate()

WM_PAINT            ->     OnPaint()


- 메시지 처리기의 구조








- CDocument 클래스: 데이터를 불러오고 저장하고 처리하는 모든 기능


- AFX 클래스들간의 상호 작용






2. 뼈대 만들기와 살 붙이기


뼈대만들기


-AppWizard: SDI, MDI, Dialog

생성되는 클래스들: CMyApp, CMyDoc, CMainFrame, CMyView


-ClassView, FileView


살붙이기


- 프로그램의 뼈대에 있는 기능의 수정 보완

멤버함수의 재정의(overriding)

ClassWizard의 사용: [ctrl-w] or View | ClassWizard 선택


- 프로그램의 뼈대에 새로운 기능 추가

멤버 변수/함수 추가

ClassView에서 원하는 클래스명 위에서 오른쪽 마우스 버튼 클릭 - add member Fuction 또는 Variable선택


이벤트처리기 추가(메뉴에 기능 구현)


3. 프로그램 뼈대 구조 이해


마우스 왼쪽 버튼을 누르면 화면에 "X"표시하는 프로그램


step 1: AppWizard로 SDI project생성

step 2: CView클래스에서 함수 추가(DrawX) - add member function


#define SIZE 10

void CDrawXView::DrawX(CPoint point)

{

        CClientDC dc(this);


        dc.MoveTo(point.x-SIZE*m_nMag, point.y-SIZE*m_nMag);

        dc.LineTo(point.x+SIZE*m_nMag, point.y+SIZE*m_nMag);

        dc.MoveTo(point.x-SIZE*m_nMag, point.y+SIZE*m_nMag);

        dc.LineTo(point.x+SIZE*m_nMag, point.y-SIZE*m_nMag);

}


step 3: 마우스 버튼이 클릭될 때 마다 호출되는 메시지 WM_LBUTTONDOWN에 연동되는 함수를 만들고 그 안에서 DrawX를 호출하게 프로그램밍

void CDrawXView::OnLButtonDown(UINT nFlags, CPoint point)

{

        DrawX(point);

        CView::OnLButtonDown(nFlags, point);

}


도큐먼트/뷰 구조를 이용한 프로그램


- 깨진 화면 복원 방법

메뉴나 마우스 커서의 화면 복원 방법: 그 부분을 메모리에 저장 후 다시 그려 줌

일반 윈도우 화면 복원 방법: 저장하는 방법은 메모리의 소모가 너무 크다->밑에 깔린 윈도우에 역할 맡김; 다시 한번 그림

윈도우가 다시 그려져야 할 필요가 있을 때 발생하는 메시지: WM_PAINT ->OnPaint()

CView클래스:OnPaint()함수 안에서 OnDraw()함수를 호출? 프린터기능도 부여하기 위해서


*깨진 화면 복원 방법*


Step 1: Document클래스에 그려야 할 데이터를 저장한다.

        CPoint m_ptData[100]; //위치를 저장할 변수 추가

        int m_nCount;          //저장된 위치 값의 개수 표시

        생성자 함수에서 m_nCount의 초기화 -> m_nCount = 0;

        

Step 2: CView에서 마우스를 클릭할 때 마다 화면에 "X"를 표시하고 또한 이값을 Document에 저장

        OnLButtonDown함수에서

        CDoc     *pDoc = GetDocument();

        if(pDoc->m_nCount <100)

        {

                pDoc->m_ptData[pDoc->m_nCount] = point;

                pDoc->m_nCount++;


                DrawX(point);

        }


Step 3: OnDraw()함수를 이용한 화면 복원

        CDoc *pDoc = GetDocument();

        ASSERT_VALID(pDoc);

        for(int i=0;i<pDoc->m_nCount;i++){

                DrawX(pDoc->m_ptData[i]);

        }



*메뉴 이벤트 처리: WM_COMMAND처리(메뉴의 종류가 너무 많아서 일반 윈도우 메시지와는 다른 Menu의 ID를 보조 정보로 사용)

ResoureView-Menu-마우스 더블클릭-Menu Item Properties


ID: 프로그램 내부적으로 사용 되는 이름

Caption: 메뉴 화면에 보이는 항목


데이터보기에 관련된 메뉴 처리의 예: X표 크기 조절 CView에서 수행


그래픽 처리 -> 145page그림 참조

classwizard - object IDs: ID_ORIGINALSIZE, Messages: COMMAND


void CDrawXView::OnOriginalsize()

{

        m_nMag = 1;

        Invalidate();            //WM_PAINT발생

}

void CDrawXView::OnMagnify()

{

        m_nMag = 2;

        Invalidate();

}

m_nMag의 클래스 멤버변수 등록


그리는 루틴에 (위치 값 * m_nMag)


* X표 좌우로 이동

step 1: 메뉴추가

        데이터처리 - 좌로이동(&L)  ID_LEFT

                   - 우로이동(&R)  ID_RIGHT


step2: 이벤트 처리 추가

        classwizard에서 ID_LEFT, ID_RIGHT에 아래 함수 추가

void CDrawXDoc::OnLeft()

{

        for(int i=0;i<m_nCount;i++){

                m_ptData[i].x -= 50;

        }

        UpdateAllViews(NULL);//현재Document에 연결된 모든 View에 WM_PAINT발생

}

void CDrawXDoc::OnRight()

{

        for(int i=0;i<m_nCount;i++){

                m_ptData[i].x += 50;

        }

        UpdateAllViews(NULL);

}


데이터 저장 및 읽어오기: CDocument - Serialize()


-파일 입출력 메뉴: 그림 2-45참조

ID_FILE_New-CWinApp::OnFileNew()-CDocument::OnNewDocument()//인스턴스 선언

ID_FILE_OPEN-CWinApp::OnFileOpen()-CDocument::OnOpenDocument()-Serialize()

ID_FILE_SAVE-CWinApp::OnFileSave()-CDocument::OnSaveDocument()-Serialize()

ID_FILE_SAVW_AS-CWinApp::OnFileSaveAs()-CDocument::OnOpenDocument()-Serialize()


* Serialize함수를 이용하여 저장하기


void CTest1Doc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())  //저장

        {

                ar << n;  //연산자 오버로딩

        }

        else              //읽기

        {

                ar >> n;

        }

}


CArchive클래스: 데이터의 저장/읽어오기를 담당하는 클래스 CDocument <> CFile을 연결

                 OnOpenDocument()과 OnSaveDocument()에서 인스턴스 선언이 된다.


- DrawX데이터 저장 및 읽어오기


void CDrawXDoc::Serialize(CArchive& ar)

{

        int i;

        if (ar.IsStoring())  //저장

        {

                ar << m_nCount;

                for(i=0;i<m_nCount;i++){

                        sr << m_ptData[i];

                }

        }

        else              //읽기

        {

                ar >> m_nCount;

                for(i=0;i<m_nCount;i++){

                        sr >> m_ptData[i];

                }

        }

}


-파일대화 상자부터 CArchive를 이용해서 데이터를 입출력하는 과정까지 한 번에 처리


char szFilter[] = "Text File(*.txt)|*.txt|All Files(*.*)|*.*||";


void CFileDialogDoc::OnFileOpen()

{

        // TODO: Add your command handler code here

        int i;

        CFileDialog dlg(true, NULL, NULL, OFN_HIDEREADONLY, szFilter);

        if(IDOK==dlg.DoModal())

        {

                CFile file;

                file.Open(dlg.GetPathName(), CFile::modeRead);

                CArchive ar(&file,CArchive::load);

                ar >> m_nCount;

                for(i=0;i<m_nCount;i++){

                        ar >> m_ptData[i];

                }

        }

}


void CFileDialogDoc::OnFileSave()

{

        // TODO: Add your command handler code here

        int i;

        CFileDialog dlg(false, NULL, NULL, OFN_HIDEREADONLY, szFilter);

        if(IDOK==dlg.DoModal())

        {

                CFile file;

                file.Open(dlg.GetPathName(), CFile::modeCreate|CFile::modeWrite);

                CArchive ar(&file,CArchive::store);

                ar << m_nCount;

                for(i=0;i<m_nCount;i++){

                        ar << m_ptData[i];

                }

        }

}


Chap 3 GDI를 이용한 그래픽


1. 윈도우 그래픽의 이해


하드웨어 독립적인 프로그래밍: Hardware Independent Programming


-디바이스 드라이버에 의한 독립적 프로그래밍

응용프로그램

윈도우운영체제                  하드웨어 독립

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

디바이스드라이버                하드웨어 종속

디바이스(하드웨어)


-컬러모드 독립적 프로그래밍

다양한 컬러 모드가 존재: 1bits,4bits,8bits,16bits,24bits,32bits 이러한 모드에 상관없이 프로그래밍


윈도우 그래픽


그래픽 디바이스 인터페이스(GDI:Graphic Device Interface):

        그래픽에 관련된 모든 기능

디바이스 컨텍스트(DC:Device Context):

        화가, 그래픽에 필요한 모든 옵션들

GDI 오브젝트(GDI object):

        도구, Pen, Brush, Font, Bitmap, Palette, Region


그래픽 관련 MFC클래스


-디바이스 컨텍스트 클래스

CDC클래스: 윈도우마다 각각의 DC가 존재한다.

        CDC *pDC = GetDC();

        pDC->Rectangle(10,10,100,100);

        ReleaseDC(pDC);


CClientDC클래스

        CClientDC dc(this);

        pDC->Rectangle(10,10,100,100);


-GDI 오브젝트 글래스

펜: CPen

브러시(붓):CBrush

글꼴: CFont

비트맵: CBitmap

팔레트: CPalette

영역: CRgn


2. 펜과 브러시


펜과 브러시를 이용한 그래픽:

함수

그리기 기능

MoveTo, LineTo

Rectangle, FillRect, FrameRect, Draw3DRect

사각형

Ellipse

타원

Pie

파이

Arc, ArcTo, AngleArc, Chord

Polygon

다각형

PolyDraw, PolyBezier, PolyBezierTo

베지어 곡선

FrameRgn

영역의 경계선


GDI오브젝트 생성 함수

클래스

멤버 함수

CPen

CreatePen

CBrush

CreateSolidBrush, CreateHatchBrush, CreatePatternBrush

CFont

CreateFont, CreateFontIndirect

CBitmap

CreateBitmap, CreateCompatibleBitmap, LoadBitmap

CPalette

CreatePalette

CRgn

CreateRectRgn, CreateEllipseRgn, CreatePolygonRgn,


그래픽 옵션 바꾸기


CPen pen;

pen.CreatePen(PS_SOLID,3,RGB(255,0,0));

CClientDC dc(this);

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

dc.Rectangle(10,10,100,100);

dc.SelectObject(pOldPen);


내장(stock)GDI 오브젝트: 자주 사용하는 오브젝트는 미리 만들어 놓음, 메모리 상주


내장 GDI 오브젝트

GDI 오브젝트 종류

내장 GDI 오브젝트

BLACK_PEN

WHITE_PEN

NULL_PEN

브러시

BLACK_BRUSH

WHITE_BRUSH

DKGRAY_BRUSH

GRAY_BRUSH

HOLLOW_BRUSH

LTGRAY_BRUSH

NULL_BRUSH

글꼴

ANSI_FIXED_FONT

ANSI_VAR_FONT

DEVICE_DEFAULT_FONT

OEM_FIXED_FONT

SYSTEM_FONT


그래픽 옵션 바꾸기

CClientDC dc(this);

dc.SelectStockObject(RED_PEN);

dc.Rectangle(10,10,100,100);

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

펜 스타일

펜스타일

 

PS_SOLID

실선

PS_DASH

파선

PS_DOT

점선

PS_DASHDOT

일점점선

PS_DASHDOTDOT

이점점선

PS_NULL

선을 그리지 않음


3. 펜과 브러시로 그리기


예제: 무작위로 정해진 색깔, 모양, 위치등을 이용하여 다양한 도형을 그리는 프로그램

        SetTimer(타이머번호, 시간, NULL)      ;정해진 시간마다 WM_TIMER발생

        KillTimer(타이머번호)                   ;타이머를 제거

        WM_TIMER->OnTimer()함수            ;함수호출

        OnIntialUpdate()함수                    ;View의 초기화

        WM_DESTROY->OnDestroy()함수       ;윈도우의 종료 시 수행


void CGDIDemoView::OnInitialUpdate()

{

        CView::OnInitialUpdate();

        

        // 0.1초마다 WM_TIMER 메시지가 발생하도록 설정

        SetTimer(0, 100, NULL);

}


void CGDIDemoView::OnDestroy()

{

        CView::OnDestroy();

        

        // 타이머를 꺼줌

        KillTimer(0);

}


#define OBJ_LINE              0

#define OBJ_RECTANGLE      1

#define OBJ_ELLIPSE          2

#define OBJ_ROUNDRECT      3

#define OBJ_CHORD           4

#define OBJ_PIE                       5


void CGDIDemoView::OnTimer(UINT nIDEvent)

{

    CClientDC dc(this);                         // 화면 출력을 위한 DC 클래스

    CRect rect;                                 // 화면 크기를 얻기 위한 변수

    CBrush brush, *pOldBrush;                 // 브러시 오브젝트

    CPen pen, *pOldPen;                        // 펜 오브젝트


    int  x1,y1,x2,y2,x3,y3,x4,y4;               // 화면 좌표

    int  r,g,b;                                   // 컬러

    int  nObject;                                // 그래픽 타입

        

    GetClientRect(rect);                        // 화면의 크기를 얻는 함수


    r = rand() % 255;                          // 컬러를 랜덤하게 설정

    g = rand() % 255;

    b = rand() % 255;

    brush.CreateSolidBrush(RGB(r,g,b));         // 브러시 생성

    pOldBrush = (CBrush *)dc.SelectObject(&brush); // DC에 브러시 선택


    r = rand() % 255;                          // 컬러를 랜덤하게 설정

    g = rand() % 255;

    b = rand() % 255;

    pen.CreatePen(PS_SOLID, 5, RGB(r,g,b));   // 펜 생성

    pOldPen = (CPen *)dc.SelectObject(&pen);  // DC에 펜 선택


    x1 = rand() % rect.right;                   // 좌표를 랜덤하게 설정

    y1 = rand() % rect.bottom;

    x2 = rand() % rect.right;

    y2 = rand() % rect.bottom;

    x3 = rand() % rect.right;

    y3 = rand() % rect.bottom;

    x4 = rand() % rect.right;

    y4 = rand() % rect.bottom;


    nObject = rand() % 6;                      // 그래픽 타입을 랜덤하게 설정


    switch(nObject)

    {

        case OBJ_LINE:                        // 라인 그리기

            dc.MoveTo(x1,y1);

            dc.LineTo(x2,y2);

            break;


        case OBJ_RECTANGLE:                // 사각형 그리기

            dc.Rectangle(x1,y1,x2,y2);

            break;


        case OBJ_ELLIPSE:                    // 타원 그리기

            dc.Ellipse(x1,y1,x2,y2);

            break;


        case OBJ_ROUNDRECT:                 // 둥근 사각형 그리기

            dc.RoundRect(x1,y1,x2,y2,x3,y3);

            break;


        case OBJ_CHORD:                      // 현 그리기

            dc.Chord(x1,y1,x2,y2,x3,y3,x4,y4);

            break;


        case OBJ_PIE:                         // 파이 그리기

            dc.Pie(x1,y1,x2,y2,x3,y3,x4,y4);

            break;

    }


    dc.SelectObject(pOldPen);                          // DC 복원

    dc.SelectObject(pOldBrush);                         // DC 복원


    CView::OnTimer(nIDEvent);

}


예제: 벽에 부딪히면 튀는 공

        SetTimer(타이머번호, 시간, NULL)      ;정해진 시간마다 WM_TIMER발생

        KillTimer(타이머번호)                   ;타이머를 제거

        WM_TIMER->OnTimer()함수            ;함수호출

        OnIntialUpdate()함수                    ;View의 초기화

        WM_DESTROY->OnDestroy()함수       ;윈도우의 종료 시 수행


void CBounceView::OnInitialUpdate()

{

        CView::OnInitialUpdate();

        

        // 0.05초마다 WM_TIMER 메시지가 발생하도록 설정

        SetTimer(0, 50, NULL);

}


void CBounceView::OnDestroy()

{

        CView::OnDestroy();

        

        // 타이머를 꺼줌

        KillTimer(0);

}


#define R 20

#define STEP 5


void CBounceView::OnTimer(UINT nIDEvent)

{

        CClientDC dc(this);

        static int nX=R, nY=R;                         // 현재 공의 위치

        static int nCX=STEP, nCY=STEP;              // 공의 이동 방향


        CRect rect;                            // 클라이언트 영역의 크기

        GetClientRect(&rect);                   // 클라이언트 영역의 크기를 얻음


        // 이전 공을 지우기 위해 흰색 브러시를 선택

        dc.SelectStockObject(WHITE_BRUSH);

        dc.Ellipse(nX-R,nY-R,nX+R,nY+R);     // 원 그리기


        // x 좌표 변경

        if(nX < R) nCX = STEP;

        else if(nX > rect.Width()-R) nCX = -STEP;

        nX += nCX;

        

        //y 좌표 변경

        if(nY < R) nCY = STEP;

        else if(nY > rect.Height()-R) nCY = -STEP;

        nY += nCY;

        

        // 새로 공을 그리기 위해 빨간색 브러시 생성

        CBrush brush, *pOldBrush;

        brush.CreateSolidBrush(RGB(255,0,0));


        // DC에 빨간색 브러시 선택

        pOldBrush = (CBrush *)dc.SelectObject(&brush);

        dc.Ellipse(nX-R,nY-R,nX+R,nY+R);             // 원 그리기

        dc.SelectObject(pOldBrush);                    // DC 복원

        CView::OnTimer(nIDEvent);

}


4. 펜과 브러시의 레스터 오퍼레이션: 새로운 그림과 기존의 그림을 합성하는 방법


int SetROP2(int nDrawMode);    


레스터 오퍼레이션 코드 의미

레스터 오퍼레이션 코드

연산

R2_COPYPEN

P

R2_XORPEN

P^D

PS_NOTXORPEN

~(P^D)

PS_NOT

~(P&D)

P: 새로운 그림, D: 기존 배경, ^: XOR, ~: NOT, &: AND


R2_COPYPEN                  : 새로운 그림

R2_XORPEN                    : 기존 그림과 새로운 그림 XOR


x

y

z(결과)

0

0

0

0

1

1

1

0

1

1

1

0

 

R

G

B

바탕색

1100

0101

1111

새로운색

0101

1110

1010

결과XOR

1001

1011

0101

새로운색

0101

1110

1010

결과XOR

1100

0101

1111

->애니메이션에 활용, 한번 그려주면 그림이 그려지고 다시 한번 그리면 원래의 바탕 그림이 회복되는 모드


-마우스를 드래그하면서 선을 그리는 프로그램 예제


class CRop2View : public CView

{

public:

        CPoint m_Pt1, m_Pt2;                          //라인을 그리기 위한 두 지점

};


void CRop2View::OnLButtonDown(UINT nFlags, CPoint point)

{

        m_Pt1 = m_Pt2 = point;

        

        CView::OnLButtonDown(nFlags, point);

}


void CRop2View::OnMouseMove(UINT nFlags, CPoint point)

{

        if(nFlags & MK_LBUTTON)

        {

                CClientDC dc(this);

                

                //레스터 오퍼레이션을 R2_XORPEN으로 설정

                dc.SetROP2(R2_XORPEN);      


                //흰색 펜을 선택

                dc.SelectObject( GetStockObject(WHITE_PEN) );


                //이전에 그려진 선을 지웁니다.

                dc.MoveTo(m_Pt1);

                dc.LineTo(m_Pt2);

                

                //새로 선을 그립니다.

                dc.MoveTo(m_Pt1);

                dc.LineTo(point);


                //현재 점을 다음에 지워질 점으로 저장해 둡니다.

                m_Pt2 = point;

        }

        

        CView::OnMouseMove(nFlags, point);

}


5. 글꼴 및 텍스트 출력하기: Font GDI = CFont


논리적인 글꼴: 모양 형태 등의 논리적인 정의 = 구조체(structure)

typedef struct tagLOGFONT{

        LONG lfHeight         //높이

        LONG lfWidth          //너비

        LONG lfEscapement    //방향

        LONG lfOrientation     //회전각도

        LONG lfWeight         //굵기

        BYTE lfItalic           //기울임

        BYTE lfUnderline      //밑줄

        BYTE lfStrikeOut       //취소선

        BYTE lfCharSet         //문자세트

        BYTE lfOutPrecision   //출력정확도

        BYTE lfClipPrecision   //클리핑정확도

        BYTE lfQuality         //출력의 질

        BYTE lfPitchAndFamily  //자간

        CHAR lfFaceName     //글꼴이름

}LOGFONT;


글꼴형 변수 선언: 

LOGFONT m_logFont


        m_logFont.lfHeight             = 100;

        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, _T("Times New Roman"));


물리적인 글꼴: 현재 컴퓨터에 설치되어 있는 글꼴 중 가까운 글꼴 선택


-CFont를 이용한 글꼴 생성:

크기와 이름만 입력 나머지는 디폴트 사용:CreatePointFont

CFont font;

font.CreatePointFont(100,_T("Times New Roman"));

세밀한 글꼴의 생성: CreateFontIndirect 또는 CreateFont


font.CreateFontIndirect(&logFont);   //미리 logFont에 옵션을 다 채워야 함

or

font.CreateFont(100,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,

        DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,

        CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,

        DEFAULT_PITCH|FF_DONTCARE,_T("Times New Roman"));


CFontDialog공통대화 상자: 옵션을 공통 다이얼로그 박스에서 채워줌  = 가장 보편적임


텍스트 출력함수:

(1) BOOL TextOut(int x, int y, const CString& str)                    :점을 기준

정렬방법

의미

TA_CENTER

수평 중심으로 정렬

TA_LEFT

왼쪽 기준

TA_RIGHT

오른쪽 기준

TA_BASELINE

선택된 폰트의 베이스라인과 일치

TA_BOTTOM

사각형의 바닥 기준

TA_TOP

사각형의 상단 기준

CClientDC dc(this)

dc.SetTextAlign(TA_LEFT | TA_TOP);

dc.TextOut(x,y,"This is a Test");


(2) int DrawText(const CString& str, LPRECT lpRect, UINT nFormat) :사각형을 기준

정렬방법

의미

DT_BOTTOM

사각형의 바닥 기준

DT_CENTER

수평 중심 기준

DT_RIGHT

오른쪽 기준

DT_LEFT

왼쪽 기준

DT_SINGLELINE

한줄 만

DT_VCENTER

수직 중심 기준

CClientDC dc(this)

dc.DrawText("This is a Test", &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);


텍스트 색상설정 함수:

(1) SetTextColor(RGB(255,0,0));         //글꼴의 색상 선택

(2) SetBkColor(RGB(255,0,0));          //배경색의 설정

(3) SetBkMode(OPAQUE);              //배경을 투명(TRANSPARENT)하게 또는 불투명(OPAQUE)하게 할거냐 선택


- 텍스트 출력하는 예제 프로그램 구현


(1) 멤버 변수 선언

class CFontView : public CView

{

        BOOL m_bTransparent;         // 텍스트의 배경을 투명하게 할 것인지

        COLORREF m_colorText;       // 텍스트 전경색

        COLORREF m_colorBk;         // 텍스트 배경색

        LOGFONT m_logFont;          // 텍스트를 출력할 논리적 글꼴


(2) 멤버 변수 초기화


CFontView::CFontView()

{

        m_bTransparent = FALSE;

        m_colorText = RGB(0, 0, 255);

        m_colorBk = RGB(255, 255, 0);

        

        m_logFont.lfHeight             = 100;

        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, _T("Times New Roman"));

}


(3)텍스트 출력


void CFontView::OnDraw(CDC* pDC)

{

        // 클라이언트 영역의 크기를 얻어냄

        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("Hello",&rect,

                          DT_SINGLELINE|DT_CENTER|DT_VCENTER);

}


(4)메뉴 편집


텍스트옵션                      

글꼴변경                        IDM_FONT

텍스트 전경색                   IDM_FORECOLOR

텍스트 배경색                   IDM_BACKCOLOR

텍스트 배경 투명하게            IDM_BKMODE


(4-1)글꼴변경                  IDM_FONT

void CFontView::OnFont()

{

        CFontDialog dlg(&m_logFont);

        if(dlg.DoModal() == IDOK)

        {

                dlg.GetCurrentFont(&m_logFont);

                Invalidate();

        }

}


(4-2)텍스트 전경색             IDM_FORECOLOR

void CFontView::OnForecolor()

{

        CColorDialog dlg(m_colorText); 

        if( dlg.DoModal() == IDOK )

        {

                m_colorText = dlg.GetColor();

                Invalidate();

        }

}

(4-3)텍스트 배경색             IDM_BACKCOLOR

void CFontView::OnBackcolor()

{

        CColorDialog dlg(m_colorBk);   

        if( dlg.DoModal() == IDOK )

        {

                m_colorBk = dlg.GetColor();

                Invalidate();

        }

}


(4-4)텍스트 배경 투명하게      IDM_BKMODE

void CFontView::OnBkmode()

{

        m_bTransparent = !m_bTransparent;

        Invalidate();

}


Chap 4 대화상자와 컨트롤


1. 대화상자와 컨트롤의 이해: 사용자의 입력=컨트롤들의 관리


(1) 대화상자의 역할

대화상자 리소스: ResourceView->Insert Dialog, 모양 디자인

[alt]+[Enter] 또는 Right MouseButton On Form ->[Dialog Properties]: ID를 이용하여 대화상자와 소스코드 연결


컨트롤배치:     나이와 이름을 입력받는 대화상자 작성,

                layout 또는 RMouseButton On Menu->Dialog선택


탭순서: 컨트롤들의 포커스가 움직이는 순서

        Layout->Tab Order 또는 [ctrl]+[D] 탭 순서 조정


리소스 파일: *.rc, Resource.h = 리소스 정보 저장


(2) 대화상자와 컨트롤 관련 MFC클래스

대화상자 클래스: CDialog               -> 파생클래스 사용

컨트롤 클래스들: CEdit, CButton, etc.   -> 원본클래스 사용


(3) CDialog 클래스에 구현되어 있는 기능들

대화상자 화면에 출력단계:       

        모양디자인

        CDialog파생 클래스 생성: Form DoubleClick

        DoModal()함수 호출


재정의 가능한 함수: OnInitialDialog()=초기화 루틴

메시지 처리기: 윈도우와 동일

이벤트 처리기: CDialog클래스안에서 IDOK=OnOK(), IDCANCEL=OnCancel()


void CMyView::OnDialog()

{

        CMyDlg dlg;

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

                

        }

}


Value형 멤버변수       : 값을 입력받는 기능

Control형 멤버변수     : 컨트롤을 제어 모양/기능을 조정


멤버변수와 컨트롤 연결  : ClassWizard->MemberVariables선택

                          또는 컨트롤위에서 [ctrl]+[Mouse DoubleClick]


-사람의 이름과 나이를 입력받아서 처리하는 다이얼로그 박스 테스트

void CMyView::OnTest()

{

        // TODO: Add your command handler code here

        CMyDialog dlg;

        CString   str;

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

                MessageBox(dlg.m_strName,NULL,MB_OK);

                str.Format("%d",dlg.m_nAge);

                MessageBox(str,NULL,MB_OK);

        }


}


2. Value형 멤버 변수


컨트롤과 멤버변수 사이의 데이터 전송

void CMyDialog::DoDataExchange(CDataExchange* pDX)

{

        CDialog::DoDataExchange(pDX);

        //{{AFX_DATA_MAP(CMyDialog)

        DDX_Text(pDX, IDC_EDIT1, m_strName);

        DDX_Text(pDX, IDC_EDIT2, m_nAge);

        //}}AFX_DATA_MAP

}


UpdateData 함수를 이용한 데이터 전송

그림 4-14참조

        UpdateData(TRUE):    컨트롤 -> 변수

        UpdateData(FALSE):    변수 -> 컨트롤


기본적으로 호출되는 UpdateData 함수

시작할 때: OnInitDialog() 함수안에서 UpdateData(FALSE)호출

종료할 때: OnOk() 함수안에서 UpdateData(TRUE) 호출


입력된 값의 유효성 검사

ClassWizard에서 변수마다 유효한 값의 범위를 설정 가능

->설정된 범위가 DoDataExchange()함수에 표시


3. Control형 멤버 변수

컨트롤들이 모두 클래스로 구성->인스턴스를 선언해서 컨트롤의 멤버함수들을 활용할 수 있다.

목적:

  입력 시 사용자의 편의 도모: 주소 선택을 할 경우, ComboBox=시,구(군),동,나머지

  논리적으로 모순 되는 입력 방지: 신상입력을 할 경우, 남자: 병역,  여자: 비활성화


-본인과 배우자의 신상 입력: 기혼일 경우 배우자 신상 입력


(1) 대화상자 리소스 편집

그림 4-18참조, ID=IDD_PROFILE


(2) 파생클래스 생성: Form Double-Click

CProfileDlg


(3) 컨트롤과 Value형 변수 연결

표4-6참조

ClassWizard활용하여 연결



(4) 메뉴 리소스 편집

IDM_PROFILE  Caption:인적사항입력


(5) 이벤트 처리기 작성: ClassWizard사용-View클래스


void CProfileView::OnProfile()

{

  CProfileDlg dlg;

  if(dlg.DoModal() == IDOK)

  {

    CString str;

    if(dlg.m_bMarried)  // 기혼의 경우

    {

      str.Format("본인이름: %s, 나이: %d, \n배우자이름: %s, 나이: %d",

                dlg.m_strName1, dlg.m_nAge1, dlg.m_strName2, dlg.m_nAge2);

    }

    else                 // 미혼의 경우

    {

      str.Format("본인이름: %s, 나이: %d", dlg.m_strName1, dlg.m_nAge1);

    }

    AfxMessageBox(str);

  }

}


(6) 컨트롤과 Control형 멤버변수 연결: 기혼 체크박스가 체크되지 않으면 배우자 항목 비활성화

배우자 정보 관련 컨트롤들을 Control형 멤버변수 연결: 이름, 나이

ClassWizard에서 [Member Variabls]-[Add Variable]-[Category]항을 Control로 설정

변수 위에서 [ctrl]+mouse double-click: [Category]항을 Control로 설정


member variable name = 이름: m_ctrlName, 나이: m_ctrlAge


(7) 컨트롤 비활성화: EnableWindow()함수 활용

시작할 때는 배우자 입력은 비활성화 시켜야 함


BOOL CProfileDlg::OnInitDialog()

{

        CDialog::OnInitDialog();

        

        m_ctrlName.EnableWindow(FALSE);

        m_ctrlAge.EnableWindow(FALSE);

        

        return TRUE;  // return TRUE unless you set the focus to a control

                      // EXCEPTION: OCX Property Pages should return FALSE

}


Check Box가 클릭될 때 마다 활성화 또는 비활성화 필요: 대화상자의 컨트롤들이 동작에 대한 메시지를 발생시키는데 이를 검출해서 처리하는 함수를 생성


ClassWizard에서 Object IDs항에서 컨트롤 ID를 찾고 해당하는 메시지함수 추가

void CProfileDlg::OnCheck1()

{

        UpdateData(TRUE);

        

        m_ctrlName.EnableWindow(m_bMarried);

        m_ctrlAge.EnableWindow(m_bMarried);

}


m_bMarried: Check Box연동 변수=Bool변수

UpdateData(TRUE): 는 다이얼로그 박스에서 체크한 값을 m_bMarried에 넘겨주는 역할



- Control형 변수를 이용한 컨트롤 제어

Control형 멤버 변수와 관련 코드

class CProfileDlg

{

        CEdit m_ctrlName;

        CEdit m_ctrlAge;

}


void CProfileDlg::DoDataExchange(CDataExchange* pDX)

{


        DDX_Control(pDX, IDC_EDIT4, m_ctrlAge);

        DDX_Control(pDX, IDC_EDIT3, m_ctrlName);

}


컨트롤에 사용되는 중요 클래스들

CWnd: 기반 클래스

CEdit: CButton: CSpinButtonCtrl: CScrollBar: CListBox/CComboBox


대화상자와 컨트롤의 초기화: OnInitDialog()함수에서 수행 예) EnableWindow(컨트롤이 생성된 후 작동

변수의 초기화: 생성자 함수

동작 순서: 생성자 함수 호출 -> OnInitDialog()함수 호출


윈도우메시지: WM_                     = 컨트롤에 메시지 전송

통지(Notification) 메시지; xxN_         = 대화상자로 메시지 전송, 대화상자위의 모든 컨트롤의 파생 클래스를 만들지 않아도 됨


4. 능동적인 대화상자 만들기


-인터넷 쇼핑몰에서 물건을 구매하는 예제


(1) 뼈대만들기: SDI


(2) 메뉴 만들기

ID                       Caption

ID_LISTBOXDLG       : 물품 구입(&B)

ID_SPINDLG           : 수량(&Q)

ID_RADIODLG          : 결재 및 배송 방법(&D)

ID_COMBODLG         : 주소(&A)


(3) ListBox 컨트롤(IDD_LISTBOXDLG): 완쪽에서 더블 클릭을 하면 오른쪽으로 이동 반대도 가능(표 4-17참조)





(3-1) CListboxDlg라는 다이얼로그 박스 파생 클래스 생성


(3-2) 멤버변수 추가: Classwizard사용

        CListBox       m_ctrlRight;

        CListBox       m_ctrlLeft;

        CString         m_strLeft;

        CString         m_strRight;


(3-3) 컨트롤 초기화

BOOL CListboxDlg::OnInitDialog()

{

        CDialog::OnInitDialog();

        

        CString strProduct[] = {_T("CPU"), _T("Mainboard"), _T("Mouse"),

                _T("Keyboard"), _T("Case"), _T("Video card"), _T("Sound card"),

                _T("HDD"), _T("FDD"), _T("Modem"), _T("LAN card"), _T("DVD Rom")};


        for(int i=0 ; i<sizeof(strProduct)/sizeof(CString) ; i++)

                m_ctrlLeft.AddString(strProduct[i]);

        

        return TRUE;  // return TRUE unless you set the focus to a control

                      // EXCEPTION: OCX Property Pages should return FALSE

}


(3-4) LBN_DBLCLK이벤트 처리

Classwizard - [Object IDs]:IDC_LIST1, IDC_LIST2선택 - [Messages]:LBN_DBLCLK


void CListboxDlg::OnDblclkList1()

{

        int nSel = m_ctrlLeft.GetCurSel();

        if(nSel >= 0)

        {

                UpdateData(TRUE);


                m_ctrlLeft.DeleteString(nSel);

                m_ctrlRight.AddString(m_strLeft);

        }

}


void CListboxDlg::OnDblclkList2()

{

        int nSel = m_ctrlRight.GetCurSel();

        if(nSel >= 0)

        {

                UpdateData(TRUE);


                m_ctrlRight.DeleteString(nSel);

                m_ctrlLeft.AddString(m_strRight);

        }

}


(3-5) 대화 상자의 값 저장: Listbox에 연결된 변수에는 현재 선택한 값만 저장

원하는 결과는 오른쪽 Lisbox에 있는 모든 값들

변수 추가

CString m_strSelected


void CListboxDlg::OnOK()

{

        CString strItem;


        UpdateData(TRUE);

        m_strSelected.Empty();


        for(int i=0 ; i<m_ctrlRight.GetCount() ; i++)

        {

                m_ctrlRight.GetText(i, strItem);


                if(!m_strSelected.IsEmpty()) m_strSelected+= _T(", ");

                m_strSelected += strItem;

        }

        

        CDialog::OnOK();

}


(3-6) 대화 상자 출력: 화면에 표시

void CDialogExampleView::OnListboxdlg()

{

        CListboxDlg dlg;

        if(dlg.DoModal() == IDOK)

        {

                AfxMessageBox(dlg.m_strSelected);

        }

}


(4) ComboBox 컨트롤(그래픽 디자인)





(4-1) 콤보박스 속성지정

Combo박스의 화살표를 눌러서 펼침메뉴의 크기 조절 수행


(4-2) 클래스 추가 및 멤버변수 지정: CComboDlg

역할            ID                     Value형 변수        Control형 변수

시(도)          IDC_COMBO1          int m_nCity         CComboBox m_ctrlCity

구(군)          IDC_COMBO2          int m_nGu           CComboBox m_ctrlGu

동(면)          IDC_COMBO3          int m_nDong        CComboBox m_ctrlDong

나머지주소      IDC_EDIT1             CString m_strRest

전체주소        IDC_ADDRESS         m_strAddress


(4-3) 컨트롤 초기화

전역변수

static CString g_strCity[] = {"경기도", "서울특별시", "광주광역시"};


static CString g_strGu1[] = {"광명시", "안양시", "부곡시"};

static CString g_strGu2[] = {"구로구", "금천구", "강동구"};

static CString g_strGu3[] = {"광산구", "남구", "북구"};


static CString g_strDong1[] = {"철산동", "하안동", "개봉동"};

static CString g_strDong2[] = {"갈산동", "관양동", "귀인동"};

static CString g_strDong3[] = {"고잔동", "원곡동", "사사동"};


BOOL CComboDlg::OnInitDialog()

{

        CDialog::OnInitDialog();

        

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

                m_ctrlCity.AddString(g_strCity[i]);

        

        return TRUE;  // return TRUE unless you set the focus to a control

                      // EXCEPTION: OCX Property Pages should return FALSE

}

(4-4) 전체 주소 표시기능

void CComboDlg::ShowAddress()

{

        UpdateData(TRUE);

        

        CString strCity, strGu, strDong;

        if(m_nCity >= 0) m_ctrlCity.GetLBText(m_nCity, strCity);

        if(m_nGu >= 0) m_ctrlGu.GetLBText(m_nGu, strGu);

        if(m_nDong >= 0) m_ctrlDong.GetLBText(m_nDong, strDong);


        m_strAddress.Format("%s %s %s %s", strCity, strGu, strDong, m_strRest);

        UpdateData(FALSE);

}


(4-5) CBN_SELCHANGE 이벤트 처리

앞의 콤보박스가 변경이 되면 뒤에 있는 콤보박스의 내용을 따라서 변경

예)     시(도) 콤보박스에서 서울시 선택

        구(군) 콤보박스에서 서울시에 있는 구(군)만 표시


void CComboDlg::OnSelchangeCombo1()

{

        UpdateData();


        //구(군), 동(면) Combo Box 컨트롤 내용 모두 삭제

        m_ctrlGu.ResetContent();

        m_ctrlDong.ResetContent();


        CString *pGu;

        switch(m_nCity)

        {

                case 0: pGu = g_strGu1;       break;

                case 1: pGu = g_strGu2;       break;

                case 2: pGu = g_strGu3;       break;

        }


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

                m_ctrlGu.AddString(pGu[i]);

        

        ShowAddress();

}


void CComboDlg::OnSelchangeCombo2()

{

        UpdateData();


        // 동(면) Combo Box 컨트롤 내용 모두 삭제

        m_ctrlDong.ResetContent();


        CString *pDong;

        switch(m_nGu)

        {

                case 0: pDong = g_strDong1;  break;

                case 1: pDong = g_strDong2;  break;

                case 2: pDong = g_strDong3;  break;

        }


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

                m_ctrlDong.AddString(pDong[i]);


        ShowAddress();

}


void CComboDlg::OnSelchangeCombo3()

{

        ShowAddress();

}


(4-6) Edit 박스의 EN_CHANGE 이벤트 처리: 나머지 주소 변경

void CComboDlg::OnChangeEdit1()

{

        ShowAddress();

}


(4-7) 대화상자 출력

#include "ComboDlg.h"

void CDialogExampleView::OnCombodlg()

{

        CComboDlg dlg;

        if(dlg.DoModal() == IDOK)

        {

                AfxMessageBox(dlg.m_strAddress);

        }

}


(5) Spin 컨트롤(그래픽 디자인)





property설정:   Edit컨트롤이 Spin컨트롤 바로 앞에 오게 조정

                [Auto Buddy], [Set Buddy Integer], [Alignment]-[Right]


(5-1) 클래스 생성 멤버변수 추가: CSpinDlg

컨트롤          ID             Value형 멤버변수       Contorl형 멤버변수

Edit            IDC_EDIT1     int m_nAmount

Spin           IDC_SPIN1                             CSpinButtonCtrl m_ctrlSpin


(5-2) 컨트롤 초기화

BOOL CSpinDlg::OnInitDialog()

{

        CDialog::OnInitDialog();

        

        m_ctrlSpin.SetRange(0, 100);

        

        return TRUE;  // return TRUE unless you set the focus to a control

                      // EXCEPTION: OCX Property Pages should return FALSE

}


IDC_EDIT1의 범위도 동일하게 0 - 100으로 제한


(5-3) 대화 상자 출력

#include "SpinDlg.h"

void CDialogExampleView::OnSpindlg()

{

        CSpinDlg dlg;

        if(dlg.DoModal() == IDOK)

        {

                CString str;

                str.Format("주문수량: %d개", dlg.m_nAmount);

                AfxMessageBox(str);

        }

}


(6) Radio 버튼 컨트롤(그래픽 디자인)






step 1: [ctrl-D] 탭 순서 조절을 이용하여 Radio 버튼들을 순서대로 정리

step 2: Radio버튼들을 하나의 선택 집단으로 만들 때 첫 번째 버튼에 “Group“ 속성을 지정

step 3: “Group“ 속성 이 지정된 Radio버튼 컨트롤에 Value형 멤버 변수 연결, 이 변수는 그 범주내에 어떤 Radio버튼이 선택되었는가를 0부터 시작하는 숫자로 출력


(6-1) 클래스 생성 멤버변수 추가: CRadioDlg

ID                     Value형 멤버변수       

IDC_RADIO1           int m_nPayment

IDC_RADIO4           int m_nDelivery


(6-2) 대화 상자 출력

#include "RadioDlg.h"

void CDialogExampleView::OnRadiodlg()

{

        CRadioDlg dlg;

        if(dlg.DoModal() == IDOK)

        {

                CString str;

                str.Format("결재방법: %d\n배송방법: %d", dlg.m_nPayment, dlg.m_nDelivery);

                AfxMessageBox(str);

        }

}


'여러이야기 > IT' 카테고리의 다른 글

스마트 펜  (0) 2015.02.27
스마트 칠판(smart marker)  (0) 2015.02.25
[우분투] 10.04 APM 설치 및 셋팅  (0) 2015.02.23
[우분투] Zend Guard 설치  (0) 2015.02.23
[우분투] Zend Optimizer 설치  (0) 2015.02.23
Posted by TwoTen
l

출처  http://dbckdgns0515.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%AC-1004-APM-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%85%8B%ED%8C%85


웹서버구축 2011/05/06 04:25 1.Apache2 설치

#sudo apt-get install apache2 (입력시 자동설치)

2.mysql 인증 모듈

#sudo apt-get install libapache2-mod-auth-mysql

3.MYSQL

#sudo apt-get install mysql-server mysql-clinet

4.PHP

#sudo apt-get install php5-common php5 libapache2-mod-php5

(PHP 확장모듈 설치방법)

#sudo apt-get install php5-gd

 #sudo apt-get install php5-imap

 #apt-get install dh-make-php php5-imagick php5-dev

 #sudo apt-get install php5-cli

5.MYSQL 연동 모듈

#sudo apt-get install php5-mysql

6.PHPMYADMIN 설치

#sudo apt-get install phpmyadmin (설치시 왠만해선 자동으로 계정셋팅 되는걸로알고있습니다)
https://www.hostple.net/@/board.php?id=tip&articleNo=138&page=2&searchText=





Linux Apache2 PHP5 MySQL5 설치하기


            * Apache 설치
                $sudo apt-get install apache2
            * MySQL 인증
                $sudo apt-get install libapache2-mod-auth-mysql
                 비밀번호 설정 화면이 나오면 설정 후 엔터
            * MySQL 설치
                $sudo apt-get install mysql-server mysql-client
            * PHP5 설치
                $sudo apt-get install php5-common php5 libapache2-mod-php5
            * PHP - MySQL 연동
                $sudo apt-get install php5-mysql
            * PHP - GD 설치
                $sudo apt-get install php5-gd
            
            * 아파치 및 MySQL 재시작
                $sudo /etc/init.d/apache2 restart
                $sudo /etc/init.d/mysql restart

            * 아파치 및 MySQL 설정파일위치
                /etc/apache2/apache2.conf
                /etc/mysql/my.cnf
            
            * 아파치 웹루트 폴더
                /var/www -> 루트권한만이 쓰고 지우고 할수 있습니다.
                가상호스트설정폴더
                /etc/apache2/sites-available/default

    

   $sudo gedit /etc/apache2/sites-available/default

   /var/www/ 라고 써 있는 부분들을 원하는 디렉토리로 변경시켜주세요.

============================

1.처음 부팅 후 root(루트) 패스워드 지정지정

$sudo passwd root
Password:              <- 현재 로그인한 유저의 비밀번호 입력
New Password:          <- root의 새로운 password
Re-Enter Password:   <- root의 새로운 passwordpassword 재입력Linux Apache2 PHP5 MySQL5 설치하기


            * Apache 설치

                $sudo apt-get install apache2

            * MySQL 인증

                $sudo apt-get install libapache2-mod-auth-mysql

                 비밀번호 설정 화면이 나오면 설정 후 엔터

            * MySQL 설치

                $sudo apt-get install mysql-server mysql-client

            * PHP5 설치

                $sudo apt-get install php5-common php5 libapache2-mod-php5

            * PHP - MySQL 연동

                $sudo apt-get install php5-mysql

            * PHP - GD 설치

                $sudo apt-get install php5-gd

            

            * 아파치 및 MySQL 재시작

                $sudo /etc/init.d/apache2 restart

                $sudo /etc/init.d/mysql restart


            * 아파치 및 MySQL 설정파일위치

                /etc/apache2/apache2.conf

                /etc/mysql/my.cnf

            

            * 아파치 웹루트 폴더

                /var/www -> 루트권한만이 쓰고 지우고 할수 있습니다.

                가상호스트설정폴더

                /etc/apache2/sites-available/default

    

   $sudo gedit /etc/apache2/sites-available/default

   /var/www/ 라고 써 있는 부분들을 원하는 디렉토리로 변경시켜주세요.


============================


1.처음 부팅 후 root(루트) 패스워드 지정지정

$sudo passwd root

Password:              <- 현재 로그인한 유저의 비밀번호 입력

New Password:          <- root의 새로운 password

Re-Enter Password:   <- root의 새로운 passwordpassword 재입력

이후 일반 유저에서 root로 가려면

$su -

Password:

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

2. 내부 IP를 따로 사용해야 할 경우

/etc/networking/interfaces의 내용중 comment부분을 아래처럼 치환

# iface eth1 inet dhcpdhcp 

iface eth1 inet static

        address 192.168.32.132192.168.32.132 

        netmask 255.255.255.0

이후 일반 유저에서 root로 가려면
$su -
Password:

----------------------------------------------------------------------------
2. 내부 IP를 따로 사용해야 할 경우

/etc/networking/interfaces의 내용중 comment부분을 아래처럼 치환

# iface eth1 inet dhcpdhcp 
iface eth1 inet static
        address 192.168.32.132192.168.32.132 
        netmask 255.255.255.0
        networknetwork 192.168.32.0
        broadcast 192.168.32.255
         gateway 192.168.32.2

이후 networking 데몬 restart.

$sudo /etc/init.d/networking restartrestart

-----------------------------------------------------------------------------
3.iso 이미지를 마운트하기

*가끔 패키지 설치시에 ubuntu-serverubuntu-server CD를 요구하는 경우가 있을때 유용하다

$sudo mount -t iso9660 -o-o loop myimage.iso /cdrom

----------------------------------------------------------------------------
4.FTP Server 설치

$sudo apt-get install vsftpd
ftp 설정파일 위치 -> /etc/vsftpd.conf

보안을보안을 위해 vsftpd.conf를 수정
$sudo vi /etc/vsftpd.conf

::수정할 부분::
anonymous_enable=NO //기본값이//기본값이 YES 이므로 NO로 변경
local_enable=YES //주석 제거
write_enable=YES //주석 제거

vsftp데몬 재시작
$sudo /etc/init.d/vsftpd restart

-----------------------------------------------------------------------------
5.APM 설치

$sudo apt-get install mysql-common
$sudo apt-get install mysql-server
$sudo apt-getapt-get install apache2
$sudo apt-get install php5
$sudo apt-get install php5-mysql

Apache2 설정파일 위치
/etc/apache2/apache2.conf <-기본 설정 파일
/etc/apache2/ 하위에 보면 각종 설정파일이 분리되어 있습니다.

Apache2 데몬 재시작 명령어
$sudo apache2ctl restartrestart

-----------------------------------------------------------------------------
6.SSH(secure shell) 설치

$sudo apt-get installinstall ssh

보안을 위해 /etc/ssh/sshd_config에서
PermitRootLogin 항목을 yes(default)에서 no로 바꿔준다

----------------------------------------------------------------------------
7.webmin 설치

webmin은 apt-get에 포함되어 있지 않으므로 따로 받아 설치한다.

$wget http://belnet.dl.sourceforge.net/sourceforge/webadmin/webmin_1.290.deb
$sudo dpkg -i webmin_1.290.debwebmin_1.290.deb

http://servername:10000


%080317추가 안될경우 홈페이지 참고: http://www.webmin.com/deb.html
-----------------------------------------------------------------------------
8. 설치 후 관리

$sudo apt-get upgrade //기존//기존 패키지 Upgrade
$sudo apt-get update //새로운 패키지 정보 Update

-----------------------------------------------------------------------------
ab : Apache HTTP Server Benchmarking tools

-----------------------------------------------------------------------------
9. 아파치 포트 변경

/etc/apache2/httpd.conf에서
Listen 80을 원하는 포트로 변경

-----------------------------------------------------------------------------
10. 아파치 VirtualHost 설정

/etc/apache2/httpd.conf에서

<VirtualHost *>*> 
ServerName my.domain.com
ServerAdmin me@my.domain.com
DocumentRoot /home/www/
#특정 directory에만 옵션을 줄 때. (textcube를 위해 추가한 항목)
        <Directory "/home/www/tc">
                 Options FollowSymLinks
                 AllowOverride FileInfo
         </Directory>
</VirtualHost>

-----------------------------------------------------------------------------
11.Putty 에서 한글 사용

Window > Appearance > Font settings에서 굴림체로 변경
Window > TranslationTranslation > Character set translaton on received data에서 UTF-8로 변경

$export$export LANG=ko_KR.UTF-8

-----------------------------------------------------------------------------
12. 색상이 나오지 않을 때 및 alias 고정 지정 방법

홈디렉토리의 .profile을 수정

# ~/.profile: executed by Bourne-compatibleBourne-compatible login shells.

if [ "$BASH" ]; then
    ifif [ -f ~/.bashrc ]; then
        . ~/.bashrc~/.bashrc 
    fi
fi

mesg n

#alias 를 고정으로 지정하기
alias ll="ls -l"

-----------------------------------------------------------------------------
13.midnight commander (mc)설치방법

ubuntu universe 패키지에만 포함되어 있으므로 /etc/apt/source.list를 수정한다

끝에 universe를universe를 추가해 준다.

deb http://kr.archive.ubuntu.com/ubuntu/ dapper main restricted universe
deb-srcdeb-src http://kr.archive.ubuntu.com/ubuntu/ dapper main restricted universe

패키지리스트 업데이트 후 설치설치 
$sudo apt-get update; apt-get install mc

-----------------------------------------------------------------------------
14. 원하는 패키지(꾸러미) 찾는 방법

$apt-cache search pkgname

-----------------------------------------------------------------------------
15.ACPI 로 강제 설정방법. (자동 전원꺼짐이 되지 않을 때)

/boot/grub/menu.lst 중 acpi=force를 추가

title            Ubuntu, kernel 2.6.15-26-server
root            (hd0,0)
kernelkernel          /vmlinuz-2.6.15-26-server root=/dev/hda2 ro quiet splash acpi=forceacpi=force 
initrd          /initrd.img-2.6.15-26-server
savedefault
boot

-----------------------------------------------------------------------------
16.Samba 설치

$sudo apt-get install samba

-----------------------------------------------------------------------------
samba 에서 euc-kr을 사용하여야 할 때

/etc/samba/smb.conf에서 아래 항목을 추가한다.

unix charset = euc-kr

-----------------------------------------------------------------------------
17.convmv 로 EUC-KREUC-KR 파일명을 UTF-8로 변환하기

apt-get install convmv
convmv --notest -f-f euc-kr -t utf-8 -r <directory>


http://gobut.com/bbs/board.php?bo_table=z4_5&wr_id=61


==============================================


출처 : http://sarghis.com/blog/680/



웹서버를 구축할 때 가장 많이 쓰는 조합이 Apache, Php, Mysql이다. 이것의 앞글자를 따서 APM이라고 부른다.

리눅스에서 APM을 구축하는 것은 명령어만 몇줄 치면 끝나기 떄문에 윈도우즈에서 구축하는 것에 비해 훨씬 간단하다.

이 글은 우분투 12.10기반에서 Apache2, Php5, Mysql5를 설치하는 방법을 제시한다.

 

* 설치하기

 

1. Apache2

1
$ sudo apt-get install apache2

 

2. Mysql5

Mysql server와 서버에 접속하기 위한 client를 설치한다.

1
$ sudo apt-get install mysql-server mysql-client

 

설치 과정에서 mysql 비밀번호 설정창이 나타난다.

이때 설정한 비밀번호는 MySQL root 계정의 비밀번호이니, 꼭 기억하도록 한다.

 

3. PHP5

1
$ sudo apt-get install php5 php5-common

 

4. Apache와 PHP 연동

1
$ sudo apt-get install libapache2-mod-php5

 

5. PHP와 Mysql 연동

1
$ sudo apt-get install php5-mysql

 

 

* 구축 테스트

 

6. apache와 mysql을 재시작 해준다.

1
2
3
$ sudo /etc/init.d/apache2 restart
 
$ sudo /etc/init.d/mysql restart

 

7. apache 서버와 mysql 서버가 정상적으로 작동하고 있는지 확인한다.

1
2
3
$ sudo netstat -atp | grep apache2
 
$ sudo netstat -atp | grep mysqld

 

8. php와 apache의 연동을 확인한다.

위의 가이드대로 따라했다면 웹호스트의 루트 디렉토리는 /var/www 가 된다.

/var/www 에 php.php 를 만들고, 아래와 같은 내용을 적은 후, 저장해준다.


phpinfo.php라고 파일을 만들었더니 브라우져에서 읽지를 못한다.

php.php라고 변경을 하니 아래와 같이 나왔다...


1
$ sudo gedit /var/www/php.php
1
2
3
4
5
<?
 
phpinfo();
 
?>

 

9. 웹브라우저에서 웹서버의 동작을 확인해본다.

웹브라우저를 켠 후,

http://localhost/phpinfo.php

에 접속해본다. 아래와 같은 화면이 뜬다면 웹서버가 정상적으로 구축된 것이다.

 

10. 기타 개인 설정

기본 설정을 개인적으로 바꾸고 싶다면 다음 파일들을 수정하면 된다.

apache : /etc/apache2/apache2.conf

mysql : /etc/mysql/my.cnf

'여러이야기 > IT' 카테고리의 다른 글

스마트 칠판(smart marker)  (0) 2015.02.25
[C/C++] GDI 를 이용한 그래픽  (3) 2015.02.24
[우분투] Zend Guard 설치  (0) 2015.02.23
[우분투] Zend Optimizer 설치  (0) 2015.02.23
[우분투] 9.04에 테크노트 설치하기  (0) 2015.02.23
Posted by TwoTen
l

Zend Guard 란? php파일을 컴파일 및 인코딩하여 php 응용 프로그램 실행을 향상시켜주는 툴이므로 APM 으로 웹서버를 운영한다면 설치를 적극 권장합니다. php 5.2 버전까지는 Zend Optimizer 였지만 php 5.3버전 이후 부터는 Zend Guard로써 지원합니다.


1. 설치준비. 자신의 시스템 및 php 버전을 확인합니다.


우분투 12.04, php 5.3 으로 진행을 하였고 Zend Guard 5.5.0을 설치합니다. php 5.4 에서는 Zend Guard 6.0.0을 설치하시길 바랍니다.

php 버전 확인

2. Zend Guard 다운로드

우분투 32bit 다운로드

우분투 64bit 다운로드

3. UnTar

다운로드 받은 파일을 UnTar 합니다.

4. Zend Guard 모듈 복사

Zend Guard 모듈을 특정 폴더(php 모듈 폴더)로 복사합니다.

5. zend.ini 파일 생성 및 명시

zend.ini을 만들고 다음 내용을 저장합니다.

6. Apache 재실행

7. Zend Guard 기능 테스트

Zend  Guard

phpinfo() 결과

Zend  Guard



출처 : http://www.frogless.net/우분투-zend-guard-설치/

'여러이야기 > IT' 카테고리의 다른 글

[C/C++] GDI 를 이용한 그래픽  (3) 2015.02.24
[우분투] 10.04 APM 설치 및 셋팅  (0) 2015.02.23
[우분투] Zend Optimizer 설치  (0) 2015.02.23
[우분투] 9.04에 테크노트 설치하기  (0) 2015.02.23
[우분투] HDD 장착  (0) 2015.02.17
Posted by TwoTen
l

Ubuntu Zend optimizer 설치

http://biyott.tistory.com/30
http://empc.kr/668473
여기서 퍼왔습니다

# 설치를 하려면 root 계정이 필요하다.
sudo -i

# 일단 업데이트 부터 하자.
apt-get upgrade

# 서버니까 sshd 정도는 도는게 좋겠지.
apt-get install openssh-server

# php 를 설치해 보자. 보다시피 모듈명 같은게 좀 생소한데,
# apt-get install apache.*php 이런식으로 하면 대충 설치할 것을 골라준다.
# aptitude 를 실행하고 / 를 누르면 좀더 편하게 찾을 수 있다.
# 설치 자체는 apt-get 이 좋은것 같다.

apt-get install libapache2-mod-php5
apt-get install php5-cli
apt-get install php5-gd
apt-get install mysql-server
apt-get install php5-mysql

# apt-get install php5-.* 해서 나온 목록을 보니
# php5-ffmpeg, php5-imagick 이 보인다. 역시 Ubuntu는 최첨단을 달린다.
# ffmpeg 모듈은 동영상을 열어서 gd 그림으로 추출할 수만 있다.
# imagick 모듈은 이미지매직을 이용할 수 있다. Animated GIF 도 제어가 되는 것이다.
# 포토샵 부럽지 않은 이미지종류와, 필터를 제공한다.


# 아쉽게도 ZendOptimizer 는 목록에 없다. Gentoo는 있는데~
wget http://bace.pe.kr/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
tar zxvf ZendOptimizer-3.3.9-linux.glibc23-i386.tar.gz
cd ZendOptimizer-3.3.9-linux-glibc23-x86_64/data/5_2_x_comp
chmod 644 ZendOptimizer.so

# 모듈 넣을곳을 알아본다.
php -i | grep extension_dir
extension_dir => /usr/lib/php5/20060613+lfs

mv ZendOptimizer.so /usr/lib/php5/20060613+lfs

# php 에 모듈설정을 한다.
vi /etc/php5/conf.d/ZendOptimizer.ini
zend_extension=/usr/lib/php5/20060613+lfs/ZendOptimizer.so
zend_optimizer.optimization_level=15
zend_optimizer.enable_loader=1
zend_optimizer.disable_licensing=0
:wq

# ZendOptimizer 에 있는 install 스크립트를 이용하면 ZendExtensionManager 라는것이 설치되는데,
# php 버전에 따라 Optimizer 를 알아서 올려주는 기능 등 쓸데없으므로 버전에 맞는 so 만 깔끔하게 설치하였다.

php -v
PHP 5.2.4-2ubuntu5.3 with Suhosin-Patch 0.9.6.2 (cli) (built: Jul 23 2008 06:46:18)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with Zend Optimizer v3.3.9, Copyright (c) 1998-2007, by Zend Technologies


# 이제 대충 설정파일을 살펴보자.
# /etc/php5/conf.d 는 모듈의 ini 를 넣는 곳이다. 모듈 넣었다 뺐다 하는건 php.ini 를 수정할 필요가 없다는 얘기다.
# /etc/php5/apache2/php.ini /etc/php5/cli/php.ini 는 아파치용과 쉘용을 따로 설정할 수 있도록 해 놓은것이다.
# 아파치용은 아파치 프로세스 만큼 떠야 하므로 메모리 한계를 적게 준다거나,
# 쉘용에만 allow_url_fopen 을 On 한다거나 소켓의 timeout 을 길게 주거나 하는 식으로 이용하면 편리하다.
# 그리고 php.ini 에서 register_global = off, magic_quote_gpc = off, error_reporting = E_ALL,
# short_open_tag = off, register_long_arrays = off 로 놓고 작업하면 보안상 좋고,
# php 버전 업데이트에도 문법변화에 대응하기 좋을것이다.

# /etc/apache2/apache2.conf 아파치 기본 설정 파일이다. 대충 보니까
# /etc/apache2/mods-available 에 모듈설정들이 들어있고,
# /etc/apache2/mods-enabled 에 실제 적용할것만 소프트링크를 걸어놓았다.
# 버철호스트도 마찬가지로 sites-available, sites-enabled 로 되어 있다.
# 쓸데없는 cgi 같은건 지우면 좋다.
# 지우더라도 mods-enabled 의 링크만 지우는 것이므로 언제든 ln -s 로 복구할 수 있다.
# expire 옵션이나 deflate 옵션 등 설정해 두면 좋은 팁이 팁텍에 있으니 참조해 보기 바란다.

# /etc/mysql/conf.d/old_passwords.cnf
# 나는 이거 싫다. 회원의 패스워드는 php 의 crypt() 를 이용하자.
# 버전마다 함수가 달라지는 MySQL 의 PASSWORD() 를 사용하기 위해 old_password 를 이용한다는건 보안상 안좋다.
# 보안이 미흡하니 함수를 고치는것 아니겠나!
# 그러니 저 파일은 지워버리자
# my.cnf 는 거의 기본 그대로인듯 하다.


# 이쯤 적으면 실전 적용하는데 그다지 부족하지 않아보인다.
# Gentoo 유저라서 Ubuntu 를 더이상 만지지는 않을 계획이다.
# apt-get install 패키지명정규식으로 대충 적으면 알아서 찾아서 나오는것과,
# aptitude 라는 CUI 환경 두가지만 기억하면 Ubuntu 는 상당히 쾌적한 환경이 될듯 하다.
# 끝. 
출처 - 위 자료는 http://empc.kr 황제커뮤니티 자료입니다.


'여러이야기 > IT' 카테고리의 다른 글

[우분투] 10.04 APM 설치 및 셋팅  (0) 2015.02.23
[우분투] Zend Guard 설치  (0) 2015.02.23
[우분투] 9.04에 테크노트 설치하기  (0) 2015.02.23
[우분투] HDD 장착  (0) 2015.02.17
[우분투] 10.04 Samba 설치 와 설정  (0) 2015.02.15
Posted by TwoTen
l