[답변][까막] 썸네일 1차 완성판이 나왔습니다.. *^^* 2001-02-12 오후 12:41:58
권진호 (crowback )  권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 번호: 4418   / 평점:  (-)  
안냐세염.. 까막임돠..

1차 완성판이 나왔습니다. 지적해주신 문제도 조금 수정하구여..

탐색트리, 썸네일, 이미지뷰어 모두 일단 올렸구여..
특별한 동작상의 문제는 없습니다.

속도 문제를 위하여. 쓰레드나 메시지 펌핑은 하지 않았습니다.

이미지 한 100개정도를 읽어 들이는데 걸리는 시간은 시스템에 따라 다르겠지만
ACDSee보다는 쫌 빠르군여.. --;
(당근 지원하는 포멧이 간단한거만 하니까 -_-;)

추가된 기능은 이미지뷰어를 넣었다는 것이구여..
(역시 무지 심플안 이미지뷰어...)

썸네일에 대한 파일정보 툴팁을 넣어봤습니다.

그럼 이만..


아래 요청 사항이 있으셔서, 6.0과 2008로 컴파일 되도록 급수정 하였습니다.
전체 소스는 달라진건 없고, 6.0에만 있는 기능이 있어서, 공용으로 쓰이도록 수정하였습니다.

 [까막] 고속 추가 전용 - 리스트 컨트롤   | VC++ 컨트롤관련 2002-08-07 오전 11:57:17
까막 (crowback)  까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 번호: 12923   / 평점:  (-)  / 읽음:2,929
MFC Virtual List Control -  Andrew Small by codeguru site;
먼저 여기 사용된 부분은 코드구루의 앤드류 스몰의 자료를 수정한 것입니다.
앤드류의 소스는 CLabelItem 클래스를 사용자가 직접 수정하거나, 데이터를 삽입할 때마가 불필요한 코딩이
필요하고, 또한 데이터를 한꺼번에 삽입하는것만 가능하도록 설계되어 있어 불편한 점이 조금 있습니다.

위의 소스를 수정하여.. Insert 없이 Add 전용의 고속 리스트 컨트롤을 만들어 보았습니다.
이러한 리스트는 수시로 없데이트 되는 데이터가 아닌, 로그 값이나 특정 수치값을 계속적으로 쌓아 놓는
구조에 알맞습니다.
만약 인터넷 트레픽을 수치상으로 시간과 장소, 대역폭, 사용데이트 등을...
시간대별로 계속 쌓아서 감시를 한다던가.. 하는 것.. 혹은...

여러군대에서 발생한 자료를 시간대 별로 한꺼번에 몰아서 데이터를 읽어 와 리스트에 쌓는다던가 하는
작업에 맞게 구성되었습니다.

원래의 InsertItem() 를 막고, AddItem() 함수로 대치하였습니다.
SetItemText() 함수와 GetItemText() 함수는 그대로 적용됩니다.
DeleteItem()는 삭제되었고,
DeleteAllItems() 함수도 그대로 적용됩니다.

테스트 결과 3개의 컬럼이고, 각각 10여바이트 정도의 문자열을 텍스트를 갖는경우.
약 20000 개 정도의 데이터를 삽입하는데 걸리는 시간은 P3 933, RAM 256, Release Mode에서
삽입과 화면 업데이트까지 약 0.7초 정도 걸립니다.

각각 컬럼별로 헤더에서 오름차순 정렬 혹은 내림차순 정열은 각각 0.2-0.3초 정도 소요됩니다.

물론 레포트 타입 전용입니다.
이미지 리스트도 지원하지 않습니다.

그럼 이만..

 [까막] 코딩으로 휴지통 복구하기..  | ActiveX/COM 2003-11-04 오후 6:16:46
까막 (crowback)  까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 번호: 16893   / 평점:  (-)  / 읽음:1,749

질문에 답변 하나 달으려다 엄청난 시간이 날라갔네요. 조만간에 모가지가 될지도 ㅡㅜ;


휴지통에 보내기는 많이 보내봤는데.. 휴지통에 있는 넘을 복구하는 방법은 Undocumented라.. MSDN을

찾아봐도 껀덕지 나오는게 없더군요..


결국 쉘폴더를 불러서, 아이템을 얻고, 해당 아이템의 숏컷 핸들러를 얻은다음 Invoke 해주는

방법을 취했습니다.


동작은 잘되더군요..


1. 휴지통의 IShellFolder2 인터페이스를 얻어 온다.

2. IShellFolder2::EnumObjects() 를 이용하여 IEnumIDList 값을 긁어 들인다.

3. IEnumIDList::Next() 메서드를 이용하여, 개별적인 ITEMIDLIST 값들을 하나씩 읽어 온다.

4. 각각 읽어 온넘들을 pidl 이라 치면, 해당하는 IContextMenu 인터페이스를 얻는다.

5. IContextMenu::QueryContextMenu, IContextMenu::GetCommandString, IContextMenu::InvokeCommand

   메서드들을 적당한 인자를 주어 호출하여, 선택된 아이템을 복구한다.


대략 위와 같은 구조로 동작하구요..

 

참고 사항으로

 

휴지통에 떤지기 : SHFileOperation

휴지통을 비우기 : SHEmptyRecycleBin

휴지통에 들은 파일 갯수와 크기 얻기 : SHQueryRecycleBin

 

이런 함수들이 있습니다.


MSDN에서 참고 하실만한 페이지에는

1. Managing the File System

    SHFileOperation 함수를 사용하는 응용예가 가장 자세히, 그리고 Notify와 Recent 연동까지.. 잘 나와있습니다.

2. Shell Functions

    일반적으로 다루는 쉘함수들의 리스트가 쭉 나와 있구요, 평소에 접하지 못하는 혹은 필요한데 못찾던것들 까지

    잘 구분되어 있습니다.


그럼 즐거운 한주 되세요...


이 글에 평점 주기:  
[코멘트]  2003-11-17 17:42:00
조갑열 (cgl777)   조갑열님께 메시지 보내기조갑열님을 내 주소록에 추가합니다.조갑열님의 개인게시판 가기 
ecycleBinDlg.cpp
F:\download\휴지통 복구\RecycleBinDlg.cpp(9) : fatal error C1083: Cannot open include file: 'ShObjIdl.h': No such file or directory
Generating Code...
Error executing cl.exe.
Creating browse info file...
BSCMAKE: error BK1506 : cannot open file '.\Debug\RecycleBinDlg.sbr': No such file or directory
Error executing bscmake.exe.

RecycleBin.exe - 2 error(s), 0 warning(s)
이 에러는 뭘까요..ㅠ.ㅠ?
 
[코멘트]  2003-11-17 19:50:00
까막 (crowback)   까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 
ShObjIdl.h' 파일을 찾을 수 없다는 에러 메시지네요..
위의 헤더 파일을 사용하시려면 Platform SDK를 설치하셔야 합니다.
 [까막] LCD 시뮬레이터.  | VC++ 일반 2003-11-08 오후 1:00:04
까막 (crowback)  까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 번호: 16921   / 평점:  (-)  / 읽음:3,318

안냐세욤.. 까막임돠..


장비에 LCD를 달아야 하는데.. LCD선정하고.. PCB뜨고, 한글 처리하고.. 장비하고 인터페이스 테스트까지..

대략 한달정도의 시간이 걸린다더군요..


그래서 놀고 먹을수가없어서.. LCD 시뮬레이터를 간략하게 만들어 봤습니다.


1. FONT는 옛날 도스시절의 '이야기'에서 사용되던 2번재 폰트를 떠다 썼구요.

2. 일반 키입력되는 완성형 한글을 자료실 173번 자료를 참고해서 조합형으로 만들었습니다.

3. 지원되는 함수는.. 픽쎌에 쓰기, 지우기, 인버트... 문자열 (영문 한글 조합 가능)쓰기, 선그리기, 원그리기

    등등이 지원됩니다.

    선그리기는 DDA 알고리즘을 이용했구요, 원그리기는 브레젠헴(?) 알고리즘을 이용했습니다.



매트릭스 : 화면상의 도트를 나나내는 부분입니다.

               너비와 높이는 다 아실꺼구 간격은 한픽셀을 화면상에서 얼마나 크게 보여주는가 하는 겁니다.

               이 값을 변경하면, 점을 아주 크게(10까지 한계) 부터 1픽셀까지 변경 가능합니다.

문자열입력 : 말 그대로 X,Y 좌표를 입력한 후 문자열을 넣으면 출력되겠죠.

선그리기 : 두개의 점 좌표를 이용하여 직선을 그려줍니다. (물론 안티얼리어싱은 지원 않합니다.)

               흑백모드 LCD를 기준으로 설계했기 땜시, 4Gray정도라면 안티얼리어싱도 해볼만 하겠죠.

원그리기 : 한점.. 중심점과 반지름을 입력하고 원을 그립니다.


GDI 부분만 빼면 거진다.. C++인데.. 이것도 C로 포팅하는데 전혀 문제가 없을꺼라 생각합니다.

소스를 조금 수정하면.. 한글폰트를 탑재하지 않은 그래픽 LCD라고 하더라도 위 소스만 가지고..

간단한 GDI루틴을 다 만들수 있다는 거죠..


아.. 물론, LCD에 도트를 출력하는 루틴은 당연히.. 직접 I/O루틴을 작성해야 하지만..

그 루틴으로 토트를 출력하는.. 쩜찍는 루틴만 있으면 그 위에 만들어진 루틴을 부치기만 하면 됩니다.


참고로, LCD는 1바이트단위로 데이터를( 흑백 기준) 처리하므로, 한꺼번에 8비트가 찍히니까..

그것도 세로로.. 그건만 잘 고려하시면..  ^^;


즐거운 주말 되세요..

이 글에 평점 주기:  
[코멘트]  2003-11-11 00:07:00
조용길 (mutter21)   조용길님께 메시지 보내기조용길님을 내 주소록에 추가합니다.조용길님의 개인게시판 가기 
*^^* 이것보다는 비트맵 변환 프로그램을 짜두시면 더 도움이 되실듯..
 
[코멘트]  2003-11-11 09:53:00
까막 (crowback)   까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 
@.@ 비트맵 변환이야 어렵지 않을듯한데, 어떤 의미로 도움이 된다는 것인지? ^^;
좀더 유용한 시뮬레이터를 만들수 있도록 도움에 손길을... ^^;
 
[코멘트]  2003-11-11 11:47:00
안상훈 (goskd)   안상훈님께 메시지 보내기안상훈님을 내 주소록에 추가합니다.안상훈님의 개인게시판 가기 
호곡... 감사합니다. 안그래도 MMI 작업 새로 해야되는데... ^___________^
 
[코멘트]  2003-11-11 12:44:00
조용길 (mutter21)   조용길님께 메시지 보내기조용길님을 내 주소록에 추가합니다.조용길님의 개인게시판 가기 
혹시 모든 한글을 다 지원해야 하는 기기인지요..^^ 그렇지 않다면 굳이 모든 폰트를 다 다운로드 받아서 쓰실 필요는 없지 않을까요.. 그래서 비트맵을 LCD로 출력할 포맷으로 변환하여 바로 다운로드 받아 적용할 수 있는 걸 만들어두시면 도움이 되겠지요.
 
[코멘트]  2003-11-11 13:58:00
까막 (crowback)   까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 
@.@ 불행하게도 완성형 전체는 아니더라도 조합형 한글은 거의 모든 한글이 사용된답니다.
위에것이 실제로 LCD제어부에 들어가는 것은 아니고.. - 그건 전문가가 따로 하니까 -
그냥 흉내만 내서 시뮬레이션하고, 동작 테스트를 한다음 실제로 필요한 Key갯수와 메뉴나 한글 출력에 필요한 LCD 토트 크기등도 정해야 하거든요..
좀더 크기가 작은 한글 출력 로직은 없을까요???
[까막] XP 드롭다운 메뉴...  | VC++ 일반 2003-11-26 오후 6:10:11
까막 (crowback)  까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 번호: 16976   / 평점:  (-)  / 읽음:2,327

안냐세염.. 까막임돠..


윈도 XP에서 보면.. 제어판이나 머 그런거 보면.. 왼짝에 이쁘게 나오는 메뉴 있잖습니까?

걸 98이나, 2000 에서도 쉽게 써볼라구 만들어 봤습니다.



아주 단순하게 만드느라.. 복잡한 기능은 없구요..

용법도 아주 간단합니다.


참.. 현재 버전에는 드롭다운된 메뉴가 화면을 넘어가면.. 스크롤바가 생기지 않습니다.

코드도 참고, 및 주석 하나도 없구요..


빠르게 만드느라.. C++ 의 class를 거의 구조체 수준으로 썼지만, 그냥 이해해 주십시오..


PS. 배경의 컬러풀한 화면읜 코드구루의 CButtonST 클래스의 Shade 코드를 가져다 썼습니다.

      아마 메탈인가.. 하는 옵션으로 그린거구요.. 배경을 제외한 나머지는 저의 노가다 산물입니다.

      거기의 CxDib 클래스를 임으로. CXPDib라는 클래스로 변경하고, 조금 코드 수정했습니다.


그럼.. 즐건 하루 되세요..

이 글에 평점 주기:  
[코멘트]  2003-11-27 00:25:00
박성규 (icoddy)   박성규님께 메시지 보내기박성규님을 내 주소록에 추가합니다.박성규님의 개인게시판 가기 
아공~ 이뿌넹~~~
 
[코멘트]  2003-11-27 09:55:00
조용길 (mutter21)   조용길님께 메시지 보내기조용길님을 내 주소록에 추가합니다.조용길님의 개인게시판 가기 
전설의 asdf -_-;;;;
 
[코멘트]  2003-11-27 16:29:00
까막 (crowback)   까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 
asdf -0-??? asdf가 먼뜻이죠 ㅡㅜ...
 
[코멘트]  2003-11-27 17:00:00
(codemage)   ㅤ님께 메시지 보내기ㅤ님을 내 주소록에 추가합니다.ㅤ님의 개인게시판 가기 
자매품 qwer도 있어여 -_-;
 
[코멘트]  2003-11-27 18:53:00
까막 (crowback)   까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 
ㅎㅎ 귀차니즘의 발로임돠.. 제가 필요해서 맹근게 아니구..
누가 맹글어 달라구 해서.. 맹근거인디.. 아이템 인서트 하는게 여간 귀차나서리 ㅡㅜ;;;
 
[코멘트] 좋음 2004-03-27 21:47:00
김정진 (objects)   김정진님께 메시지 보내기김정진님을 내 주소록에 추가합니다.김정진님의 개인게시판 가기 
리플들 웃기당..ㅋㅋㅋ
 
[코멘트] 좋음 2004-09-20 16:27:00
상추쌈장 (papilion)   상추쌈장님께 메시지 보내기상추쌈장님을 내 주소록에 추가합니다.상추쌈장님의 개인게시판 가기 
정말 이쁘군여.. 잘 응용해서 쓰겠습니당 ^^
 음력 <-> 양력 변환 소스  | VC++ 일반 2004-12-21 오후 5:31:03
권진호 (crowback)  권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 번호: 18355   / 평점:  (-)  / 읽음:5,070

안냐세욤.. 까막임다..


음력 양력을 상호 변환하는 것이 생각보다 쉽지 않다는건 해보신 분들은 아실겁니다.

저도 쉽게 생각하고 부디쳤다가 고생좀 했죠..


원래의 C소스는 어디선가 긁어 왔는데.. 너무 오래되서.. 까먹었구요.

혹시나 원저자분이 이 소스를 보신다면 글을 올리시거나 메일 부탁드려요.

그럼 제가 출처를 밝히겠습니다.


사용법은 함수 딸랑 두개이니 어렵지 않게 사용하실 수 있을겁니다.

결과는 구조체를 보시고, 트레이스 해보시면.. 각각의 필드에 필요한 거의 대부분의 정보가

채워저 있을겁니다.


원소스를 좀 많이 수정해서, 띠, 단기, 요일, 음력, 윤달 여부, 연도의 육갑자 표기, 날의 육갑자 표기 한글/한문

모든 정보가 표기됩니다.


아래는 헤더파일이구요..


소스와 헤더 파일을 올리겠습니다.


// SolarLunarConverter.h

//

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


#if !defined(AFX_LUNARSOLAR_H__9D30E40F_148A_4CF3_995B_99E559ECA7B9__INCLUDED_)

#define AFX_LUNARSOLAR_H__9D30E40F_148A_4CF3_995B_99E559ECA7B9__INCLUDED_


#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000


#pragma pack(push, 1)


typedef struct _lunar_info

{

    unsigned short  year_lunar;     // 음력 변환후 년도 (양력과 다를 수 있음)

    unsigned short  year_dangi;     // 당해년도 단기

    unsigned char   month;          // 음력 변환후 달

    unsigned char   day;            // 음력 변환후 일

    unsigned char   dayofweek;      // 주중 요일을 숫자로 ( 0:일, 1:월 ... 6:토)

    bool            isyoondal;      // 윤달 여부 0:평달/1:윤달

    char            h_year[5];      // 당해 년도 갑자표기 (한글)

    char            h_day1[3];      // 요일 (한글)

    char            h_day2[5];      // 당일 갑자표기 (한글)

    char            h_ddi[7];       // 당해 년도 띠 표기 (한글)

    char            c_year[5];      // 당해 년도 갑자표기 (한자)

    char            c_day1[3];      // 요일 (한자)

    char            c_day2[5];      // 당일 갑자표기 (한자)

} lunar_t;



typedef struct _solar_info

{

    unsigned short  year;           // 양력 변환후 년도 (음력과 다를 수 있음)

    unsigned char   month;          // 양력 변환후 달

    unsigned char   day;            // 양력 변환후 일

    unsigned char   dayofweek;      // 주중 요일을 숫자로 ( 0:일, 1:월 ... 6:토)

} solar_t;



// 이 음력 계산은 1841 ~ 2043 년도 범위에서 정확도를 제공합니다.

// 만약 정확한지 검사해보고 싶다면 다음 사이트에서 비교해 보시오.

// http://www.koreamanse.com/hotservice/yangumch/yangumch.html?mode=2

BOOL SolarToLunar(int Year, int Month, int Day, lunar_t& lunar);


BOOL LunarToSolar(int Year, int Month, int Day, BOOL Leaf, solar_t& solar);



#pragma pack(pop)


#endif // !defined(AFX_LUNARSOLAR_H__9D30E40F_148A_4CF3_995B_99E559ECA7B9__INCLUDED_)


이 글에 평점 주기:  
[코멘트] 좋음 2004-12-21 17:32:00
권진호 (crowback)   권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 
아..참고로 정확도는 1841 ~ 2043 사이에서만 지원됩니다.
 
[코멘트] 놀람 2004-12-22 11:13:00
안졸리냐졸려 (taehwanshi)   안졸리냐졸려님께 메시지 보내기안졸리냐졸려님을 내 주소록에 추가합니다.안졸리냐졸려님의 개인게시판 가기 
음력 계산이 조금 틀리네요. 2004-12-02를 샘플로 해 보세요.
 
[코멘트] 슬픔 2004-12-22 14:06:00
권진호 (crowback)   권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 
헛.. 믿을만한 자료라 가져다 쓰면서 의심을 안했는데.. 배열값이 몇개 틀려있군요.
수정했습니다. 혹시나 해서 http://www.kordic.re.kr/manse/ 의 한국 표준 연력에서...
2004년부터 2010년까지 수동으로 비교해 봤으나 괜찬더군요.. 지송함다.
 
[코멘트] 최고 2004-12-23 09:24:00
안졸리냐졸려 (taehwanshi)   안졸리냐졸려님께 메시지 보내기안졸리냐졸려님을 내 주소록에 추가합니다.안졸리냐졸려님의 개인게시판 가기 
그래도 조금 틀린거 같네요. 2006년 1월 29일이 음력으로 2006년 1월 1일인데
2005년 12월 30일로 나와요. 자꾸 딴지 거는거 같아서 죄송하네요.
 
[코멘트] 좋음 2004-12-23 10:28:00
권진호 (crowback)   권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 
졸려님께서 일케 검수까지 해주시니. 감사함다.. 졸려님의 성원에 힘입어 2000년 2010년까지 매월 음력말일과 초일을 비교하여 하나씩 검사해서 완료했습니다.
2011년부터 2043년까지는 쪼끔씩 비교해서 다 올릴께요.. 잘 꼬집으시네요.. 아얏~~
여기에 완료라는 코멘트가 부트면.. 그 대 제 업로드 하겠습니다.
 
[코멘트] 좋음 2004-12-27 10:53:00
권진호 (crowback)   권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 
2035년까지 음력및 윤달에 대한 검증을 해보았습니다. 비교는 한국표준연력 사이트를 대상으로 하였습니다. 생각보다 시간이 더 많이 걸리는 군요.
정확하게 비교한 부분은 1980년부터 2035년까지 입니다. 여기까지 업로드 해놓겠습니다.
2035년부터 2043년까지 부분도 필요하신 분은 좀더 기다려주시길..
 
[코멘트] 난감 2004-12-27 10:57:00
권진호 (crowback)   권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 
좀 제대로된 음력 및 윤달 계산 자료나 소스가 있으신 분은 좀 올려주세욤..
지금까지 한국표준연력 사이트를 제외하곤 거의 제대로된 음력<->양력 변환 자료를 볼 수가 없군요.. 대부분이 이상쿤.. -_-? 지금껏 어케 써왔지?
 
[코멘트] 좋음 2004-12-27 17:02:00
류석민 (pokev25)   류석민님께 메시지 보내기류석민님을 내 주소록에 추가합니다.류석민님의 개인게시판 가기 
그래서 얼마전에 핸폰 음력도 틀리다고 뉴스에도 나왔어요.

대표적인 날짜가 2004년 11월 12일, 음력 10월1일이어야 합니다.
 
[코멘트] 좋음 2004-12-27 18:54:00
권진호 (crowback)   권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 
그래서 노가다로 틈틈히.. 2035년까지 마춰봤습니다. 음력월말 과 월초.. 2가지 일자만 비교하는 형식으로요.. 혹시나 그럴일은 없겠지만.. 않맞는 날짜 찾아주시면..
빠르게 수정해 놓겠습니다.
 
[코멘트] 부끄럼 2004-12-29 10:21:00
래디박 (jinundeyo)   래디박님께 메시지 보내기래디박님을 내 주소록에 추가합니다.래디박님의 개인게시판 가기 
전 욘사마 핸드폰 쓰는데 2004년 11월 12일이 음력 10월 1일이라고 정상적으로 나오는군요..
 24절기를 달력에 표시해보자.  | VC++ 일반 2004-12-21 오후 5:42:40
권진호 (crowback)  권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 번호: 18356   / 평점:  (-)  / 읽음:4,129

안냐세욤.. 까막임다..


자꾸 날짜에 관한 소스를 올리는데, 집사람이 가계부 프로그램을 만들어 달라구 해서.. ^^;

이것 저것 틈틈히 짜고 주서 모은걸 필요하게 고친것들입니다.


달력을 만들다 보니, 24절기를 표기하게 되는데, 이건 고정된 날짜 계산법이 없더군요..

이론을 살펴보니 에지간한 학문 분야를 넘어서서..


리눅스 채널에 있는 PHP 소스를 가져다 좀 수정해서 사용했습니다.

원소스 : http://linuxchannel.net/docs/solar-24terms.txt

데   모 : http://linuxchannel.net/gaggle/solar.php


아래글은 원저자분이 리눅스 채널에 올린 내용입니다.

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

안녕하세요?

드디어 완성했습니다.

제가 천문학 전공이 아니라서 상당히 고전했습니다.

(다행히 제가 천문학쪽에 관심이 많아서...^.9)

이 내용은 L-SN 과 phpschool.com 에 동일하게 포스팅합니다. ...


[PHP] class of solar, 24 절기 계산과 태양의 위치


[author]

  - Chilbong Kim, <san2(at)linuxchannel.net>

  - http://linuxchannel.net/


[changes]

  - 2003.09.08 : bug fixed

  - 2003.09.06 : new build

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


날짜의 표기 정확도는 1902 ~ 2037 사이에서 보장해 줍니다.

왜? 이렇게 아래 소스처럼 날짜의 정확도를 구간으로 표기해주냐면.. 계산상의 오차율 땜시 그렇다고

말씀 드리지요.


딸랑 함수 하나이니.. 헤더에 대한 설명은 생략하구요

소스에 대한 설명은 위의 원본을 살펴 보시기 바랍니다.




// http://pds4.devpia.com/MAEUL/top_pds/19000/18356/Solar24Terms.h: interface for the Solar24Terms class.

//

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


#if !defined(AFX_SOLAR24TERMS_H__88D629FD_9FA1_46DC_AD6E_2C429BE09FAC__INCLUDED_)

#define AFX_SOLAR24TERMS_H__88D629FD_9FA1_46DC_AD6E_2C429BE09FAC__INCLUDED_


#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000


// 이 전기 계산은 1902 ~ 2037 년도 범위에서 정확도를 제공합니다.

// 만약 정확한지 검사해보고 싶다면 다음 사이트에서 비교해 보시오.

// http://linuxchannel.net/gaggle/solar.php

// http://user.chollian.net/~kimdbin/re/ki24_150.html


/* Example

    solar24_t* p = const_cast<solar24_t*>(Solar24Terms(2004));


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

    {

        TRACE("(%s[%s])%04d-%02d-%02d %02d:%02d:%02d\n", p[i].h_name, p[i].c_name, p[i].time.tm_year+1900, p[i].time.tm_mon+1, p[i].time.tm_mday, p[i].time.tm_hour, p[i].time.tm_min, p[i].time.tm_sec);

    }

*/


typedef struct

{

    char h_name[5];

    char c_name[5];

    struct tm time;

} solar24_t;


const solar24_t* Solar24Terms(int Year);


#endif // !defined(AFX_SOLAR24TERMS_H__88D629FD_9FA1_46DC_AD6E_2C429BE09FAC__INCLUDED_)




이 글에 평점 주기:  
[코멘트] 좋음 2004-12-21 19:00:00
문채후 (whoom)   문채후님께 메시지 보내기문채후님을 내 주소록에 추가합니다.문채후님의 개인게시판 가기 
와우... 진호님은 참 가정적이시군요 ^^ 가계부 프로그램이라... 진호님때문에 결혼한 프로그래머는 꼭 거쳐가야하는 프로젝트로 정착되는건 아닌지.. ^^ ㅋㅋ
 
[코멘트] 놀람 2004-12-22 09:56:00
권진호 (crowback)   권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 
달력 컨트롤을 좀 제대로 만들어 볼려구 하는데.. 것도 그렇고
왠놈의 가계부에 입력해야하는 내용이 많은지.. 통장관리,신용카드,자동이체관리,입/출금내역관리,주소록관리,기념일관리,각종날짜 및 시간 알람기능... 통계/그래프.. 등등등 -_-; OTL
 
[코멘트] 난감 2004-12-22 20:02:00
황상범 (miniaron)   황상범님께 메시지 보내기황상범님을 내 주소록에 추가합니다.황상범님의 개인게시판 가기 
맞습니다. 우리가 원하던 것이 이것이었습니다. 소스는 도저히 모르겠고, 그냥 수정해서 써야겠습니다. 감사합니다.
 
[코멘트] 좋음 2004-12-27 17:06:00
류석민 (pokev25)   류석민님께 메시지 보내기류석민님을 내 주소록에 추가합니다.류석민님의 개인게시판 가기 
으흐흐..제대로 다 구현하려면 장난아닐텐데요 ㅎㅎ

오픈 소스 프로젝트 함 해보시는건 어떠세요?
 
[코멘트] 시무룩 2004-12-27 18:56:00
권진호 (crowback)   권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 
저 소스도 Chilbong Kim <= 분이 여러가지 레퍼런스로 상당히 고생하셔서 만드셨더군요...
일단 달력 나온거 가지고.. 2003년/2004년/2005년 까지는 비교해봤는데.. 이상 없었습니다.
그 이후는 비교해볼 표준 사이트가 없어서.. 고민입니다.
저는 죽었다 깨도 저거 못만듭니다.. 머리가 나빠서리.. -_-~~~
 
[코멘트] 좋음 2005-10-15 06:49:00
조삼제 (isawara)   조삼제님께 메시지 보내기조삼제님을 내 주소록에 추가합니다.조삼제님의 개인게시판 가기 
올려주신 소스에서 수정되야 할 부분이 있어요..
별거는 아니지만 꼭 바뀌어야 하는 부분이군요~
아래 참고 바랍니다.

if(addttime[i][0] == year && addttime[i][0] == julgi) 여기 부분을
if(addttime[i][0] == year && addttime[i][1] == julgi) 이렇게 고쳐서 사용하셔야 합니다.
알아서들 다 고쳐서 쓰시겠지만, 혹시 잘 집고 넘어가지 않으면, 결과에서 문제가 확실하게
보이지를 않기 때문에 이렇게 글을 남깁니다.

그리고 올려주신 소스 정말 감사하게 잘 살펴 보고 있습니다.
원래 소스에서 필요한 부분만 간단하게 잘 정리하셔서 코딩 하셨네요^^
고맙습니다.!!
 [까막] 완성형 폰트 -> BMP (수정됨)  | VC++ 일반 2005-03-22 오전 10:24:19
까막 (crowback)  까막님께 메시지 보내기까막님을 내 주소록에 추가합니다.까막님의 개인게시판 가기 번호: 18709   / 평점:  (-)  / 읽음:2,741

안냐세염.. 까막임돠..


몇몇분이 계속 요청하셔서 소스를 함께 올립니다.


위 프로그램은 일반 응용프로그래머 라면 별반 필요치 않을 테구요.. 이미지 폰트 작업을 하시거나

LCD 등에 폰트 디스플레이 작업을 하시는 경우 간혹가다 필요할겁니다.


1. 폰트를 LCD등에 사용할 경우, 아래방향으로 (보통 윈도우는 왼쪽에서 오른쪽으로) 저장되는

    C 파일이 생성됩니다.


2. 그 상태를 BMP로 저장해 줍니다.


이렇게 두가지 파일 양식으로 저장해 주구요, 소스 보면 허접하지만, 걍 필요한 내용을 비트맵으로

뿌려서, 필셀 읽어서 바이트 단위로 나눈다음, Hex로 출력 포멧을 만들어 파일에 뿌리는게 다입니다.


비트맵으로 저장하는건 부수적인 것으로 걍 중간 단계를 거치니까 파일로 저장해 본 것 뿐이구요..


옵션에 여백 설정부분은 보통 폰트를 디스플레이 하실때, 반전하시면 왼쪽과 위쪽에는 여백이 없기 땜시

반전하는 부분의 이미지가 깨끗해지지 못하는 부분이 생성됩니다.

이를 위하여 픽셀단위로 여백을 넣을 수 있게 만들어 보았습니다.



소스파일에 대한 개략적인 설멍을 넣어보면, 걍 다이알로그 베이스에 다음과 같은 두개의 주요 파일이 있습니다.

Preview.cpp / BitmapFont.cpp

하나는 미리보기 형식을 지정하는 놈이고, 다른놈은 미리보기 형식에서 픽셀을 읽어 파일로 써주는 놈입니다.

코드 자체는 무자게 짧고 간단하니, 주석은 없습니다 -_-;;;


PS. GetPixel을 써서 픽셀을 읽어오는데 <= 이거 느리다는거 알고 있죠? 비트맵데이터 처리하는게 귀찬기도하고

      이미지데이터 돌리기도 귀찬거니 해서, 사용한겁니다. 쫌 느려도 몇초정도니, 속도에 불만이신 분은

      수정하셔서 올려주셔도 무방합니다. ^^;


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


코멘트를 보구, 프로그램을 수정하였습니다.

제가 쓰는 LCD가 소형이다 보니, 큰 글을 뿌릴일이 없었고, 대형폰트는 고려하지 않고 만들다 보니.. -_-;


비트맵을 생성해 보니, 54*54 를 넘어가는 폰트는 비트맵생성에 실패하는 군요..

대형 폰트를 처리할려면, 전체 비트맵을 만드는 것은, CBitmap로는 불가능하구요..

해당 글짜마다 소형 비트맵을 만들어 합쳐야 할거 같네요.


오른쪽 부분에 '갉' 이라고 보이는건, FNT 파일로 저장된 것을 읽어서 LCD 타입으로 출력한 것입니다.

파일이 정상적으로 저장되면, 크기에 맞는 '갉'이 뿌려지도록 아주 허접한 테스트 코드를 넣어봤습니다.


테스트용으로 만든거라, 많은 신경을 못써서 결국 제한이 가해지는 허접한 샘플이 되고 말았네요.


일단, 올린 자료이니 위의 범주에서 다시 문제가 발생하면, 코멘트 달아주세요.



DWORD Err;

PIP_ADAPTER_INFO pAdapterInfo, pAdapt;

DWORD AdapterInfoSize = 0;

PIP_ADDR_STRING pAddrStr;



//버퍼 사이즈 알아오기

if ((Err = GetAdaptersInfo(NULL, &AdapterInfoSize)) != 0)

if (Err != ERROR_BUFFER_OVERFLOW)

return FALSE;



//버퍼 동적 할당

if ((pAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[AdapterInfoSize]) == NULL)

return FALSE;



//어댑터 정보 얻어오기

if ((Err = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0)

return FALSE;



pAdapt = pAdapterInfo;



int i=0;

while (pAdapt) -->이반복문에서 랜카드 갯수 만큼 루프를 돌면서 주소값을 얻어옵니다.

{

pAddrStr=&(pAdapt->IpAddressList);

g_sClientinternalsockaddr.bySockaddrcount=(i+1);



while(pAddrStr)

{

g_sClientinternalsockaddr.asockaddr[i].sin_addr.S_un.S_addr=inet_addr(pAddrStr->IpAddress.String);

pAddrStr = pAddrStr->Next;

}

pAdapt = pAdapt->Next;

i++;

}

delete pAdapterInfo;

pAdapterInfo=NULL;





혹은





// 로컬 어드레스를 세트한다.

char recvline[300];

gethostname(recvline, 200);



// 이름으로부터 IP를 얻어낸다.

struct hostent *pHostEnt = gethostbyname(recvline);



if (pHostEnt != NULL)

{

localAddress.Format("%u.%u.%u.%u",

0xff & pHostEnt->h_addr_list[0][0],

0xff & pHostEnt->h_addr_list[0][1],

0xff & pHostEnt->h_addr_list[0][2],

0xff & pHostEnt->h_addr_list[0][3]

);

} else

localAddress = _T("");
// 주어진 크기만큼 공백을 삽입한다.

static void Blank(int n)

{

int k = 16-n;

k = k*3 + (n<7?1:0);

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

printf(" ");

}



// 바이너리 데이터를 정규 포멧으로 출력한다.

void PrintBinary(BYTE* buffer, int length)

{

int row = length/16;

int col = length%16;

int i, j;

int prev = 0;

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

{

int end = 16;

if(i == row)

end = col;

else

end = 16;



printf("%06X  ", i*16);



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

{

printf("%02X ", buffer[i*16+j]);

if(j==7)

printf(" ");

}

Blank(end);

printf("    ");

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

{

char ch = buffer[i*16+j];

char ch1 = buffer[i*16+j+1];

if(isprint(ch))

printf("%c", ch);

else

{

if((ch >> 7) & 0x01 == 1 && (ch1 >> 7) & 0x01 == 0 && prev == 0)

{

printf("%c", ch);

prev = 1;

}

else

{

if(prev == 1)

{

printf("%c", ch);

prev = 0;

}

else

printf(".");

}

}



if(j==7)

printf(" ");

}



printf("\n");

}

}



// 바이트 데이터를 이진수 문자열로 출력한다.

void PrintByte(BYTE ch)

{

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

printf("%c", (ch>>(7-i)&0x01)?'1':'0');

+ Recent posts